xref: /petsc/src/mat/impls/dense/seq/dense.c (revision db4efbfdc2bb749ba21a5c202e01785163a71462)
1be1d678aSKris Buschelman #define PETSCMAT_DLL
2be1d678aSKris Buschelman 
367e560aaSBarry Smith /*
467e560aaSBarry Smith      Defines the basic matrix operations for sequential dense.
567e560aaSBarry Smith */
6289bc588SBarry Smith 
770f55243SBarry Smith #include "src/mat/impls/dense/seq/dense.h"
8b4c862e0SSatish Balay #include "petscblaslapack.h"
9289bc588SBarry Smith 
104a2ae208SSatish Balay #undef __FUNCT__
114a2ae208SSatish Balay #define __FUNCT__ "MatAXPY_SeqDense"
12f4df32b1SMatthew Knepley PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str)
131987afe7SBarry Smith {
141987afe7SBarry Smith   Mat_SeqDense   *x = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data;
15f4df32b1SMatthew Knepley   PetscScalar    oalpha = alpha;
1613f74950SBarry Smith   PetscInt       j;
170805154bSBarry Smith   PetscBLASInt   N,m,ldax,lday,one = 1;
18efee365bSSatish Balay   PetscErrorCode ierr;
193a40ed3dSBarry Smith 
203a40ed3dSBarry Smith   PetscFunctionBegin;
21d0f46423SBarry Smith   N    = PetscBLASIntCast(X->rmap->n*X->cmap->n);
22d0f46423SBarry Smith   m    = PetscBLASIntCast(X->rmap->n);
230805154bSBarry Smith   ldax = PetscBLASIntCast(x->lda);
240805154bSBarry Smith   lday = PetscBLASIntCast(y->lda);
25a5ce6ee0Svictorle   if (ldax>m || lday>m) {
26d0f46423SBarry Smith     for (j=0; j<X->cmap->n; j++) {
27f4df32b1SMatthew Knepley       BLASaxpy_(&m,&oalpha,x->v+j*ldax,&one,y->v+j*lday,&one);
28a5ce6ee0Svictorle     }
29a5ce6ee0Svictorle   } else {
30f4df32b1SMatthew Knepley     BLASaxpy_(&N,&oalpha,x->v,&one,y->v,&one);
31a5ce6ee0Svictorle   }
32efee365bSSatish Balay   ierr = PetscLogFlops(2*N-1);CHKERRQ(ierr);
333a40ed3dSBarry Smith   PetscFunctionReturn(0);
341987afe7SBarry Smith }
351987afe7SBarry Smith 
364a2ae208SSatish Balay #undef __FUNCT__
374a2ae208SSatish Balay #define __FUNCT__ "MatGetInfo_SeqDense"
38dfbe8321SBarry Smith PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info)
39289bc588SBarry Smith {
40d0f46423SBarry Smith   PetscInt     N = A->rmap->n*A->cmap->n;
413a40ed3dSBarry Smith 
423a40ed3dSBarry Smith   PetscFunctionBegin;
43d0f46423SBarry Smith   info->rows_global       = (double)A->rmap->n;
44d0f46423SBarry Smith   info->columns_global    = (double)A->cmap->n;
45d0f46423SBarry Smith   info->rows_local        = (double)A->rmap->n;
46d0f46423SBarry Smith   info->columns_local     = (double)A->cmap->n;
474e220ebcSLois Curfman McInnes   info->block_size        = 1.0;
484e220ebcSLois Curfman McInnes   info->nz_allocated      = (double)N;
496de62eeeSBarry Smith   info->nz_used           = (double)N;
506de62eeeSBarry Smith   info->nz_unneeded       = (double)0;
514e220ebcSLois Curfman McInnes   info->assemblies        = (double)A->num_ass;
524e220ebcSLois Curfman McInnes   info->mallocs           = 0;
537adad957SLisandro Dalcin   info->memory            = ((PetscObject)A)->mem;
544e220ebcSLois Curfman McInnes   info->fill_ratio_given  = 0;
554e220ebcSLois Curfman McInnes   info->fill_ratio_needed = 0;
564e220ebcSLois Curfman McInnes   info->factor_mallocs    = 0;
573a40ed3dSBarry Smith   PetscFunctionReturn(0);
58289bc588SBarry Smith }
59289bc588SBarry Smith 
604a2ae208SSatish Balay #undef __FUNCT__
614a2ae208SSatish Balay #define __FUNCT__ "MatScale_SeqDense"
62f4df32b1SMatthew Knepley PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha)
6380cd9d93SLois Curfman McInnes {
64273d9f13SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
65f4df32b1SMatthew Knepley   PetscScalar    oalpha = alpha;
66efee365bSSatish Balay   PetscErrorCode ierr;
670805154bSBarry Smith   PetscBLASInt   one = 1,j,nz,lda = PetscBLASIntCast(a->lda);
6880cd9d93SLois Curfman McInnes 
693a40ed3dSBarry Smith   PetscFunctionBegin;
70d0f46423SBarry Smith   if (lda>A->rmap->n) {
71d0f46423SBarry Smith     nz = PetscBLASIntCast(A->rmap->n);
72d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
73f4df32b1SMatthew Knepley       BLASscal_(&nz,&oalpha,a->v+j*lda,&one);
74a5ce6ee0Svictorle     }
75a5ce6ee0Svictorle   } else {
76d0f46423SBarry Smith     nz = PetscBLASIntCast(A->rmap->n*A->cmap->n);
77f4df32b1SMatthew Knepley     BLASscal_(&nz,&oalpha,a->v,&one);
78a5ce6ee0Svictorle   }
79efee365bSSatish Balay   ierr = PetscLogFlops(nz);CHKERRQ(ierr);
803a40ed3dSBarry Smith   PetscFunctionReturn(0);
8180cd9d93SLois Curfman McInnes }
8280cd9d93SLois Curfman McInnes 
831cbb95d3SBarry Smith #undef __FUNCT__
841cbb95d3SBarry Smith #define __FUNCT__ "MatIsHermitian_SeqDense"
851cbb95d3SBarry Smith PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscTruth *fl)
861cbb95d3SBarry Smith {
871cbb95d3SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
88d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,N;
891cbb95d3SBarry Smith   PetscScalar    *v = a->v;
901cbb95d3SBarry Smith 
911cbb95d3SBarry Smith   PetscFunctionBegin;
921cbb95d3SBarry Smith   *fl = PETSC_FALSE;
93d0f46423SBarry Smith   if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0);
941cbb95d3SBarry Smith   N = a->lda;
951cbb95d3SBarry Smith 
961cbb95d3SBarry Smith   for (i=0; i<m; i++) {
971cbb95d3SBarry Smith     for (j=i+1; j<m; j++) {
981cbb95d3SBarry Smith       if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) PetscFunctionReturn(0);
991cbb95d3SBarry Smith     }
1001cbb95d3SBarry Smith   }
1011cbb95d3SBarry Smith   *fl = PETSC_TRUE;
1021cbb95d3SBarry Smith   PetscFunctionReturn(0);
1031cbb95d3SBarry Smith }
1041cbb95d3SBarry Smith 
1056ee01492SSatish Balay 
106b24902e0SBarry Smith 
107b24902e0SBarry Smith #undef __FUNCT__
108b24902e0SBarry Smith #define __FUNCT__ "MatDuplicateNoCreate_SeqDense"
109b24902e0SBarry Smith PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat)
110b24902e0SBarry Smith {
111b24902e0SBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data,*l;
112b24902e0SBarry Smith   PetscErrorCode ierr;
113b24902e0SBarry Smith   PetscInt       lda = (PetscInt)mat->lda,j,m;
114b24902e0SBarry Smith   Mat            newi = *newmat;
115b24902e0SBarry Smith 
116b24902e0SBarry Smith   PetscFunctionBegin;
1175c9eb25fSBarry Smith   ierr = MatSeqDenseSetPreallocation(*newmat,PETSC_NULL);CHKERRQ(ierr);
118b24902e0SBarry Smith   if (cpvalues == MAT_COPY_VALUES) {
119b24902e0SBarry Smith     l = (Mat_SeqDense*)newi->data;
120d0f46423SBarry Smith     if (lda>A->rmap->n) {
121d0f46423SBarry Smith       m = A->rmap->n;
122d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
123b24902e0SBarry Smith 	ierr = PetscMemcpy(l->v+j*m,mat->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
124b24902e0SBarry Smith       }
125b24902e0SBarry Smith     } else {
126d0f46423SBarry Smith       ierr = PetscMemcpy(l->v,mat->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
127b24902e0SBarry Smith     }
128b24902e0SBarry Smith   }
129b24902e0SBarry Smith   newi->assembled = PETSC_TRUE;
130b24902e0SBarry Smith   PetscFunctionReturn(0);
131b24902e0SBarry Smith }
132b24902e0SBarry Smith 
1334a2ae208SSatish Balay #undef __FUNCT__
1344a2ae208SSatish Balay #define __FUNCT__ "MatDuplicate_SeqDense"
135dfbe8321SBarry Smith PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat)
13602cad45dSBarry Smith {
1376849ba73SBarry Smith   PetscErrorCode ierr;
13802cad45dSBarry Smith 
1393a40ed3dSBarry Smith   PetscFunctionBegin;
1405c9eb25fSBarry Smith   ierr = MatCreate(((PetscObject)A)->comm,newmat);CHKERRQ(ierr);
141d0f46423SBarry Smith   ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
1425c9eb25fSBarry Smith   ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
143b24902e0SBarry Smith   ierr = MatDuplicateNoCreate_SeqDense(A,cpvalues,newmat);CHKERRQ(ierr);
144b24902e0SBarry Smith   PetscFunctionReturn(0);
145b24902e0SBarry Smith }
146b24902e0SBarry Smith 
1476ee01492SSatish Balay 
1484a2ae208SSatish Balay #undef __FUNCT__
1494a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorNumeric_SeqDense"
150af281ebdSHong Zhang PetscErrorCode MatLUFactorNumeric_SeqDense(Mat A,MatFactorInfo *info_dummy,Mat *fact)
151289bc588SBarry Smith {
15202cad45dSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data,*l = (Mat_SeqDense*)(*fact)->data;
1536849ba73SBarry Smith   PetscErrorCode ierr;
154d0f46423SBarry Smith   PetscInt       lda1=mat->lda,lda2=l->lda, m=A->rmap->n,n=A->cmap->n, j;
1554482741eSBarry Smith   MatFactorInfo  info;
1563a40ed3dSBarry Smith 
1573a40ed3dSBarry Smith   PetscFunctionBegin;
15802cad45dSBarry Smith   /* copy the numerical values */
1591b807ce4Svictorle   if (lda1>m || lda2>m ) {
1601b807ce4Svictorle     for (j=0; j<n; j++) {
1611b807ce4Svictorle       ierr = PetscMemcpy(l->v+j*lda2,mat->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr);
1621b807ce4Svictorle     }
1631b807ce4Svictorle   } else {
164d0f46423SBarry Smith     ierr = PetscMemcpy(l->v,mat->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1651b807ce4Svictorle   }
1669f4db6b0SBarry Smith   (*fact)->factor = MAT_FACTOR_NONE;
1674482741eSBarry Smith   ierr = MatLUFactor(*fact,0,0,&info);CHKERRQ(ierr);
1683a40ed3dSBarry Smith   PetscFunctionReturn(0);
169289bc588SBarry Smith }
1706ee01492SSatish Balay 
1710b4b3355SBarry Smith 
1720b4b3355SBarry Smith #undef __FUNCT__
1734a2ae208SSatish Balay #define __FUNCT__ "MatSolve_SeqDense"
174dfbe8321SBarry Smith PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy)
175289bc588SBarry Smith {
176c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
1776849ba73SBarry Smith   PetscErrorCode ierr;
17887828ca2SBarry Smith   PetscScalar    *x,*y;
179d0f46423SBarry Smith   PetscBLASInt   one = 1,info,m = PetscBLASIntCast(A->rmap->n);
18067e560aaSBarry Smith 
1813a40ed3dSBarry Smith   PetscFunctionBegin;
1821ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
1831ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
184d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1855c9eb25fSBarry Smith   if (A->factor == MAT_FACTOR_LU) {
186ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
18780444007SBarry Smith     SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
188ae7cfcebSSatish Balay #else
18971044d3cSBarry Smith     LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info);
1904ce68768SBarry Smith     if (info) SETERRQ(PETSC_ERR_LIB,"GETRS - Bad solve");
191ae7cfcebSSatish Balay #endif
1925c9eb25fSBarry Smith   } else if (A->factor == MAT_FACTOR_CHOLESKY){
193ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
19480444007SBarry Smith     SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
195ae7cfcebSSatish Balay #else
19671044d3cSBarry Smith     LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info);
1974ce68768SBarry Smith     if (info) SETERRQ(PETSC_ERR_LIB,"POTRS Bad solve");
198ae7cfcebSSatish Balay #endif
199289bc588SBarry Smith   }
20029bbc08cSBarry Smith   else SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
2011ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
2021ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
203d0f46423SBarry Smith   ierr = PetscLogFlops(2*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
2043a40ed3dSBarry Smith   PetscFunctionReturn(0);
205289bc588SBarry Smith }
2066ee01492SSatish Balay 
2074a2ae208SSatish Balay #undef __FUNCT__
2084a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense"
209dfbe8321SBarry Smith PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy)
210da3a660dSBarry Smith {
211c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
212dfbe8321SBarry Smith   PetscErrorCode ierr;
21387828ca2SBarry Smith   PetscScalar    *x,*y;
214d0f46423SBarry Smith   PetscBLASInt   one = 1,info,m = PetscBLASIntCast(A->rmap->n);
21567e560aaSBarry Smith 
2163a40ed3dSBarry Smith   PetscFunctionBegin;
2171ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
2181ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
219d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
220752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
221da3a660dSBarry Smith   if (mat->pivots) {
222ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
22380444007SBarry Smith     SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
224ae7cfcebSSatish Balay #else
22571044d3cSBarry Smith     LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info);
2264ce68768SBarry Smith     if (info) SETERRQ(PETSC_ERR_LIB,"POTRS - Bad solve");
227ae7cfcebSSatish Balay #endif
2287a97a34bSBarry Smith   } else {
229ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
23080444007SBarry Smith     SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
231ae7cfcebSSatish Balay #else
23271044d3cSBarry Smith     LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info);
2334ce68768SBarry Smith     if (info) SETERRQ(PETSC_ERR_LIB,"POTRS - Bad solve");
234ae7cfcebSSatish Balay #endif
235da3a660dSBarry Smith   }
2361ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
2371ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
238d0f46423SBarry Smith   ierr = PetscLogFlops(2*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
2393a40ed3dSBarry Smith   PetscFunctionReturn(0);
240da3a660dSBarry Smith }
2416ee01492SSatish Balay 
2424a2ae208SSatish Balay #undef __FUNCT__
2434a2ae208SSatish Balay #define __FUNCT__ "MatSolveAdd_SeqDense"
244dfbe8321SBarry Smith PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
245da3a660dSBarry Smith {
246c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
247dfbe8321SBarry Smith   PetscErrorCode ierr;
24887828ca2SBarry Smith   PetscScalar    *x,*y,sone = 1.0;
249da3a660dSBarry Smith   Vec            tmp = 0;
250d0f46423SBarry Smith   PetscBLASInt   one = 1,info,m = PetscBLASIntCast(A->rmap->n);
25167e560aaSBarry Smith 
2523a40ed3dSBarry Smith   PetscFunctionBegin;
2531ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
2541ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
255d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
256da3a660dSBarry Smith   if (yy == zz) {
25778b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
25852e6d16bSBarry Smith     ierr = PetscLogObjectParent(A,tmp);CHKERRQ(ierr);
25978b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
260da3a660dSBarry Smith   }
261d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
262752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
263da3a660dSBarry Smith   if (mat->pivots) {
264ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
26580444007SBarry Smith     SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
266ae7cfcebSSatish Balay #else
26771044d3cSBarry Smith     LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info);
2682ffef20aSBarry Smith     if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve");
269ae7cfcebSSatish Balay #endif
270a8c6a408SBarry Smith   } else {
271ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
27280444007SBarry Smith     SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
273ae7cfcebSSatish Balay #else
27471044d3cSBarry Smith     LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info);
2752ffef20aSBarry Smith     if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve");
276ae7cfcebSSatish Balay #endif
277da3a660dSBarry Smith   }
2782dcb1b2aSMatthew Knepley   if (tmp) {ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); ierr = VecDestroy(tmp);CHKERRQ(ierr);}
2792dcb1b2aSMatthew Knepley   else     {ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);}
2801ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
2811ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
282d0f46423SBarry Smith   ierr = PetscLogFlops(2*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
2833a40ed3dSBarry Smith   PetscFunctionReturn(0);
284da3a660dSBarry Smith }
28567e560aaSBarry Smith 
2864a2ae208SSatish Balay #undef __FUNCT__
2874a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense"
288dfbe8321SBarry Smith PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
289da3a660dSBarry Smith {
290c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
2916849ba73SBarry Smith   PetscErrorCode ierr;
29287828ca2SBarry Smith   PetscScalar    *x,*y,sone = 1.0;
293da3a660dSBarry Smith   Vec            tmp;
294d0f46423SBarry Smith   PetscBLASInt   one = 1,info,m = PetscBLASIntCast(A->rmap->n);
29567e560aaSBarry Smith 
2963a40ed3dSBarry Smith   PetscFunctionBegin;
297d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
2981ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
2991ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
300da3a660dSBarry Smith   if (yy == zz) {
30178b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
30252e6d16bSBarry Smith     ierr = PetscLogObjectParent(A,tmp);CHKERRQ(ierr);
30378b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
304da3a660dSBarry Smith   }
305d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
306752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
307da3a660dSBarry Smith   if (mat->pivots) {
308ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
30980444007SBarry Smith     SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
310ae7cfcebSSatish Balay #else
31171044d3cSBarry Smith     LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info);
3122ffef20aSBarry Smith     if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve");
313ae7cfcebSSatish Balay #endif
3143a40ed3dSBarry Smith   } else {
315ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
31680444007SBarry Smith     SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
317ae7cfcebSSatish Balay #else
31871044d3cSBarry Smith     LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info);
3192ffef20aSBarry Smith     if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve");
320ae7cfcebSSatish Balay #endif
321da3a660dSBarry Smith   }
32290f02eecSBarry Smith   if (tmp) {
3232dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr);
32490f02eecSBarry Smith     ierr = VecDestroy(tmp);CHKERRQ(ierr);
3253a40ed3dSBarry Smith   } else {
3262dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);
32790f02eecSBarry Smith   }
3281ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
3291ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
330d0f46423SBarry Smith   ierr = PetscLogFlops(2*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
3313a40ed3dSBarry Smith   PetscFunctionReturn(0);
332da3a660dSBarry Smith }
333*db4efbfdSBarry Smith 
334*db4efbfdSBarry Smith /* ---------------------------------------------------------------*/
335*db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots,
336*db4efbfdSBarry Smith    rather than put it in the Mat->row slot.*/
337*db4efbfdSBarry Smith #undef __FUNCT__
338*db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactor_SeqDense"
339*db4efbfdSBarry Smith PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,MatFactorInfo *minfo)
340*db4efbfdSBarry Smith {
341*db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF)
342*db4efbfdSBarry Smith   PetscFunctionBegin;
343*db4efbfdSBarry Smith   SETERRQ(PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable.");
344*db4efbfdSBarry Smith #else
345*db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
346*db4efbfdSBarry Smith   PetscErrorCode ierr;
347*db4efbfdSBarry Smith   PetscBLASInt   n,m,info;
348*db4efbfdSBarry Smith 
349*db4efbfdSBarry Smith   PetscFunctionBegin;
350*db4efbfdSBarry Smith   n = PetscBLASIntCast(A->cmap->n);
351*db4efbfdSBarry Smith   m = PetscBLASIntCast(A->rmap->n);
352*db4efbfdSBarry Smith   if (!mat->pivots) {
353*db4efbfdSBarry Smith     ierr = PetscMalloc((A->rmap->n+1)*sizeof(PetscBLASInt),&mat->pivots);CHKERRQ(ierr);
354*db4efbfdSBarry Smith     ierr = PetscLogObjectMemory(A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr);
355*db4efbfdSBarry Smith   }
356*db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
357*db4efbfdSBarry Smith   LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info);
358*db4efbfdSBarry Smith   if (info<0) SETERRQ(PETSC_ERR_LIB,"Bad argument to LU factorization");
359*db4efbfdSBarry Smith   if (info>0) SETERRQ(PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization");
360*db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
361*db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
362*db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
363*db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
364*db4efbfdSBarry Smith   A->factor = MAT_FACTOR_LU;
365*db4efbfdSBarry Smith 
366*db4efbfdSBarry Smith   ierr = PetscLogFlops((2*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr);
367*db4efbfdSBarry Smith #endif
368*db4efbfdSBarry Smith   PetscFunctionReturn(0);
369*db4efbfdSBarry Smith }
370*db4efbfdSBarry Smith 
371*db4efbfdSBarry Smith #undef __FUNCT__
372*db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactor_SeqDense"
373*db4efbfdSBarry Smith PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,MatFactorInfo *factinfo)
374*db4efbfdSBarry Smith {
375*db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF)
376*db4efbfdSBarry Smith   PetscFunctionBegin;
377*db4efbfdSBarry Smith   SETERRQ(PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable.");
378*db4efbfdSBarry Smith #else
379*db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
380*db4efbfdSBarry Smith   PetscErrorCode ierr;
381*db4efbfdSBarry Smith   PetscBLASInt   info,n = PetscBLASIntCast(A->cmap->n);
382*db4efbfdSBarry Smith 
383*db4efbfdSBarry Smith   PetscFunctionBegin;
384*db4efbfdSBarry Smith   ierr = PetscFree(mat->pivots);CHKERRQ(ierr);
385*db4efbfdSBarry Smith   mat->pivots = 0;
386*db4efbfdSBarry Smith 
387*db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
388*db4efbfdSBarry Smith   LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info);
389*db4efbfdSBarry Smith   if (info) SETERRQ1(PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1);
390*db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
391*db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
392*db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
393*db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
394*db4efbfdSBarry Smith   A->factor = MAT_FACTOR_CHOLESKY;
395*db4efbfdSBarry Smith   ierr = PetscLogFlops((A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr);
396*db4efbfdSBarry Smith #endif
397*db4efbfdSBarry Smith   PetscFunctionReturn(0);
398*db4efbfdSBarry Smith }
399*db4efbfdSBarry Smith 
400*db4efbfdSBarry Smith 
401*db4efbfdSBarry Smith #undef __FUNCT__
402*db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense"
403*db4efbfdSBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat A,MatFactorInfo *info_dummy,Mat *fact)
404*db4efbfdSBarry Smith {
405*db4efbfdSBarry Smith   PetscErrorCode ierr;
406*db4efbfdSBarry Smith   MatFactorInfo  info;
407*db4efbfdSBarry Smith 
408*db4efbfdSBarry Smith   PetscFunctionBegin;
409*db4efbfdSBarry Smith   info.fill = 1.0;
410*db4efbfdSBarry Smith   ierr = MatCholeskyFactor_SeqDense(*fact,0,&info);CHKERRQ(ierr);
411*db4efbfdSBarry Smith   PetscFunctionReturn(0);
412*db4efbfdSBarry Smith }
413*db4efbfdSBarry Smith 
414*db4efbfdSBarry Smith #undef __FUNCT__
415*db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense"
416*db4efbfdSBarry Smith PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat A,IS row,MatFactorInfo *info,Mat *fact)
417*db4efbfdSBarry Smith {
418*db4efbfdSBarry Smith   PetscErrorCode ierr;
419*db4efbfdSBarry Smith 
420*db4efbfdSBarry Smith   PetscFunctionBegin;
421*db4efbfdSBarry Smith   ierr = MatDuplicateNoCreate_SeqDense(A,MAT_COPY_VALUES,fact);CHKERRQ(ierr);
422*db4efbfdSBarry Smith   (*fact)->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense;
423*db4efbfdSBarry Smith   (*fact)->ops->solve                 = MatSolve_SeqDense;
424*db4efbfdSBarry Smith   (*fact)->ops->solvetranspose        = MatSolveTranspose_SeqDense;
425*db4efbfdSBarry Smith   (*fact)->ops->solveadd              = MatSolveAdd_SeqDense;
426*db4efbfdSBarry Smith   (*fact)->ops->solvetransposeadd     = MatSolveTransposeAdd_SeqDense;
427*db4efbfdSBarry Smith   PetscFunctionReturn(0);
428*db4efbfdSBarry Smith }
429*db4efbfdSBarry Smith 
430*db4efbfdSBarry Smith #undef __FUNCT__
431*db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactorSymbolic_SeqDense"
432*db4efbfdSBarry Smith PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat A,IS row,IS col,MatFactorInfo *info,Mat *fact)
433*db4efbfdSBarry Smith {
434*db4efbfdSBarry Smith   PetscErrorCode ierr;
435*db4efbfdSBarry Smith 
436*db4efbfdSBarry Smith   PetscFunctionBegin;
437*db4efbfdSBarry Smith   ierr = MatDuplicateNoCreate_SeqDense(A,MAT_DO_NOT_COPY_VALUES,fact);CHKERRQ(ierr);
438*db4efbfdSBarry Smith   (*fact)->ops->lufactornumeric   = MatLUFactorNumeric_SeqDense;
439*db4efbfdSBarry Smith   (*fact)->ops->solve             = MatSolve_SeqDense;
440*db4efbfdSBarry Smith   (*fact)->ops->solvetranspose    = MatSolveTranspose_SeqDense;
441*db4efbfdSBarry Smith   (*fact)->ops->solveadd          = MatSolveAdd_SeqDense;
442*db4efbfdSBarry Smith   (*fact)->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
443*db4efbfdSBarry Smith   PetscFunctionReturn(0);
444*db4efbfdSBarry Smith }
445*db4efbfdSBarry Smith 
446*db4efbfdSBarry Smith #undef __FUNCT__
447*db4efbfdSBarry Smith #define __FUNCT__ "MatGetFactor_seqdense_petsc"
448*db4efbfdSBarry Smith PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact)
449*db4efbfdSBarry Smith {
450*db4efbfdSBarry Smith   PetscErrorCode ierr;
451*db4efbfdSBarry Smith 
452*db4efbfdSBarry Smith   PetscFunctionBegin;
453*db4efbfdSBarry Smith   ierr = MatCreate(((PetscObject)A)->comm,fact);CHKERRQ(ierr);
454*db4efbfdSBarry Smith   ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
455*db4efbfdSBarry Smith   ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr);
456*db4efbfdSBarry Smith   if (ftype == MAT_FACTOR_LU){
457*db4efbfdSBarry Smith     (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense;
458*db4efbfdSBarry Smith   } else {
459*db4efbfdSBarry Smith     (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense;
460*db4efbfdSBarry Smith   }
461*db4efbfdSBarry Smith   (*fact)->factor = ftype;
462*db4efbfdSBarry Smith   PetscFunctionReturn(0);
463*db4efbfdSBarry Smith }
464*db4efbfdSBarry Smith 
465289bc588SBarry Smith /* ------------------------------------------------------------------*/
4664a2ae208SSatish Balay #undef __FUNCT__
4674a2ae208SSatish Balay #define __FUNCT__ "MatRelax_SeqDense"
46813f74950SBarry Smith PetscErrorCode MatRelax_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx)
469289bc588SBarry Smith {
470c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
47187828ca2SBarry Smith   PetscScalar    *x,*b,*v = mat->v,zero = 0.0,xt;
472dfbe8321SBarry Smith   PetscErrorCode ierr;
473d0f46423SBarry Smith   PetscInt       m = A->rmap->n,i;
474aa482453SBarry Smith #if !defined(PETSC_USE_COMPLEX)
4750805154bSBarry Smith   PetscBLASInt   o = 1,bm = PetscBLASIntCast(m);
476bc1b551cSSatish Balay #endif
477289bc588SBarry Smith 
4783a40ed3dSBarry Smith   PetscFunctionBegin;
479289bc588SBarry Smith   if (flag & SOR_ZERO_INITIAL_GUESS) {
48071044d3cSBarry Smith     /* this is a hack fix, should have another version without the second BLASdot */
4812dcb1b2aSMatthew Knepley     ierr = VecSet(xx,zero);CHKERRQ(ierr);
482289bc588SBarry Smith   }
4831ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
4841ebc52fbSHong Zhang   ierr = VecGetArray(bb,&b);CHKERRQ(ierr);
485b965ef7fSBarry Smith   its  = its*lits;
48677431f27SBarry Smith   if (its <= 0) SETERRQ2(PETSC_ERR_ARG_WRONG,"Relaxation requires global its %D and local its %D both positive",its,lits);
487289bc588SBarry Smith   while (its--) {
488fccaa45eSBarry Smith     if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP){
489289bc588SBarry Smith       for (i=0; i<m; i++) {
490aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
491f1747703SBarry Smith         /* cannot use BLAS dot for complex because compiler/linker is
492f1747703SBarry Smith            not happy about returning a double complex */
49313f74950SBarry Smith         PetscInt    _i;
49487828ca2SBarry Smith         PetscScalar sum = b[i];
495f1747703SBarry Smith         for (_i=0; _i<m; _i++) {
4963f6de6efSSatish Balay           sum -= PetscConj(v[i+_i*m])*x[_i];
497f1747703SBarry Smith         }
498f1747703SBarry Smith         xt = sum;
499f1747703SBarry Smith #else
50071044d3cSBarry Smith         xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o);
501f1747703SBarry Smith #endif
50255a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
503289bc588SBarry Smith       }
504289bc588SBarry Smith     }
505fccaa45eSBarry Smith     if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP){
506289bc588SBarry Smith       for (i=m-1; i>=0; i--) {
507aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
508f1747703SBarry Smith         /* cannot use BLAS dot for complex because compiler/linker is
509f1747703SBarry Smith            not happy about returning a double complex */
51013f74950SBarry Smith         PetscInt    _i;
51187828ca2SBarry Smith         PetscScalar sum = b[i];
512f1747703SBarry Smith         for (_i=0; _i<m; _i++) {
5133f6de6efSSatish Balay           sum -= PetscConj(v[i+_i*m])*x[_i];
514f1747703SBarry Smith         }
515f1747703SBarry Smith         xt = sum;
516f1747703SBarry Smith #else
51771044d3cSBarry Smith         xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o);
518f1747703SBarry Smith #endif
51955a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
520289bc588SBarry Smith       }
521289bc588SBarry Smith     }
522289bc588SBarry Smith   }
5231ebc52fbSHong Zhang   ierr = VecRestoreArray(bb,&b);CHKERRQ(ierr);
5241ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
5253a40ed3dSBarry Smith   PetscFunctionReturn(0);
526289bc588SBarry Smith }
527289bc588SBarry Smith 
528289bc588SBarry Smith /* -----------------------------------------------------------------*/
5294a2ae208SSatish Balay #undef __FUNCT__
5304a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense"
531dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy)
532289bc588SBarry Smith {
533c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
53487828ca2SBarry Smith   PetscScalar    *v = mat->v,*x,*y;
535dfbe8321SBarry Smith   PetscErrorCode ierr;
5360805154bSBarry Smith   PetscBLASInt   m, n,_One=1;
537ea709b57SSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
5383a40ed3dSBarry Smith 
5393a40ed3dSBarry Smith   PetscFunctionBegin;
540d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
541d0f46423SBarry Smith   n = PetscBLASIntCast(A->cmap->n);
542d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
5431ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
5441ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
54571044d3cSBarry Smith   BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One);
5461ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
5471ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
548d0f46423SBarry Smith   ierr = PetscLogFlops(2*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
5493a40ed3dSBarry Smith   PetscFunctionReturn(0);
550289bc588SBarry Smith }
5516ee01492SSatish Balay 
5524a2ae208SSatish Balay #undef __FUNCT__
5534a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense"
554dfbe8321SBarry Smith PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy)
555289bc588SBarry Smith {
556c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
55787828ca2SBarry Smith   PetscScalar    *v = mat->v,*x,*y,_DOne=1.0,_DZero=0.0;
558dfbe8321SBarry Smith   PetscErrorCode ierr;
5590805154bSBarry Smith   PetscBLASInt   m, n, _One=1;
5603a40ed3dSBarry Smith 
5613a40ed3dSBarry Smith   PetscFunctionBegin;
562d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
563d0f46423SBarry Smith   n = PetscBLASIntCast(A->cmap->n);
564d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
5651ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
5661ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
56771044d3cSBarry Smith   BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One);
5681ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
5691ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
570d0f46423SBarry Smith   ierr = PetscLogFlops(2*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr);
5713a40ed3dSBarry Smith   PetscFunctionReturn(0);
572289bc588SBarry Smith }
5736ee01492SSatish Balay 
5744a2ae208SSatish Balay #undef __FUNCT__
5754a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense"
576dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
577289bc588SBarry Smith {
578c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
57987828ca2SBarry Smith   PetscScalar    *v = mat->v,*x,*y,_DOne=1.0;
580dfbe8321SBarry Smith   PetscErrorCode ierr;
5810805154bSBarry Smith   PetscBLASInt   m, n, _One=1;
5823a40ed3dSBarry Smith 
5833a40ed3dSBarry Smith   PetscFunctionBegin;
584d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
585d0f46423SBarry Smith   n = PetscBLASIntCast(A->cmap->n);
586d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
587600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
5881ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
5891ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
59071044d3cSBarry Smith   BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One);
5911ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
5921ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
593d0f46423SBarry Smith   ierr = PetscLogFlops(2*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
5943a40ed3dSBarry Smith   PetscFunctionReturn(0);
595289bc588SBarry Smith }
5966ee01492SSatish Balay 
5974a2ae208SSatish Balay #undef __FUNCT__
5984a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense"
599dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
600289bc588SBarry Smith {
601c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
60287828ca2SBarry Smith   PetscScalar    *v = mat->v,*x,*y;
603dfbe8321SBarry Smith   PetscErrorCode ierr;
6040805154bSBarry Smith   PetscBLASInt   m, n, _One=1;
60587828ca2SBarry Smith   PetscScalar    _DOne=1.0;
6063a40ed3dSBarry Smith 
6073a40ed3dSBarry Smith   PetscFunctionBegin;
608d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
609d0f46423SBarry Smith   n = PetscBLASIntCast(A->cmap->n);
610d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
611600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
6121ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
6131ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
61471044d3cSBarry Smith   BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One);
6151ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6161ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
617d0f46423SBarry Smith   ierr = PetscLogFlops(2*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
6183a40ed3dSBarry Smith   PetscFunctionReturn(0);
619289bc588SBarry Smith }
620289bc588SBarry Smith 
621289bc588SBarry Smith /* -----------------------------------------------------------------*/
6224a2ae208SSatish Balay #undef __FUNCT__
6234a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense"
62413f74950SBarry Smith PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
625289bc588SBarry Smith {
626c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
62787828ca2SBarry Smith   PetscScalar    *v;
6286849ba73SBarry Smith   PetscErrorCode ierr;
62913f74950SBarry Smith   PetscInt       i;
63067e560aaSBarry Smith 
6313a40ed3dSBarry Smith   PetscFunctionBegin;
632d0f46423SBarry Smith   *ncols = A->cmap->n;
633289bc588SBarry Smith   if (cols) {
634d0f46423SBarry Smith     ierr = PetscMalloc((A->cmap->n+1)*sizeof(PetscInt),cols);CHKERRQ(ierr);
635d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) (*cols)[i] = i;
636289bc588SBarry Smith   }
637289bc588SBarry Smith   if (vals) {
638d0f46423SBarry Smith     ierr = PetscMalloc((A->cmap->n+1)*sizeof(PetscScalar),vals);CHKERRQ(ierr);
639289bc588SBarry Smith     v    = mat->v + row;
640d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;}
641289bc588SBarry Smith   }
6423a40ed3dSBarry Smith   PetscFunctionReturn(0);
643289bc588SBarry Smith }
6446ee01492SSatish Balay 
6454a2ae208SSatish Balay #undef __FUNCT__
6464a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense"
64713f74950SBarry Smith PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
648289bc588SBarry Smith {
649dfbe8321SBarry Smith   PetscErrorCode ierr;
650606d414cSSatish Balay   PetscFunctionBegin;
651606d414cSSatish Balay   if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);}
652606d414cSSatish Balay   if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); }
6533a40ed3dSBarry Smith   PetscFunctionReturn(0);
654289bc588SBarry Smith }
655289bc588SBarry Smith /* ----------------------------------------------------------------*/
6564a2ae208SSatish Balay #undef __FUNCT__
6574a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense"
65813f74950SBarry Smith PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv)
659289bc588SBarry Smith {
660c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
66113f74950SBarry Smith   PetscInt     i,j,idx=0;
662d6dfbf8fSBarry Smith 
6633a40ed3dSBarry Smith   PetscFunctionBegin;
664289bc588SBarry Smith   if (!mat->roworiented) {
665dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
666289bc588SBarry Smith       for (j=0; j<n; j++) {
667cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
6682515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
669d0f46423SBarry Smith         if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1);
67058804f6dSBarry Smith #endif
671289bc588SBarry Smith         for (i=0; i<m; i++) {
672cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
6732515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
674d0f46423SBarry Smith           if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
67558804f6dSBarry Smith #endif
676cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
677289bc588SBarry Smith         }
678289bc588SBarry Smith       }
6793a40ed3dSBarry Smith     } else {
680289bc588SBarry Smith       for (j=0; j<n; j++) {
681cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
6822515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
683d0f46423SBarry Smith         if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1);
68458804f6dSBarry Smith #endif
685289bc588SBarry Smith         for (i=0; i<m; i++) {
686cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
6872515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
688d0f46423SBarry Smith           if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
68958804f6dSBarry Smith #endif
690cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
691289bc588SBarry Smith         }
692289bc588SBarry Smith       }
693289bc588SBarry Smith     }
6943a40ed3dSBarry Smith   } else {
695dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
696e8d4e0b9SBarry Smith       for (i=0; i<m; i++) {
697cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
6982515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
699d0f46423SBarry Smith         if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
70058804f6dSBarry Smith #endif
701e8d4e0b9SBarry Smith         for (j=0; j<n; j++) {
702cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
7032515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
704d0f46423SBarry Smith           if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1);
70558804f6dSBarry Smith #endif
706cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
707e8d4e0b9SBarry Smith         }
708e8d4e0b9SBarry Smith       }
7093a40ed3dSBarry Smith     } else {
710289bc588SBarry Smith       for (i=0; i<m; i++) {
711cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
7122515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
713d0f46423SBarry Smith         if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
71458804f6dSBarry Smith #endif
715289bc588SBarry Smith         for (j=0; j<n; j++) {
716cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
7172515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
718d0f46423SBarry Smith           if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1);
71958804f6dSBarry Smith #endif
720cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
721289bc588SBarry Smith         }
722289bc588SBarry Smith       }
723289bc588SBarry Smith     }
724e8d4e0b9SBarry Smith   }
7253a40ed3dSBarry Smith   PetscFunctionReturn(0);
726289bc588SBarry Smith }
727e8d4e0b9SBarry Smith 
7284a2ae208SSatish Balay #undef __FUNCT__
7294a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense"
73013f74950SBarry Smith PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[])
731ae80bb75SLois Curfman McInnes {
732ae80bb75SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
73313f74950SBarry Smith   PetscInt     i,j;
734ae80bb75SLois Curfman McInnes 
7353a40ed3dSBarry Smith   PetscFunctionBegin;
736ae80bb75SLois Curfman McInnes   /* row-oriented output */
737ae80bb75SLois Curfman McInnes   for (i=0; i<m; i++) {
73897e567efSBarry Smith     if (indexm[i] < 0) {v += n;continue;}
739d0f46423SBarry Smith     if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row %D requested larger than number rows %D",indexm[i],A->rmap->n);
740ae80bb75SLois Curfman McInnes     for (j=0; j<n; j++) {
7416f31f424SBarry Smith       if (indexn[j] < 0) {v++; continue;}
742d0f46423SBarry Smith       if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column %D requested larger than number columns %D",indexn[j],A->cmap->n);
74397e567efSBarry Smith       *v++ = mat->v[indexn[j]*mat->lda + indexm[i]];
744ae80bb75SLois Curfman McInnes     }
745ae80bb75SLois Curfman McInnes   }
7463a40ed3dSBarry Smith   PetscFunctionReturn(0);
747ae80bb75SLois Curfman McInnes }
748ae80bb75SLois Curfman McInnes 
749289bc588SBarry Smith /* -----------------------------------------------------------------*/
750289bc588SBarry Smith 
751e090d566SSatish Balay #include "petscsys.h"
75288e32edaSLois Curfman McInnes 
7534a2ae208SSatish Balay #undef __FUNCT__
7544a2ae208SSatish Balay #define __FUNCT__ "MatLoad_SeqDense"
755a313700dSBarry Smith PetscErrorCode MatLoad_SeqDense(PetscViewer viewer, const MatType type,Mat *A)
75688e32edaSLois Curfman McInnes {
75788e32edaSLois Curfman McInnes   Mat_SeqDense   *a;
75888e32edaSLois Curfman McInnes   Mat            B;
7596849ba73SBarry Smith   PetscErrorCode ierr;
76013f74950SBarry Smith   PetscInt       *scols,i,j,nz,header[4];
76113f74950SBarry Smith   int            fd;
76213f74950SBarry Smith   PetscMPIInt    size;
76313f74950SBarry Smith   PetscInt       *rowlengths = 0,M,N,*cols;
76487828ca2SBarry Smith   PetscScalar    *vals,*svals,*v,*w;
76519bcc07fSBarry Smith   MPI_Comm       comm = ((PetscObject)viewer)->comm;
76688e32edaSLois Curfman McInnes 
7673a40ed3dSBarry Smith   PetscFunctionBegin;
768d132466eSBarry Smith   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
76929bbc08cSBarry Smith   if (size > 1) SETERRQ(PETSC_ERR_ARG_WRONG,"view must have one processor");
770b0a32e0cSBarry Smith   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
7710752156aSBarry Smith   ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr);
772552e946dSBarry Smith   if (header[0] != MAT_FILE_COOKIE) SETERRQ(PETSC_ERR_FILE_UNEXPECTED,"Not matrix object");
77388e32edaSLois Curfman McInnes   M = header[1]; N = header[2]; nz = header[3];
77488e32edaSLois Curfman McInnes 
77590ace30eSBarry Smith   if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */
776f69a0ea3SMatthew Knepley     ierr = MatCreate(comm,A);CHKERRQ(ierr);
777f69a0ea3SMatthew Knepley     ierr = MatSetSizes(*A,M,N,M,N);CHKERRQ(ierr);
778be5d1d56SKris Buschelman     ierr = MatSetType(*A,type);CHKERRQ(ierr);
7795c5985e7SKris Buschelman     ierr = MatSeqDenseSetPreallocation(*A,PETSC_NULL);CHKERRQ(ierr);
78090ace30eSBarry Smith     B    = *A;
78190ace30eSBarry Smith     a    = (Mat_SeqDense*)B->data;
7824a41a4d3SSatish Balay     v    = a->v;
7834a41a4d3SSatish Balay     /* Allocate some temp space to read in the values and then flip them
7844a41a4d3SSatish Balay        from row major to column major */
785b72907f3SBarry Smith     ierr = PetscMalloc((M*N > 0 ? M*N : 1)*sizeof(PetscScalar),&w);CHKERRQ(ierr);
78690ace30eSBarry Smith     /* read in nonzero values */
7874a41a4d3SSatish Balay     ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr);
7884a41a4d3SSatish Balay     /* now flip the values and store them in the matrix*/
7894a41a4d3SSatish Balay     for (j=0; j<N; j++) {
7904a41a4d3SSatish Balay       for (i=0; i<M; i++) {
7914a41a4d3SSatish Balay         *v++ =w[i*N+j];
7924a41a4d3SSatish Balay       }
7934a41a4d3SSatish Balay     }
794606d414cSSatish Balay     ierr = PetscFree(w);CHKERRQ(ierr);
7956d4a8577SBarry Smith     ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
7966d4a8577SBarry Smith     ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
79790ace30eSBarry Smith   } else {
79888e32edaSLois Curfman McInnes     /* read row lengths */
79913f74950SBarry Smith     ierr = PetscMalloc((M+1)*sizeof(PetscInt),&rowlengths);CHKERRQ(ierr);
8000752156aSBarry Smith     ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr);
80188e32edaSLois Curfman McInnes 
80288e32edaSLois Curfman McInnes     /* create our matrix */
803f69a0ea3SMatthew Knepley     ierr = MatCreate(comm,A);CHKERRQ(ierr);
804f69a0ea3SMatthew Knepley     ierr = MatSetSizes(*A,M,N,M,N);CHKERRQ(ierr);
805be5d1d56SKris Buschelman     ierr = MatSetType(*A,type);CHKERRQ(ierr);
8065c5985e7SKris Buschelman     ierr = MatSeqDenseSetPreallocation(*A,PETSC_NULL);CHKERRQ(ierr);
80788e32edaSLois Curfman McInnes     B = *A;
80888e32edaSLois Curfman McInnes     a = (Mat_SeqDense*)B->data;
80988e32edaSLois Curfman McInnes     v = a->v;
81088e32edaSLois Curfman McInnes 
81188e32edaSLois Curfman McInnes     /* read column indices and nonzeros */
81213f74950SBarry Smith     ierr = PetscMalloc((nz+1)*sizeof(PetscInt),&scols);CHKERRQ(ierr);
813b0a32e0cSBarry Smith     cols = scols;
8140752156aSBarry Smith     ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr);
81587828ca2SBarry Smith     ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&svals);CHKERRQ(ierr);
816b0a32e0cSBarry Smith     vals = svals;
8170752156aSBarry Smith     ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr);
81888e32edaSLois Curfman McInnes 
81988e32edaSLois Curfman McInnes     /* insert into matrix */
82088e32edaSLois Curfman McInnes     for (i=0; i<M; i++) {
82188e32edaSLois Curfman McInnes       for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j];
82288e32edaSLois Curfman McInnes       svals += rowlengths[i]; scols += rowlengths[i];
82388e32edaSLois Curfman McInnes     }
824606d414cSSatish Balay     ierr = PetscFree(vals);CHKERRQ(ierr);
825606d414cSSatish Balay     ierr = PetscFree(cols);CHKERRQ(ierr);
826606d414cSSatish Balay     ierr = PetscFree(rowlengths);CHKERRQ(ierr);
82788e32edaSLois Curfman McInnes 
8286d4a8577SBarry Smith     ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
8296d4a8577SBarry Smith     ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
83090ace30eSBarry Smith   }
8313a40ed3dSBarry Smith   PetscFunctionReturn(0);
83288e32edaSLois Curfman McInnes }
83388e32edaSLois Curfman McInnes 
834e090d566SSatish Balay #include "petscsys.h"
835932b0c3eSLois Curfman McInnes 
8364a2ae208SSatish Balay #undef __FUNCT__
8374a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII"
8386849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer)
839289bc588SBarry Smith {
840932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
841dfbe8321SBarry Smith   PetscErrorCode    ierr;
84213f74950SBarry Smith   PetscInt          i,j;
8432dcb1b2aSMatthew Knepley   const char        *name;
84487828ca2SBarry Smith   PetscScalar       *v;
845f3ef73ceSBarry Smith   PetscViewerFormat format;
8465f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX)
8475f481a85SSatish Balay   PetscTruth        allreal = PETSC_TRUE;
8485f481a85SSatish Balay #endif
849932b0c3eSLois Curfman McInnes 
8503a40ed3dSBarry Smith   PetscFunctionBegin;
851435da068SBarry Smith   ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr);
852b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
853456192e2SBarry Smith   if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
8543a40ed3dSBarry Smith     PetscFunctionReturn(0);  /* do nothing for now */
855fb9695e5SSatish Balay   } else if (format == PETSC_VIEWER_ASCII_COMMON) {
856b0a32e0cSBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_NO);CHKERRQ(ierr);
857d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
85844cd7ae7SLois Curfman McInnes       v = a->v + i;
85977431f27SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr);
860d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
861aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
862329f5518SBarry Smith         if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) {
863a83599f4SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %G + %G i) ",j,PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr);
864329f5518SBarry Smith         } else if (PetscRealPart(*v)) {
865a83599f4SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,PetscRealPart(*v));CHKERRQ(ierr);
8666831982aSBarry Smith         }
86780cd9d93SLois Curfman McInnes #else
8686831982aSBarry Smith         if (*v) {
869a83599f4SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,*v);CHKERRQ(ierr);
8706831982aSBarry Smith         }
87180cd9d93SLois Curfman McInnes #endif
8721b807ce4Svictorle         v += a->lda;
87380cd9d93SLois Curfman McInnes       }
874b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
87580cd9d93SLois Curfman McInnes     }
876b0a32e0cSBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_YES);CHKERRQ(ierr);
8773a40ed3dSBarry Smith   } else {
878b0a32e0cSBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_NO);CHKERRQ(ierr);
879aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
88047989497SBarry Smith     /* determine if matrix has all real values */
88147989497SBarry Smith     v = a->v;
882d0f46423SBarry Smith     for (i=0; i<A->rmap->n*A->cmap->n; i++) {
883ffac6cdbSBarry Smith 	if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break ;}
88447989497SBarry Smith     }
88547989497SBarry Smith #endif
886fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
8873a7fca6bSBarry Smith       ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr);
888d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr);
889d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
890fb9695e5SSatish Balay       ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr);
891ffac6cdbSBarry Smith     }
892ffac6cdbSBarry Smith 
893d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
894932b0c3eSLois Curfman McInnes       v = a->v + i;
895d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
896aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
89747989497SBarry Smith         if (allreal) {
898f32d5d43SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",PetscRealPart(*v));CHKERRQ(ierr);
89947989497SBarry Smith         } else {
900f32d5d43SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16e i ",PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr);
90147989497SBarry Smith         }
902289bc588SBarry Smith #else
903f32d5d43SBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",*v);CHKERRQ(ierr);
904289bc588SBarry Smith #endif
9051b807ce4Svictorle 	v += a->lda;
906289bc588SBarry Smith       }
907b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
908289bc588SBarry Smith     }
909fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
910b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr);
911ffac6cdbSBarry Smith     }
912b0a32e0cSBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_YES);CHKERRQ(ierr);
913da3a660dSBarry Smith   }
914b0a32e0cSBarry Smith   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
9153a40ed3dSBarry Smith   PetscFunctionReturn(0);
916289bc588SBarry Smith }
917289bc588SBarry Smith 
9184a2ae208SSatish Balay #undef __FUNCT__
9194a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary"
9206849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer)
921932b0c3eSLois Curfman McInnes {
922932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
9236849ba73SBarry Smith   PetscErrorCode    ierr;
92413f74950SBarry Smith   int               fd;
925d0f46423SBarry Smith   PetscInt          ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n;
92687828ca2SBarry Smith   PetscScalar       *v,*anonz,*vals;
927f3ef73ceSBarry Smith   PetscViewerFormat format;
928932b0c3eSLois Curfman McInnes 
9293a40ed3dSBarry Smith   PetscFunctionBegin;
930b0a32e0cSBarry Smith   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
93190ace30eSBarry Smith 
932b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
933fb9695e5SSatish Balay   if (format == PETSC_VIEWER_BINARY_NATIVE) {
93490ace30eSBarry Smith     /* store the matrix as a dense matrix */
93513f74950SBarry Smith     ierr = PetscMalloc(4*sizeof(PetscInt),&col_lens);CHKERRQ(ierr);
936552e946dSBarry Smith     col_lens[0] = MAT_FILE_COOKIE;
93790ace30eSBarry Smith     col_lens[1] = m;
93890ace30eSBarry Smith     col_lens[2] = n;
93990ace30eSBarry Smith     col_lens[3] = MATRIX_BINARY_FORMAT_DENSE;
9406f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
941606d414cSSatish Balay     ierr = PetscFree(col_lens);CHKERRQ(ierr);
94290ace30eSBarry Smith 
94390ace30eSBarry Smith     /* write out matrix, by rows */
94487828ca2SBarry Smith     ierr = PetscMalloc((m*n+1)*sizeof(PetscScalar),&vals);CHKERRQ(ierr);
94590ace30eSBarry Smith     v    = a->v;
94690ace30eSBarry Smith     for (j=0; j<n; j++) {
947578230a0SSatish Balay       for (i=0; i<m; i++) {
948578230a0SSatish Balay         vals[j + i*n] = *v++;
94990ace30eSBarry Smith       }
95090ace30eSBarry Smith     }
9516f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
952606d414cSSatish Balay     ierr = PetscFree(vals);CHKERRQ(ierr);
95390ace30eSBarry Smith   } else {
95413f74950SBarry Smith     ierr = PetscMalloc((4+nz)*sizeof(PetscInt),&col_lens);CHKERRQ(ierr);
955552e946dSBarry Smith     col_lens[0] = MAT_FILE_COOKIE;
956932b0c3eSLois Curfman McInnes     col_lens[1] = m;
957932b0c3eSLois Curfman McInnes     col_lens[2] = n;
958932b0c3eSLois Curfman McInnes     col_lens[3] = nz;
959932b0c3eSLois Curfman McInnes 
960932b0c3eSLois Curfman McInnes     /* store lengths of each row and write (including header) to file */
961932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) col_lens[4+i] = n;
9626f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
963932b0c3eSLois Curfman McInnes 
964932b0c3eSLois Curfman McInnes     /* Possibly should write in smaller increments, not whole matrix at once? */
965932b0c3eSLois Curfman McInnes     /* store column indices (zero start index) */
966932b0c3eSLois Curfman McInnes     ict = 0;
967932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
968932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) col_lens[ict++] = j;
969932b0c3eSLois Curfman McInnes     }
9706f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
971606d414cSSatish Balay     ierr = PetscFree(col_lens);CHKERRQ(ierr);
972932b0c3eSLois Curfman McInnes 
973932b0c3eSLois Curfman McInnes     /* store nonzero values */
97487828ca2SBarry Smith     ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&anonz);CHKERRQ(ierr);
975932b0c3eSLois Curfman McInnes     ict  = 0;
976932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
977932b0c3eSLois Curfman McInnes       v = a->v + i;
978932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) {
9791b807ce4Svictorle         anonz[ict++] = *v; v += a->lda;
980932b0c3eSLois Curfman McInnes       }
981932b0c3eSLois Curfman McInnes     }
9826f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
983606d414cSSatish Balay     ierr = PetscFree(anonz);CHKERRQ(ierr);
98490ace30eSBarry Smith   }
9853a40ed3dSBarry Smith   PetscFunctionReturn(0);
986932b0c3eSLois Curfman McInnes }
987932b0c3eSLois Curfman McInnes 
9884a2ae208SSatish Balay #undef __FUNCT__
9894a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom"
990dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa)
991f1af5d2fSBarry Smith {
992f1af5d2fSBarry Smith   Mat               A = (Mat) Aa;
993f1af5d2fSBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
9946849ba73SBarry Smith   PetscErrorCode    ierr;
995d0f46423SBarry Smith   PetscInt          m = A->rmap->n,n = A->cmap->n,color,i,j;
99687828ca2SBarry Smith   PetscScalar       *v = a->v;
997b0a32e0cSBarry Smith   PetscViewer       viewer;
998b0a32e0cSBarry Smith   PetscDraw         popup;
999329f5518SBarry Smith   PetscReal         xl,yl,xr,yr,x_l,x_r,y_l,y_r,scale,maxv = 0.0;
1000f3ef73ceSBarry Smith   PetscViewerFormat format;
1001f1af5d2fSBarry Smith 
1002f1af5d2fSBarry Smith   PetscFunctionBegin;
1003f1af5d2fSBarry Smith 
1004f1af5d2fSBarry Smith   ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr);
1005b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1006b0a32e0cSBarry Smith   ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr);
1007f1af5d2fSBarry Smith 
1008f1af5d2fSBarry Smith   /* Loop over matrix elements drawing boxes */
1009fb9695e5SSatish Balay   if (format != PETSC_VIEWER_DRAW_CONTOUR) {
1010f1af5d2fSBarry Smith     /* Blue for negative and Red for positive */
1011b0a32e0cSBarry Smith     color = PETSC_DRAW_BLUE;
1012f1af5d2fSBarry Smith     for(j = 0; j < n; j++) {
1013f1af5d2fSBarry Smith       x_l = j;
1014f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1015f1af5d2fSBarry Smith       for(i = 0; i < m; i++) {
1016f1af5d2fSBarry Smith         y_l = m - i - 1.0;
1017f1af5d2fSBarry Smith         y_r = y_l + 1.0;
1018f1af5d2fSBarry Smith #if defined(PETSC_USE_COMPLEX)
1019329f5518SBarry Smith         if (PetscRealPart(v[j*m+i]) >  0.) {
1020b0a32e0cSBarry Smith           color = PETSC_DRAW_RED;
1021329f5518SBarry Smith         } else if (PetscRealPart(v[j*m+i]) <  0.) {
1022b0a32e0cSBarry Smith           color = PETSC_DRAW_BLUE;
1023f1af5d2fSBarry Smith         } else {
1024f1af5d2fSBarry Smith           continue;
1025f1af5d2fSBarry Smith         }
1026f1af5d2fSBarry Smith #else
1027f1af5d2fSBarry Smith         if (v[j*m+i] >  0.) {
1028b0a32e0cSBarry Smith           color = PETSC_DRAW_RED;
1029f1af5d2fSBarry Smith         } else if (v[j*m+i] <  0.) {
1030b0a32e0cSBarry Smith           color = PETSC_DRAW_BLUE;
1031f1af5d2fSBarry Smith         } else {
1032f1af5d2fSBarry Smith           continue;
1033f1af5d2fSBarry Smith         }
1034f1af5d2fSBarry Smith #endif
1035b0a32e0cSBarry Smith         ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1036f1af5d2fSBarry Smith       }
1037f1af5d2fSBarry Smith     }
1038f1af5d2fSBarry Smith   } else {
1039f1af5d2fSBarry Smith     /* use contour shading to indicate magnitude of values */
1040f1af5d2fSBarry Smith     /* first determine max of all nonzero values */
1041f1af5d2fSBarry Smith     for(i = 0; i < m*n; i++) {
1042f1af5d2fSBarry Smith       if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]);
1043f1af5d2fSBarry Smith     }
1044b0a32e0cSBarry Smith     scale = (245.0 - PETSC_DRAW_BASIC_COLORS)/maxv;
1045b0a32e0cSBarry Smith     ierr  = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr);
1046b0a32e0cSBarry Smith     if (popup) {ierr  = PetscDrawScalePopup(popup,0.0,maxv);CHKERRQ(ierr);}
1047f1af5d2fSBarry Smith     for(j = 0; j < n; j++) {
1048f1af5d2fSBarry Smith       x_l = j;
1049f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1050f1af5d2fSBarry Smith       for(i = 0; i < m; i++) {
1051f1af5d2fSBarry Smith         y_l   = m - i - 1.0;
1052f1af5d2fSBarry Smith         y_r   = y_l + 1.0;
1053b0a32e0cSBarry Smith         color = PETSC_DRAW_BASIC_COLORS + (int)(scale*PetscAbsScalar(v[j*m+i]));
1054b0a32e0cSBarry Smith         ierr  = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1055f1af5d2fSBarry Smith       }
1056f1af5d2fSBarry Smith     }
1057f1af5d2fSBarry Smith   }
1058f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1059f1af5d2fSBarry Smith }
1060f1af5d2fSBarry Smith 
10614a2ae208SSatish Balay #undef __FUNCT__
10624a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw"
1063dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer)
1064f1af5d2fSBarry Smith {
1065b0a32e0cSBarry Smith   PetscDraw      draw;
1066f1af5d2fSBarry Smith   PetscTruth     isnull;
1067329f5518SBarry Smith   PetscReal      xr,yr,xl,yl,h,w;
1068dfbe8321SBarry Smith   PetscErrorCode ierr;
1069f1af5d2fSBarry Smith 
1070f1af5d2fSBarry Smith   PetscFunctionBegin;
1071b0a32e0cSBarry Smith   ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
1072b0a32e0cSBarry Smith   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
1073abc0a331SBarry Smith   if (isnull) PetscFunctionReturn(0);
1074f1af5d2fSBarry Smith 
1075f1af5d2fSBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr);
1076d0f46423SBarry Smith   xr  = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0;
1077f1af5d2fSBarry Smith   xr += w;    yr += h;  xl = -w;     yl = -h;
1078b0a32e0cSBarry Smith   ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr);
1079b0a32e0cSBarry Smith   ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr);
1080f1af5d2fSBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",PETSC_NULL);CHKERRQ(ierr);
1081f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1082f1af5d2fSBarry Smith }
1083f1af5d2fSBarry Smith 
10844a2ae208SSatish Balay #undef __FUNCT__
10854a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense"
1086dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer)
1087932b0c3eSLois Curfman McInnes {
1088dfbe8321SBarry Smith   PetscErrorCode ierr;
10896805f65bSBarry Smith   PetscTruth     iascii,isbinary,isdraw;
1090932b0c3eSLois Curfman McInnes 
10913a40ed3dSBarry Smith   PetscFunctionBegin;
109232077d6dSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr);
1093fb9695e5SSatish Balay   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_BINARY,&isbinary);CHKERRQ(ierr);
1094fb9695e5SSatish Balay   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_DRAW,&isdraw);CHKERRQ(ierr);
10950f5bd95cSBarry Smith 
1096c45a1595SBarry Smith   if (iascii) {
1097c45a1595SBarry Smith     ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr);
10980f5bd95cSBarry Smith   } else if (isbinary) {
10993a40ed3dSBarry Smith     ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr);
1100f1af5d2fSBarry Smith   } else if (isdraw) {
1101f1af5d2fSBarry Smith     ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr);
11025cd90555SBarry Smith   } else {
1103958c9bccSBarry Smith     SETERRQ1(PETSC_ERR_SUP,"Viewer type %s not supported by dense matrix",((PetscObject)viewer)->type_name);
1104932b0c3eSLois Curfman McInnes   }
11053a40ed3dSBarry Smith   PetscFunctionReturn(0);
1106932b0c3eSLois Curfman McInnes }
1107289bc588SBarry Smith 
11084a2ae208SSatish Balay #undef __FUNCT__
11094a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense"
1110dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqDense(Mat mat)
1111289bc588SBarry Smith {
1112ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)mat->data;
1113dfbe8321SBarry Smith   PetscErrorCode ierr;
111490f02eecSBarry Smith 
11153a40ed3dSBarry Smith   PetscFunctionBegin;
1116aa482453SBarry Smith #if defined(PETSC_USE_LOG)
1117d0f46423SBarry Smith   PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n);
1118a5a9c739SBarry Smith #endif
111905b42c5fSBarry Smith   ierr = PetscFree(l->pivots);CHKERRQ(ierr);
11206857c123SSatish Balay   if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);}
1121606d414cSSatish Balay   ierr = PetscFree(l);CHKERRQ(ierr);
1122dbd8c25aSHong Zhang 
1123dbd8c25aSHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr);
1124901853e0SKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatSeqDenseSetPreallocation_C","",PETSC_NULL);CHKERRQ(ierr);
11254ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMult_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr);
11264ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr);
11274ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr);
11283a40ed3dSBarry Smith   PetscFunctionReturn(0);
1129289bc588SBarry Smith }
1130289bc588SBarry Smith 
11314a2ae208SSatish Balay #undef __FUNCT__
11324a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense"
1133fc4dec0aSBarry Smith PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout)
1134289bc588SBarry Smith {
1135c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
11366849ba73SBarry Smith   PetscErrorCode ierr;
113713f74950SBarry Smith   PetscInt       k,j,m,n,M;
113887828ca2SBarry Smith   PetscScalar    *v,tmp;
113948b35521SBarry Smith 
11403a40ed3dSBarry Smith   PetscFunctionBegin;
1141d0f46423SBarry Smith   v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n;
1142e9695a30SBarry Smith   if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */
1143a5ce6ee0Svictorle     if (m != n) {
1144634064b4SBarry Smith       SETERRQ(PETSC_ERR_SUP,"Can not transpose non-square matrix in place");
1145d64ed03dSBarry Smith     } else {
1146d3e5ee88SLois Curfman McInnes       for (j=0; j<m; j++) {
1147289bc588SBarry Smith         for (k=0; k<j; k++) {
11481b807ce4Svictorle           tmp = v[j + k*M];
11491b807ce4Svictorle           v[j + k*M] = v[k + j*M];
11501b807ce4Svictorle           v[k + j*M] = tmp;
1151289bc588SBarry Smith         }
1152289bc588SBarry Smith       }
1153d64ed03dSBarry Smith     }
11543a40ed3dSBarry Smith   } else { /* out-of-place transpose */
1155d3e5ee88SLois Curfman McInnes     Mat          tmat;
1156ec8511deSBarry Smith     Mat_SeqDense *tmatd;
115787828ca2SBarry Smith     PetscScalar  *v2;
1158ea709b57SSatish Balay 
1159fc4dec0aSBarry Smith     if (reuse == MAT_INITIAL_MATRIX) {
11607adad957SLisandro Dalcin       ierr  = MatCreate(((PetscObject)A)->comm,&tmat);CHKERRQ(ierr);
1161d0f46423SBarry Smith       ierr  = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr);
11627adad957SLisandro Dalcin       ierr  = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
11635c5985e7SKris Buschelman       ierr  = MatSeqDenseSetPreallocation(tmat,PETSC_NULL);CHKERRQ(ierr);
1164fc4dec0aSBarry Smith     } else {
1165fc4dec0aSBarry Smith       tmat = *matout;
1166fc4dec0aSBarry Smith     }
1167ec8511deSBarry Smith     tmatd = (Mat_SeqDense*)tmat->data;
11680de55854SLois Curfman McInnes     v = mat->v; v2 = tmatd->v;
1169d3e5ee88SLois Curfman McInnes     for (j=0; j<n; j++) {
11701b807ce4Svictorle       for (k=0; k<m; k++) v2[j + k*n] = v[k + j*M];
1171d3e5ee88SLois Curfman McInnes     }
11726d4a8577SBarry Smith     ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
11736d4a8577SBarry Smith     ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1174d3e5ee88SLois Curfman McInnes     *matout = tmat;
117548b35521SBarry Smith   }
11763a40ed3dSBarry Smith   PetscFunctionReturn(0);
1177289bc588SBarry Smith }
1178289bc588SBarry Smith 
11794a2ae208SSatish Balay #undef __FUNCT__
11804a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense"
1181dfbe8321SBarry Smith PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscTruth *flg)
1182289bc588SBarry Smith {
1183c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data;
1184c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data;
118513f74950SBarry Smith   PetscInt     i,j;
118687828ca2SBarry Smith   PetscScalar  *v1 = mat1->v,*v2 = mat2->v;
11879ea5d5aeSSatish Balay 
11883a40ed3dSBarry Smith   PetscFunctionBegin;
1189d0f46423SBarry Smith   if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1190d0f46423SBarry Smith   if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1191d0f46423SBarry Smith   for (i=0; i<A1->rmap->n; i++) {
11921b807ce4Svictorle     v1 = mat1->v+i; v2 = mat2->v+i;
1193d0f46423SBarry Smith     for (j=0; j<A1->cmap->n; j++) {
11943a40ed3dSBarry Smith       if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
11951b807ce4Svictorle       v1 += mat1->lda; v2 += mat2->lda;
11961b807ce4Svictorle     }
1197289bc588SBarry Smith   }
119877c4ece6SBarry Smith   *flg = PETSC_TRUE;
11993a40ed3dSBarry Smith   PetscFunctionReturn(0);
1200289bc588SBarry Smith }
1201289bc588SBarry Smith 
12024a2ae208SSatish Balay #undef __FUNCT__
12034a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense"
1204dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v)
1205289bc588SBarry Smith {
1206c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
1207dfbe8321SBarry Smith   PetscErrorCode ierr;
120813f74950SBarry Smith   PetscInt       i,n,len;
120987828ca2SBarry Smith   PetscScalar    *x,zero = 0.0;
121044cd7ae7SLois Curfman McInnes 
12113a40ed3dSBarry Smith   PetscFunctionBegin;
12122dcb1b2aSMatthew Knepley   ierr = VecSet(v,zero);CHKERRQ(ierr);
12137a97a34bSBarry Smith   ierr = VecGetSize(v,&n);CHKERRQ(ierr);
12141ebc52fbSHong Zhang   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1215d0f46423SBarry Smith   len = PetscMin(A->rmap->n,A->cmap->n);
1216d0f46423SBarry Smith   if (n != A->rmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec");
121744cd7ae7SLois Curfman McInnes   for (i=0; i<len; i++) {
12181b807ce4Svictorle     x[i] = mat->v[i*mat->lda + i];
1219289bc588SBarry Smith   }
12201ebc52fbSHong Zhang   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
12213a40ed3dSBarry Smith   PetscFunctionReturn(0);
1222289bc588SBarry Smith }
1223289bc588SBarry Smith 
12244a2ae208SSatish Balay #undef __FUNCT__
12254a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense"
1226dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr)
1227289bc588SBarry Smith {
1228c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
122987828ca2SBarry Smith   PetscScalar    *l,*r,x,*v;
1230dfbe8321SBarry Smith   PetscErrorCode ierr;
1231d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n;
123255659b69SBarry Smith 
12333a40ed3dSBarry Smith   PetscFunctionBegin;
123428988994SBarry Smith   if (ll) {
12357a97a34bSBarry Smith     ierr = VecGetSize(ll,&m);CHKERRQ(ierr);
12361ebc52fbSHong Zhang     ierr = VecGetArray(ll,&l);CHKERRQ(ierr);
1237d0f46423SBarry Smith     if (m != A->rmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size");
1238da3a660dSBarry Smith     for (i=0; i<m; i++) {
1239da3a660dSBarry Smith       x = l[i];
1240da3a660dSBarry Smith       v = mat->v + i;
1241da3a660dSBarry Smith       for (j=0; j<n; j++) { (*v) *= x; v+= m;}
1242da3a660dSBarry Smith     }
12431ebc52fbSHong Zhang     ierr = VecRestoreArray(ll,&l);CHKERRQ(ierr);
1244efee365bSSatish Balay     ierr = PetscLogFlops(n*m);CHKERRQ(ierr);
1245da3a660dSBarry Smith   }
124628988994SBarry Smith   if (rr) {
12477a97a34bSBarry Smith     ierr = VecGetSize(rr,&n);CHKERRQ(ierr);
12481ebc52fbSHong Zhang     ierr = VecGetArray(rr,&r);CHKERRQ(ierr);
1249d0f46423SBarry Smith     if (n != A->cmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size");
1250da3a660dSBarry Smith     for (i=0; i<n; i++) {
1251da3a660dSBarry Smith       x = r[i];
1252da3a660dSBarry Smith       v = mat->v + i*m;
1253da3a660dSBarry Smith       for (j=0; j<m; j++) { (*v++) *= x;}
1254da3a660dSBarry Smith     }
12551ebc52fbSHong Zhang     ierr = VecRestoreArray(rr,&r);CHKERRQ(ierr);
1256efee365bSSatish Balay     ierr = PetscLogFlops(n*m);CHKERRQ(ierr);
1257da3a660dSBarry Smith   }
12583a40ed3dSBarry Smith   PetscFunctionReturn(0);
1259289bc588SBarry Smith }
1260289bc588SBarry Smith 
12614a2ae208SSatish Balay #undef __FUNCT__
12624a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense"
1263dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm)
1264289bc588SBarry Smith {
1265c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
126687828ca2SBarry Smith   PetscScalar  *v = mat->v;
1267329f5518SBarry Smith   PetscReal    sum = 0.0;
1268d0f46423SBarry Smith   PetscInt     lda=mat->lda,m=A->rmap->n,i,j;
1269efee365bSSatish Balay   PetscErrorCode ierr;
127055659b69SBarry Smith 
12713a40ed3dSBarry Smith   PetscFunctionBegin;
1272289bc588SBarry Smith   if (type == NORM_FROBENIUS) {
1273a5ce6ee0Svictorle     if (lda>m) {
1274d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1275a5ce6ee0Svictorle 	v = mat->v+j*lda;
1276a5ce6ee0Svictorle 	for (i=0; i<m; i++) {
1277a5ce6ee0Svictorle #if defined(PETSC_USE_COMPLEX)
1278a5ce6ee0Svictorle 	  sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1279a5ce6ee0Svictorle #else
1280a5ce6ee0Svictorle 	  sum += (*v)*(*v); v++;
1281a5ce6ee0Svictorle #endif
1282a5ce6ee0Svictorle 	}
1283a5ce6ee0Svictorle       }
1284a5ce6ee0Svictorle     } else {
1285d0f46423SBarry Smith       for (i=0; i<A->cmap->n*A->rmap->n; i++) {
1286aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
1287329f5518SBarry Smith 	sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1288289bc588SBarry Smith #else
1289289bc588SBarry Smith 	sum += (*v)*(*v); v++;
1290289bc588SBarry Smith #endif
1291289bc588SBarry Smith       }
1292a5ce6ee0Svictorle     }
1293064f8208SBarry Smith     *nrm = sqrt(sum);
1294d0f46423SBarry Smith     ierr = PetscLogFlops(2*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
12953a40ed3dSBarry Smith   } else if (type == NORM_1) {
1296064f8208SBarry Smith     *nrm = 0.0;
1297d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
12981b807ce4Svictorle       v = mat->v + j*mat->lda;
1299289bc588SBarry Smith       sum = 0.0;
1300d0f46423SBarry Smith       for (i=0; i<A->rmap->n; i++) {
130133a8263dSBarry Smith         sum += PetscAbsScalar(*v);  v++;
1302289bc588SBarry Smith       }
1303064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1304289bc588SBarry Smith     }
1305d0f46423SBarry Smith     ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr);
13063a40ed3dSBarry Smith   } else if (type == NORM_INFINITY) {
1307064f8208SBarry Smith     *nrm = 0.0;
1308d0f46423SBarry Smith     for (j=0; j<A->rmap->n; j++) {
1309289bc588SBarry Smith       v = mat->v + j;
1310289bc588SBarry Smith       sum = 0.0;
1311d0f46423SBarry Smith       for (i=0; i<A->cmap->n; i++) {
13121b807ce4Svictorle         sum += PetscAbsScalar(*v); v += mat->lda;
1313289bc588SBarry Smith       }
1314064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1315289bc588SBarry Smith     }
1316d0f46423SBarry Smith     ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr);
13173a40ed3dSBarry Smith   } else {
131829bbc08cSBarry Smith     SETERRQ(PETSC_ERR_SUP,"No two norm");
1319289bc588SBarry Smith   }
13203a40ed3dSBarry Smith   PetscFunctionReturn(0);
1321289bc588SBarry Smith }
1322289bc588SBarry Smith 
13234a2ae208SSatish Balay #undef __FUNCT__
13244a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense"
13254e0d8c25SBarry Smith PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscTruth flg)
1326289bc588SBarry Smith {
1327c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *aij = (Mat_SeqDense*)A->data;
132863ba0a88SBarry Smith   PetscErrorCode ierr;
132967e560aaSBarry Smith 
13303a40ed3dSBarry Smith   PetscFunctionBegin;
1331b5a2b587SKris Buschelman   switch (op) {
1332b5a2b587SKris Buschelman   case MAT_ROW_ORIENTED:
13334e0d8c25SBarry Smith     aij->roworiented = flg;
1334b5a2b587SKris Buschelman     break;
1335512a5fc5SBarry Smith   case MAT_NEW_NONZERO_LOCATIONS:
1336b5a2b587SKris Buschelman   case MAT_NEW_NONZERO_LOCATION_ERR:
13373971808eSMatthew Knepley   case MAT_NEW_NONZERO_ALLOCATION_ERR:
13384e0d8c25SBarry Smith   case MAT_NEW_DIAGONALS:
1339b5a2b587SKris Buschelman   case MAT_IGNORE_OFF_PROC_ENTRIES:
1340b5a2b587SKris Buschelman   case MAT_USE_HASH_TABLE:
134177e54ba9SKris Buschelman   case MAT_SYMMETRIC:
134277e54ba9SKris Buschelman   case MAT_STRUCTURALLY_SYMMETRIC:
13439a4540c5SBarry Smith   case MAT_HERMITIAN:
13449a4540c5SBarry Smith   case MAT_SYMMETRY_ETERNAL:
1345600fe468SBarry Smith   case MAT_IGNORE_LOWER_TRIANGULAR:
1346290bbb0aSBarry Smith     ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr);
134777e54ba9SKris Buschelman     break;
1348b5a2b587SKris Buschelman   default:
1349600fe468SBarry Smith     SETERRQ1(PETSC_ERR_SUP,"unknown option %s",MatOptions[op]);
13503a40ed3dSBarry Smith   }
13513a40ed3dSBarry Smith   PetscFunctionReturn(0);
1352289bc588SBarry Smith }
1353289bc588SBarry Smith 
13544a2ae208SSatish Balay #undef __FUNCT__
13554a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense"
1356dfbe8321SBarry Smith PetscErrorCode MatZeroEntries_SeqDense(Mat A)
13576f0a148fSBarry Smith {
1358ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)A->data;
13596849ba73SBarry Smith   PetscErrorCode ierr;
1360d0f46423SBarry Smith   PetscInt       lda=l->lda,m=A->rmap->n,j;
13613a40ed3dSBarry Smith 
13623a40ed3dSBarry Smith   PetscFunctionBegin;
1363a5ce6ee0Svictorle   if (lda>m) {
1364d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1365a5ce6ee0Svictorle       ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
1366a5ce6ee0Svictorle     }
1367a5ce6ee0Svictorle   } else {
1368d0f46423SBarry Smith     ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1369a5ce6ee0Svictorle   }
13703a40ed3dSBarry Smith   PetscFunctionReturn(0);
13716f0a148fSBarry Smith }
13726f0a148fSBarry Smith 
13734a2ae208SSatish Balay #undef __FUNCT__
13744a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense"
1375f4df32b1SMatthew Knepley PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag)
13766f0a148fSBarry Smith {
1377ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)A->data;
1378d0f46423SBarry Smith   PetscInt       n = A->cmap->n,i,j;
137987828ca2SBarry Smith   PetscScalar    *slot;
138055659b69SBarry Smith 
13813a40ed3dSBarry Smith   PetscFunctionBegin;
13826f0a148fSBarry Smith   for (i=0; i<N; i++) {
13836f0a148fSBarry Smith     slot = l->v + rows[i];
13846f0a148fSBarry Smith     for (j=0; j<n; j++) { *slot = 0.0; slot += n;}
13856f0a148fSBarry Smith   }
1386f4df32b1SMatthew Knepley   if (diag != 0.0) {
13876f0a148fSBarry Smith     for (i=0; i<N; i++) {
13886f0a148fSBarry Smith       slot = l->v + (n+1)*rows[i];
1389f4df32b1SMatthew Knepley       *slot = diag;
13906f0a148fSBarry Smith     }
13916f0a148fSBarry Smith   }
13923a40ed3dSBarry Smith   PetscFunctionReturn(0);
13936f0a148fSBarry Smith }
1394557bce09SLois Curfman McInnes 
13954a2ae208SSatish Balay #undef __FUNCT__
13964a2ae208SSatish Balay #define __FUNCT__ "MatGetArray_SeqDense"
1397dfbe8321SBarry Smith PetscErrorCode MatGetArray_SeqDense(Mat A,PetscScalar *array[])
139864e87e97SBarry Smith {
1399c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
14003a40ed3dSBarry Smith 
14013a40ed3dSBarry Smith   PetscFunctionBegin;
1402d0f46423SBarry Smith   if (mat->lda != A->rmap->n) SETERRQ(PETSC_ERR_SUP,"Cannot get array for Dense matrices with LDA different from number of rows");
140364e87e97SBarry Smith   *array = mat->v;
14043a40ed3dSBarry Smith   PetscFunctionReturn(0);
140564e87e97SBarry Smith }
14060754003eSLois Curfman McInnes 
14074a2ae208SSatish Balay #undef __FUNCT__
14084a2ae208SSatish Balay #define __FUNCT__ "MatRestoreArray_SeqDense"
1409dfbe8321SBarry Smith PetscErrorCode MatRestoreArray_SeqDense(Mat A,PetscScalar *array[])
1410ff14e315SSatish Balay {
14113a40ed3dSBarry Smith   PetscFunctionBegin;
141209b544d4SBarry Smith   *array = 0; /* user cannot accidently use the array later */
14133a40ed3dSBarry Smith   PetscFunctionReturn(0);
1414ff14e315SSatish Balay }
14150754003eSLois Curfman McInnes 
14164a2ae208SSatish Balay #undef __FUNCT__
14174a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense"
141813f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B)
14190754003eSLois Curfman McInnes {
1420c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
14216849ba73SBarry Smith   PetscErrorCode ierr;
142221a2c019SBarry Smith   PetscInt       i,j,*irow,*icol,nrows,ncols;
142387828ca2SBarry Smith   PetscScalar    *av,*bv,*v = mat->v;
14240754003eSLois Curfman McInnes   Mat            newmat;
14250754003eSLois Curfman McInnes 
14263a40ed3dSBarry Smith   PetscFunctionBegin;
142778b31e54SBarry Smith   ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr);
142878b31e54SBarry Smith   ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr);
1429e03a110bSBarry Smith   ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr);
1430e03a110bSBarry Smith   ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr);
14310754003eSLois Curfman McInnes 
1432182d2002SSatish Balay   /* Check submatrixcall */
1433182d2002SSatish Balay   if (scall == MAT_REUSE_MATRIX) {
143413f74950SBarry Smith     PetscInt n_cols,n_rows;
1435182d2002SSatish Balay     ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr);
143621a2c019SBarry Smith     if (n_rows != nrows || n_cols != ncols) {
143721a2c019SBarry Smith       /* resize the result result matrix to match number of requested rows/columns */
143821a2c019SBarry Smith       ierr = MatSetSizes(*B,nrows,nrows,nrows,nrows);CHKERRQ(ierr);
143921a2c019SBarry Smith     }
1440182d2002SSatish Balay     newmat = *B;
1441182d2002SSatish Balay   } else {
14420754003eSLois Curfman McInnes     /* Create and fill new matrix */
14437adad957SLisandro Dalcin     ierr = MatCreate(((PetscObject)A)->comm,&newmat);CHKERRQ(ierr);
1444f69a0ea3SMatthew Knepley     ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
14457adad957SLisandro Dalcin     ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
14465c5985e7SKris Buschelman     ierr = MatSeqDenseSetPreallocation(newmat,PETSC_NULL);CHKERRQ(ierr);
1447182d2002SSatish Balay   }
1448182d2002SSatish Balay 
1449182d2002SSatish Balay   /* Now extract the data pointers and do the copy,column at a time */
1450182d2002SSatish Balay   bv = ((Mat_SeqDense*)newmat->data)->v;
1451182d2002SSatish Balay 
1452182d2002SSatish Balay   for (i=0; i<ncols; i++) {
14536de62eeeSBarry Smith     av = v + mat->lda*icol[i];
1454182d2002SSatish Balay     for (j=0; j<nrows; j++) {
1455182d2002SSatish Balay       *bv++ = av[irow[j]];
14560754003eSLois Curfman McInnes     }
14570754003eSLois Curfman McInnes   }
1458182d2002SSatish Balay 
1459182d2002SSatish Balay   /* Assemble the matrices so that the correct flags are set */
14606d4a8577SBarry Smith   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
14616d4a8577SBarry Smith   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
14620754003eSLois Curfman McInnes 
14630754003eSLois Curfman McInnes   /* Free work space */
146478b31e54SBarry Smith   ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr);
146578b31e54SBarry Smith   ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr);
1466182d2002SSatish Balay   *B = newmat;
14673a40ed3dSBarry Smith   PetscFunctionReturn(0);
14680754003eSLois Curfman McInnes }
14690754003eSLois Curfman McInnes 
14704a2ae208SSatish Balay #undef __FUNCT__
14714a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense"
147213f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[])
1473905e6a2fSBarry Smith {
14746849ba73SBarry Smith   PetscErrorCode ierr;
147513f74950SBarry Smith   PetscInt       i;
1476905e6a2fSBarry Smith 
14773a40ed3dSBarry Smith   PetscFunctionBegin;
1478905e6a2fSBarry Smith   if (scall == MAT_INITIAL_MATRIX) {
1479b0a32e0cSBarry Smith     ierr = PetscMalloc((n+1)*sizeof(Mat),B);CHKERRQ(ierr);
1480905e6a2fSBarry Smith   }
1481905e6a2fSBarry Smith 
1482905e6a2fSBarry Smith   for (i=0; i<n; i++) {
14836a6a5d1dSBarry Smith     ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr);
1484905e6a2fSBarry Smith   }
14853a40ed3dSBarry Smith   PetscFunctionReturn(0);
1486905e6a2fSBarry Smith }
1487905e6a2fSBarry Smith 
14884a2ae208SSatish Balay #undef __FUNCT__
1489c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense"
1490c0aa2d19SHong Zhang PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode)
1491c0aa2d19SHong Zhang {
1492c0aa2d19SHong Zhang   PetscFunctionBegin;
1493c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1494c0aa2d19SHong Zhang }
1495c0aa2d19SHong Zhang 
1496c0aa2d19SHong Zhang #undef __FUNCT__
1497c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense"
1498c0aa2d19SHong Zhang PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode)
1499c0aa2d19SHong Zhang {
1500c0aa2d19SHong Zhang   PetscFunctionBegin;
1501c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1502c0aa2d19SHong Zhang }
1503c0aa2d19SHong Zhang 
1504c0aa2d19SHong Zhang #undef __FUNCT__
15054a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense"
1506dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str)
15074b0e389bSBarry Smith {
15084b0e389bSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense *)B->data;
15096849ba73SBarry Smith   PetscErrorCode ierr;
1510d0f46423SBarry Smith   PetscInt       lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j;
15113a40ed3dSBarry Smith 
15123a40ed3dSBarry Smith   PetscFunctionBegin;
151333f4a19fSKris Buschelman   /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */
151433f4a19fSKris Buschelman   if (A->ops->copy != B->ops->copy) {
1515cb5b572fSBarry Smith     ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr);
15163a40ed3dSBarry Smith     PetscFunctionReturn(0);
15173a40ed3dSBarry Smith   }
1518d0f46423SBarry Smith   if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"size(B) != size(A)");
1519a5ce6ee0Svictorle   if (lda1>m || lda2>m) {
15200dbb7854Svictorle     for (j=0; j<n; j++) {
1521a5ce6ee0Svictorle       ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr);
1522a5ce6ee0Svictorle     }
1523a5ce6ee0Svictorle   } else {
1524d0f46423SBarry Smith     ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1525a5ce6ee0Svictorle   }
1526273d9f13SBarry Smith   PetscFunctionReturn(0);
1527273d9f13SBarry Smith }
1528273d9f13SBarry Smith 
15294a2ae208SSatish Balay #undef __FUNCT__
15304a2ae208SSatish Balay #define __FUNCT__ "MatSetUpPreallocation_SeqDense"
1531dfbe8321SBarry Smith PetscErrorCode MatSetUpPreallocation_SeqDense(Mat A)
1532273d9f13SBarry Smith {
1533dfbe8321SBarry Smith   PetscErrorCode ierr;
1534273d9f13SBarry Smith 
1535273d9f13SBarry Smith   PetscFunctionBegin;
1536273d9f13SBarry Smith   ierr =  MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr);
15373a40ed3dSBarry Smith   PetscFunctionReturn(0);
15384b0e389bSBarry Smith }
15394b0e389bSBarry Smith 
1540284134d9SBarry Smith #undef __FUNCT__
1541284134d9SBarry Smith #define __FUNCT__ "MatSetSizes_SeqDense"
1542284134d9SBarry Smith PetscErrorCode MatSetSizes_SeqDense(Mat A,PetscInt m,PetscInt n,PetscInt M,PetscInt N)
1543284134d9SBarry Smith {
1544284134d9SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
154521a2c019SBarry Smith   PetscErrorCode ierr;
1546284134d9SBarry Smith   PetscFunctionBegin;
154721a2c019SBarry Smith   /* this will not be called before lda, Mmax,  and Nmax have been set */
1548284134d9SBarry Smith   m = PetscMax(m,M);
1549284134d9SBarry Smith   n = PetscMax(n,N);
155021a2c019SBarry Smith   if (m > a->Mmax) SETERRQ2(PETSC_ERR_SUP,"Cannot yet resize number rows of dense matrix larger then its initial size %d, requested %d",a->lda,(int)m);
1551284134d9SBarry Smith   if (n > a->Nmax) SETERRQ2(PETSC_ERR_SUP,"Cannot yet resize number columns of dense matrix larger then its initial size %d, requested %d",a->Nmax,(int)n);
1552d0f46423SBarry Smith   A->rmap->n = A->rmap->n = m;
1553d0f46423SBarry Smith   A->cmap->n = A->cmap->N = n;
155421a2c019SBarry Smith   if (a->changelda) a->lda = m;
155521a2c019SBarry Smith   ierr = PetscMemzero(a->v,m*n*sizeof(PetscScalar));CHKERRQ(ierr);
1556284134d9SBarry Smith   PetscFunctionReturn(0);
1557284134d9SBarry Smith }
1558170fe5c8SBarry Smith 
1559284134d9SBarry Smith 
1560a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/
1561a9fe9ddaSSatish Balay #undef __FUNCT__
1562a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense"
1563a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1564a9fe9ddaSSatish Balay {
1565a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1566a9fe9ddaSSatish Balay 
1567a9fe9ddaSSatish Balay   PetscFunctionBegin;
1568a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX){
1569a9fe9ddaSSatish Balay     ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
1570a9fe9ddaSSatish Balay   }
1571a9fe9ddaSSatish Balay   ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
1572a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1573a9fe9ddaSSatish Balay }
1574a9fe9ddaSSatish Balay 
1575a9fe9ddaSSatish Balay #undef __FUNCT__
1576a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense"
1577a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1578a9fe9ddaSSatish Balay {
1579ee16a9a1SHong Zhang   PetscErrorCode ierr;
1580d0f46423SBarry Smith   PetscInt       m=A->rmap->n,n=B->cmap->n;
1581ee16a9a1SHong Zhang   Mat            Cmat;
1582a9fe9ddaSSatish Balay 
1583ee16a9a1SHong Zhang   PetscFunctionBegin;
1584d0f46423SBarry Smith   if (A->cmap->n != B->rmap->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"A->cmap->n %d != B->rmap->n %d\n",A->cmap->n,B->rmap->n);
1585ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1586ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1587ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
1588ee16a9a1SHong Zhang   ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr);
1589ee16a9a1SHong Zhang   Cmat->assembled = PETSC_TRUE;
1590ee16a9a1SHong Zhang   *C = Cmat;
1591ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1592ee16a9a1SHong Zhang }
1593a9fe9ddaSSatish Balay 
159498a3b096SSatish Balay #undef __FUNCT__
1595a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense"
1596a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1597a9fe9ddaSSatish Balay {
1598a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1599a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1600a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
16010805154bSBarry Smith   PetscBLASInt   m,n,k;
1602a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1603a9fe9ddaSSatish Balay 
1604a9fe9ddaSSatish Balay   PetscFunctionBegin;
1605d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
1606d0f46423SBarry Smith   n = PetscBLASIntCast(B->cmap->n);
1607d0f46423SBarry Smith   k = PetscBLASIntCast(A->cmap->n);
1608a9fe9ddaSSatish Balay   BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda);
1609a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1610a9fe9ddaSSatish Balay }
1611a9fe9ddaSSatish Balay 
1612a9fe9ddaSSatish Balay #undef __FUNCT__
1613a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultTranspose_SeqDense_SeqDense"
1614a9fe9ddaSSatish Balay PetscErrorCode MatMatMultTranspose_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1615a9fe9ddaSSatish Balay {
1616a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1617a9fe9ddaSSatish Balay 
1618a9fe9ddaSSatish Balay   PetscFunctionBegin;
1619a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX){
1620a9fe9ddaSSatish Balay     ierr = MatMatMultTransposeSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
1621a9fe9ddaSSatish Balay   }
1622a9fe9ddaSSatish Balay   ierr = MatMatMultTransposeNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
1623a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1624a9fe9ddaSSatish Balay }
1625a9fe9ddaSSatish Balay 
1626a9fe9ddaSSatish Balay #undef __FUNCT__
1627a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultTransposeSymbolic_SeqDense_SeqDense"
1628a9fe9ddaSSatish Balay PetscErrorCode MatMatMultTransposeSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1629a9fe9ddaSSatish Balay {
1630ee16a9a1SHong Zhang   PetscErrorCode ierr;
1631d0f46423SBarry Smith   PetscInt       m=A->cmap->n,n=B->cmap->n;
1632ee16a9a1SHong Zhang   Mat            Cmat;
1633a9fe9ddaSSatish Balay 
1634ee16a9a1SHong Zhang   PetscFunctionBegin;
1635d0f46423SBarry Smith   if (A->rmap->n != B->rmap->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"A->rmap->n %d != B->rmap->n %d\n",A->rmap->n,B->rmap->n);
1636ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1637ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1638ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
1639ee16a9a1SHong Zhang   ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr);
1640ee16a9a1SHong Zhang   Cmat->assembled = PETSC_TRUE;
1641ee16a9a1SHong Zhang   *C = Cmat;
1642ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1643ee16a9a1SHong Zhang }
1644a9fe9ddaSSatish Balay 
1645a9fe9ddaSSatish Balay #undef __FUNCT__
1646a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultTransposeNumeric_SeqDense_SeqDense"
1647a9fe9ddaSSatish Balay PetscErrorCode MatMatMultTransposeNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1648a9fe9ddaSSatish Balay {
1649a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1650a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1651a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
16520805154bSBarry Smith   PetscBLASInt   m,n,k;
1653a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1654a9fe9ddaSSatish Balay 
1655a9fe9ddaSSatish Balay   PetscFunctionBegin;
1656d0f46423SBarry Smith   m = PetscBLASIntCast(A->cmap->n);
1657d0f46423SBarry Smith   n = PetscBLASIntCast(B->cmap->n);
1658d0f46423SBarry Smith   k = PetscBLASIntCast(A->rmap->n);
16592fbe02b9SBarry Smith   /*
16602fbe02b9SBarry Smith      Note the m and n arguments below are the number rows and columns of A', not A!
16612fbe02b9SBarry Smith   */
1662a9fe9ddaSSatish Balay   BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda);
1663a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1664a9fe9ddaSSatish Balay }
1665985db425SBarry Smith 
1666985db425SBarry Smith #undef __FUNCT__
1667985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense"
1668985db425SBarry Smith PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[])
1669985db425SBarry Smith {
1670985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1671985db425SBarry Smith   PetscErrorCode ierr;
1672d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1673985db425SBarry Smith   PetscScalar    *x;
1674985db425SBarry Smith   MatScalar      *aa = a->v;
1675985db425SBarry Smith 
1676985db425SBarry Smith   PetscFunctionBegin;
1677985db425SBarry Smith   if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1678985db425SBarry Smith 
1679985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1680985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1681985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1682d0f46423SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1683985db425SBarry Smith   for (i=0; i<m; i++) {
1684985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1685985db425SBarry Smith     for (j=1; j<n; j++){
1686985db425SBarry Smith       if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1687985db425SBarry Smith     }
1688985db425SBarry Smith   }
1689985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1690985db425SBarry Smith   PetscFunctionReturn(0);
1691985db425SBarry Smith }
1692985db425SBarry Smith 
1693985db425SBarry Smith #undef __FUNCT__
1694985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense"
1695985db425SBarry Smith PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[])
1696985db425SBarry Smith {
1697985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1698985db425SBarry Smith   PetscErrorCode ierr;
1699d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1700985db425SBarry Smith   PetscScalar    *x;
1701985db425SBarry Smith   PetscReal      atmp;
1702985db425SBarry Smith   MatScalar      *aa = a->v;
1703985db425SBarry Smith 
1704985db425SBarry Smith   PetscFunctionBegin;
1705985db425SBarry Smith   if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1706985db425SBarry Smith 
1707985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1708985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1709985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1710d0f46423SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1711985db425SBarry Smith   for (i=0; i<m; i++) {
17129189402eSHong Zhang     x[i] = PetscAbsScalar(aa[i]);
1713985db425SBarry Smith     for (j=1; j<n; j++){
1714985db425SBarry Smith       atmp = PetscAbsScalar(aa[i+m*j]);
1715985db425SBarry Smith       if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;}
1716985db425SBarry Smith     }
1717985db425SBarry Smith   }
1718985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1719985db425SBarry Smith   PetscFunctionReturn(0);
1720985db425SBarry Smith }
1721985db425SBarry Smith 
1722985db425SBarry Smith #undef __FUNCT__
1723985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense"
1724985db425SBarry Smith PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[])
1725985db425SBarry Smith {
1726985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1727985db425SBarry Smith   PetscErrorCode ierr;
1728d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1729985db425SBarry Smith   PetscScalar    *x;
1730985db425SBarry Smith   MatScalar      *aa = a->v;
1731985db425SBarry Smith 
1732985db425SBarry Smith   PetscFunctionBegin;
1733985db425SBarry Smith   if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1734985db425SBarry Smith 
1735985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1736985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1737985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1738d0f46423SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1739985db425SBarry Smith   for (i=0; i<m; i++) {
1740985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1741985db425SBarry Smith     for (j=1; j<n; j++){
1742985db425SBarry Smith       if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1743985db425SBarry Smith     }
1744985db425SBarry Smith   }
1745985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1746985db425SBarry Smith   PetscFunctionReturn(0);
1747985db425SBarry Smith }
1748985db425SBarry Smith 
17498d0534beSBarry Smith #undef __FUNCT__
17508d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense"
17518d0534beSBarry Smith PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col)
17528d0534beSBarry Smith {
17538d0534beSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
17548d0534beSBarry Smith   PetscErrorCode ierr;
17558d0534beSBarry Smith   PetscScalar    *x;
17568d0534beSBarry Smith 
17578d0534beSBarry Smith   PetscFunctionBegin;
17588d0534beSBarry Smith   if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
17598d0534beSBarry Smith 
17608d0534beSBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1761d0f46423SBarry Smith   ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
17628d0534beSBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
17638d0534beSBarry Smith   PetscFunctionReturn(0);
17648d0534beSBarry Smith }
17658d0534beSBarry Smith 
1766289bc588SBarry Smith /* -------------------------------------------------------------------*/
1767a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = {MatSetValues_SeqDense,
1768905e6a2fSBarry Smith        MatGetRow_SeqDense,
1769905e6a2fSBarry Smith        MatRestoreRow_SeqDense,
1770905e6a2fSBarry Smith        MatMult_SeqDense,
177197304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense,
17727c922b88SBarry Smith        MatMultTranspose_SeqDense,
17737c922b88SBarry Smith        MatMultTransposeAdd_SeqDense,
1774*db4efbfdSBarry Smith        0,
1775*db4efbfdSBarry Smith        0,
1776*db4efbfdSBarry Smith        0,
1777*db4efbfdSBarry Smith /*10*/ 0,
1778905e6a2fSBarry Smith        MatLUFactor_SeqDense,
1779905e6a2fSBarry Smith        MatCholeskyFactor_SeqDense,
1780ec8511deSBarry Smith        MatRelax_SeqDense,
1781ec8511deSBarry Smith        MatTranspose_SeqDense,
178297304618SKris Buschelman /*15*/ MatGetInfo_SeqDense,
1783905e6a2fSBarry Smith        MatEqual_SeqDense,
1784905e6a2fSBarry Smith        MatGetDiagonal_SeqDense,
1785905e6a2fSBarry Smith        MatDiagonalScale_SeqDense,
1786905e6a2fSBarry Smith        MatNorm_SeqDense,
1787c0aa2d19SHong Zhang /*20*/ MatAssemblyBegin_SeqDense,
1788c0aa2d19SHong Zhang        MatAssemblyEnd_SeqDense,
1789905e6a2fSBarry Smith        0,
1790905e6a2fSBarry Smith        MatSetOption_SeqDense,
1791905e6a2fSBarry Smith        MatZeroEntries_SeqDense,
179297304618SKris Buschelman /*25*/ MatZeroRows_SeqDense,
1793*db4efbfdSBarry Smith        0,
1794*db4efbfdSBarry Smith        0,
1795*db4efbfdSBarry Smith        0,
1796*db4efbfdSBarry Smith        0,
179797304618SKris Buschelman /*30*/ MatSetUpPreallocation_SeqDense,
1798273d9f13SBarry Smith        0,
1799905e6a2fSBarry Smith        0,
1800905e6a2fSBarry Smith        MatGetArray_SeqDense,
1801905e6a2fSBarry Smith        MatRestoreArray_SeqDense,
180297304618SKris Buschelman /*35*/ MatDuplicate_SeqDense,
1803a5ae1ecdSBarry Smith        0,
1804a5ae1ecdSBarry Smith        0,
1805a5ae1ecdSBarry Smith        0,
1806a5ae1ecdSBarry Smith        0,
180797304618SKris Buschelman /*40*/ MatAXPY_SeqDense,
1808a5ae1ecdSBarry Smith        MatGetSubMatrices_SeqDense,
1809a5ae1ecdSBarry Smith        0,
18104b0e389bSBarry Smith        MatGetValues_SeqDense,
1811a5ae1ecdSBarry Smith        MatCopy_SeqDense,
1812985db425SBarry Smith /*45*/ MatGetRowMax_SeqDense,
1813a5ae1ecdSBarry Smith        MatScale_SeqDense,
1814a5ae1ecdSBarry Smith        0,
1815a5ae1ecdSBarry Smith        0,
1816a5ae1ecdSBarry Smith        0,
1817521d7252SBarry Smith /*50*/ 0,
1818a5ae1ecdSBarry Smith        0,
1819a5ae1ecdSBarry Smith        0,
1820a5ae1ecdSBarry Smith        0,
1821a5ae1ecdSBarry Smith        0,
182297304618SKris Buschelman /*55*/ 0,
1823a5ae1ecdSBarry Smith        0,
1824a5ae1ecdSBarry Smith        0,
1825a5ae1ecdSBarry Smith        0,
1826a5ae1ecdSBarry Smith        0,
182797304618SKris Buschelman /*60*/ 0,
1828e03a110bSBarry Smith        MatDestroy_SeqDense,
1829e03a110bSBarry Smith        MatView_SeqDense,
1830357abbc8SBarry Smith        0,
183197304618SKris Buschelman        0,
183297304618SKris Buschelman /*65*/ 0,
183397304618SKris Buschelman        0,
183497304618SKris Buschelman        0,
183597304618SKris Buschelman        0,
183697304618SKris Buschelman        0,
1837985db425SBarry Smith /*70*/ MatGetRowMaxAbs_SeqDense,
183897304618SKris Buschelman        0,
183997304618SKris Buschelman        0,
184097304618SKris Buschelman        0,
184197304618SKris Buschelman        0,
184297304618SKris Buschelman /*75*/ 0,
184397304618SKris Buschelman        0,
184497304618SKris Buschelman        0,
184597304618SKris Buschelman        0,
184697304618SKris Buschelman        0,
184797304618SKris Buschelman /*80*/ 0,
184897304618SKris Buschelman        0,
184997304618SKris Buschelman        0,
185097304618SKris Buschelman        0,
1851865e5f61SKris Buschelman /*84*/ MatLoad_SeqDense,
1852865e5f61SKris Buschelman        0,
18531cbb95d3SBarry Smith        MatIsHermitian_SeqDense,
1854865e5f61SKris Buschelman        0,
1855865e5f61SKris Buschelman        0,
1856865e5f61SKris Buschelman        0,
1857a9fe9ddaSSatish Balay /*90*/ MatMatMult_SeqDense_SeqDense,
1858a9fe9ddaSSatish Balay        MatMatMultSymbolic_SeqDense_SeqDense,
1859a9fe9ddaSSatish Balay        MatMatMultNumeric_SeqDense_SeqDense,
1860865e5f61SKris Buschelman        0,
1861865e5f61SKris Buschelman        0,
1862865e5f61SKris Buschelman /*95*/ 0,
1863a9fe9ddaSSatish Balay        MatMatMultTranspose_SeqDense_SeqDense,
1864a9fe9ddaSSatish Balay        MatMatMultTransposeSymbolic_SeqDense_SeqDense,
1865a9fe9ddaSSatish Balay        MatMatMultTransposeNumeric_SeqDense_SeqDense,
1866284134d9SBarry Smith        0,
1867284134d9SBarry Smith /*100*/0,
1868284134d9SBarry Smith        0,
1869284134d9SBarry Smith        0,
1870284134d9SBarry Smith        0,
1871985db425SBarry Smith        MatSetSizes_SeqDense,
1872985db425SBarry Smith        0,
1873985db425SBarry Smith        0,
1874985db425SBarry Smith        0,
1875985db425SBarry Smith        0,
1876985db425SBarry Smith        0,
1877985db425SBarry Smith /*110*/0,
1878985db425SBarry Smith        0,
18798d0534beSBarry Smith        MatGetRowMin_SeqDense,
18808d0534beSBarry Smith        MatGetColumnVector_SeqDense
1881985db425SBarry Smith };
188290ace30eSBarry Smith 
18834a2ae208SSatish Balay #undef __FUNCT__
18844a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense"
18854b828684SBarry Smith /*@C
1886fafbff53SBarry Smith    MatCreateSeqDense - Creates a sequential dense matrix that
1887d65003e9SLois Curfman McInnes    is stored in column major order (the usual Fortran 77 manner). Many
1888d65003e9SLois Curfman McInnes    of the matrix operations use the BLAS and LAPACK routines.
1889289bc588SBarry Smith 
1890db81eaa0SLois Curfman McInnes    Collective on MPI_Comm
1891db81eaa0SLois Curfman McInnes 
189220563c6bSBarry Smith    Input Parameters:
1893db81eaa0SLois Curfman McInnes +  comm - MPI communicator, set to PETSC_COMM_SELF
18940c775827SLois Curfman McInnes .  m - number of rows
189518f449edSLois Curfman McInnes .  n - number of columns
1896db81eaa0SLois Curfman McInnes -  data - optional location of matrix data.  Set data=PETSC_NULL for PETSc
1897dfc5480cSLois Curfman McInnes    to control all matrix memory allocation.
189820563c6bSBarry Smith 
189920563c6bSBarry Smith    Output Parameter:
190044cd7ae7SLois Curfman McInnes .  A - the matrix
190120563c6bSBarry Smith 
1902b259b22eSLois Curfman McInnes    Notes:
190318f449edSLois Curfman McInnes    The data input variable is intended primarily for Fortran programmers
190418f449edSLois Curfman McInnes    who wish to allocate their own matrix memory space.  Most users should
1905b4fd4287SBarry Smith    set data=PETSC_NULL.
190618f449edSLois Curfman McInnes 
1907027ccd11SLois Curfman McInnes    Level: intermediate
1908027ccd11SLois Curfman McInnes 
1909dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS
1910d65003e9SLois Curfman McInnes 
1911db81eaa0SLois Curfman McInnes .seealso: MatCreate(), MatCreateMPIDense(), MatSetValues()
191220563c6bSBarry Smith @*/
1913be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A)
1914289bc588SBarry Smith {
1915dfbe8321SBarry Smith   PetscErrorCode ierr;
19163b2fbd54SBarry Smith 
19173a40ed3dSBarry Smith   PetscFunctionBegin;
1918f69a0ea3SMatthew Knepley   ierr = MatCreate(comm,A);CHKERRQ(ierr);
1919f69a0ea3SMatthew Knepley   ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr);
1920273d9f13SBarry Smith   ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr);
1921273d9f13SBarry Smith   ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr);
1922273d9f13SBarry Smith   PetscFunctionReturn(0);
1923273d9f13SBarry Smith }
1924273d9f13SBarry Smith 
19254a2ae208SSatish Balay #undef __FUNCT__
1926afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation"
1927273d9f13SBarry Smith /*@C
1928273d9f13SBarry Smith    MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements
1929273d9f13SBarry Smith 
1930273d9f13SBarry Smith    Collective on MPI_Comm
1931273d9f13SBarry Smith 
1932273d9f13SBarry Smith    Input Parameters:
1933273d9f13SBarry Smith +  A - the matrix
1934273d9f13SBarry Smith -  data - the array (or PETSC_NULL)
1935273d9f13SBarry Smith 
1936273d9f13SBarry Smith    Notes:
1937273d9f13SBarry Smith    The data input variable is intended primarily for Fortran programmers
1938273d9f13SBarry Smith    who wish to allocate their own matrix memory space.  Most users should
1939284134d9SBarry Smith    need not call this routine.
1940273d9f13SBarry Smith 
1941273d9f13SBarry Smith    Level: intermediate
1942273d9f13SBarry Smith 
1943273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS
1944273d9f13SBarry Smith 
1945273d9f13SBarry Smith .seealso: MatCreate(), MatCreateMPIDense(), MatSetValues()
1946273d9f13SBarry Smith @*/
1947be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatSeqDenseSetPreallocation(Mat B,PetscScalar data[])
1948273d9f13SBarry Smith {
1949dfbe8321SBarry Smith   PetscErrorCode ierr,(*f)(Mat,PetscScalar[]);
1950a23d5eceSKris Buschelman 
1951a23d5eceSKris Buschelman   PetscFunctionBegin;
1952a23d5eceSKris Buschelman   ierr = PetscObjectQueryFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",(void (**)(void))&f);CHKERRQ(ierr);
1953a23d5eceSKris Buschelman   if (f) {
1954a23d5eceSKris Buschelman     ierr = (*f)(B,data);CHKERRQ(ierr);
1955a23d5eceSKris Buschelman   }
1956a23d5eceSKris Buschelman   PetscFunctionReturn(0);
1957a23d5eceSKris Buschelman }
1958a23d5eceSKris Buschelman 
1959a23d5eceSKris Buschelman EXTERN_C_BEGIN
1960a23d5eceSKris Buschelman #undef __FUNCT__
1961afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense"
1962be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data)
1963a23d5eceSKris Buschelman {
1964273d9f13SBarry Smith   Mat_SeqDense   *b;
1965dfbe8321SBarry Smith   PetscErrorCode ierr;
1966273d9f13SBarry Smith 
1967273d9f13SBarry Smith   PetscFunctionBegin;
1968273d9f13SBarry Smith   B->preallocated = PETSC_TRUE;
1969273d9f13SBarry Smith   b               = (Mat_SeqDense*)B->data;
1970d0f46423SBarry Smith   if (b->lda <= 0) b->lda = B->rmap->n;
19719e8f95c4SLisandro Dalcin   if (!data) { /* petsc-allocated storage */
19729e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
19735afd5e0cSBarry Smith     ierr = PetscMalloc(b->lda*b->Nmax*sizeof(PetscScalar),&b->v);CHKERRQ(ierr);
1974284134d9SBarry Smith     ierr = PetscMemzero(b->v,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
1975284134d9SBarry Smith     ierr = PetscLogObjectMemory(B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
19769e8f95c4SLisandro Dalcin     b->user_alloc = PETSC_FALSE;
1977273d9f13SBarry Smith   } else { /* user-allocated storage */
19789e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
1979273d9f13SBarry Smith     b->v          = data;
1980273d9f13SBarry Smith     b->user_alloc = PETSC_TRUE;
1981273d9f13SBarry Smith   }
1982273d9f13SBarry Smith   PetscFunctionReturn(0);
1983273d9f13SBarry Smith }
1984a23d5eceSKris Buschelman EXTERN_C_END
1985273d9f13SBarry Smith 
19861b807ce4Svictorle #undef __FUNCT__
19871b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA"
19881b807ce4Svictorle /*@C
19891b807ce4Svictorle   MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array
19901b807ce4Svictorle 
19911b807ce4Svictorle   Input parameter:
19921b807ce4Svictorle + A - the matrix
19931b807ce4Svictorle - lda - the leading dimension
19941b807ce4Svictorle 
19951b807ce4Svictorle   Notes:
19961b807ce4Svictorle   This routine is to be used in conjunction with MatSeqDenseSetPreallocation;
19971b807ce4Svictorle   it asserts that the preallocation has a leading dimension (the LDA parameter
19981b807ce4Svictorle   of Blas and Lapack fame) larger than M, the first dimension of the matrix.
19991b807ce4Svictorle 
20001b807ce4Svictorle   Level: intermediate
20011b807ce4Svictorle 
20021b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS
20031b807ce4Svictorle 
2004284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize()
20051b807ce4Svictorle @*/
2006be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatSeqDenseSetLDA(Mat B,PetscInt lda)
20071b807ce4Svictorle {
20081b807ce4Svictorle   Mat_SeqDense *b = (Mat_SeqDense*)B->data;
200921a2c019SBarry Smith 
20101b807ce4Svictorle   PetscFunctionBegin;
2011d0f46423SBarry Smith   if (lda < B->rmap->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"LDA %D must be at least matrix dimension %D",lda,B->rmap->n);
20121b807ce4Svictorle   b->lda       = lda;
201321a2c019SBarry Smith   b->changelda = PETSC_FALSE;
201421a2c019SBarry Smith   b->Mmax      = PetscMax(b->Mmax,lda);
20151b807ce4Svictorle   PetscFunctionReturn(0);
20161b807ce4Svictorle }
20171b807ce4Svictorle 
20180bad9183SKris Buschelman /*MC
2019fafad747SKris Buschelman    MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices.
20200bad9183SKris Buschelman 
20210bad9183SKris Buschelman    Options Database Keys:
20220bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions()
20230bad9183SKris Buschelman 
20240bad9183SKris Buschelman   Level: beginner
20250bad9183SKris Buschelman 
202689665df3SBarry Smith .seealso: MatCreateSeqDense()
202789665df3SBarry Smith 
20280bad9183SKris Buschelman M*/
20290bad9183SKris Buschelman 
2030273d9f13SBarry Smith EXTERN_C_BEGIN
20314a2ae208SSatish Balay #undef __FUNCT__
20324a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense"
2033be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatCreate_SeqDense(Mat B)
2034273d9f13SBarry Smith {
2035273d9f13SBarry Smith   Mat_SeqDense   *b;
2036dfbe8321SBarry Smith   PetscErrorCode ierr;
20377c334f02SBarry Smith   PetscMPIInt    size;
2038273d9f13SBarry Smith 
2039273d9f13SBarry Smith   PetscFunctionBegin;
20407adad957SLisandro Dalcin   ierr = MPI_Comm_size(((PetscObject)B)->comm,&size);CHKERRQ(ierr);
204129bbc08cSBarry Smith   if (size > 1) SETERRQ(PETSC_ERR_ARG_WRONG,"Comm must be of size 1");
204255659b69SBarry Smith 
2043d0f46423SBarry Smith   B->rmap->bs = B->cmap->bs = 1;
2044d0f46423SBarry Smith   ierr = PetscMapSetUp(B->rmap);CHKERRQ(ierr);
2045d0f46423SBarry Smith   ierr = PetscMapSetUp(B->cmap);CHKERRQ(ierr);
2046273d9f13SBarry Smith 
204738f2d2fdSLisandro Dalcin   ierr            = PetscNewLog(B,Mat_SeqDense,&b);CHKERRQ(ierr);
2048549d3d68SSatish Balay   ierr            = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr);
204990f02eecSBarry Smith   B->mapping      = 0;
205044cd7ae7SLois Curfman McInnes   B->data         = (void*)b;
205118f449edSLois Curfman McInnes 
2052a5ae1ecdSBarry Smith 
205344cd7ae7SLois Curfman McInnes   b->pivots       = 0;
2054273d9f13SBarry Smith   b->roworiented  = PETSC_TRUE;
2055273d9f13SBarry Smith   b->v            = 0;
2056d0f46423SBarry Smith   b->lda          = B->rmap->n;
205721a2c019SBarry Smith   b->changelda    = PETSC_FALSE;
2058d0f46423SBarry Smith   b->Mmax         = B->rmap->n;
2059d0f46423SBarry Smith   b->Nmax         = B->cmap->n;
20604e220ebcSLois Curfman McInnes 
2061b24902e0SBarry Smith 
2062b24902e0SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatGetFactor_seqdense_petsc_C",
2063b24902e0SBarry Smith                                      "MatGetFactor_seqdense_petsc",
2064b24902e0SBarry Smith                                       MatGetFactor_seqdense_petsc);CHKERRQ(ierr);
2065a23d5eceSKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatSeqDenseSetPreallocation_C",
2066a23d5eceSKris Buschelman                                     "MatSeqDenseSetPreallocation_SeqDense",
2067a23d5eceSKris Buschelman                                      MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr);
20684ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMult_seqaij_seqdense_C",
20694ae313f4SHong Zhang                                      "MatMatMult_SeqAIJ_SeqDense",
20704ae313f4SHong Zhang                                       MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
20714ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",
20724ae313f4SHong Zhang                                      "MatMatMultSymbolic_SeqAIJ_SeqDense",
20734ae313f4SHong Zhang                                       MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
20744ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",
20754ae313f4SHong Zhang                                      "MatMatMultNumeric_SeqAIJ_SeqDense",
20764ae313f4SHong Zhang                                       MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
207717667f90SBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr);
20783a40ed3dSBarry Smith   PetscFunctionReturn(0);
2079289bc588SBarry Smith }
2080c0aa2d19SHong Zhang 
2081c0aa2d19SHong Zhang 
2082273d9f13SBarry Smith EXTERN_C_END
2083