xref: /petsc/src/mat/impls/dense/seq/dense.c (revision fd4e9aacc1745339ac273bcce0d014a68a3ddc6b)
1be1d678aSKris Buschelman 
267e560aaSBarry Smith /*
367e560aaSBarry Smith      Defines the basic matrix operations for sequential dense.
467e560aaSBarry Smith */
5289bc588SBarry Smith 
6dec5eb66SMatthew G Knepley #include <../src/mat/impls/dense/seq/dense.h> /*I "petscmat.h" I*/
7c6db04a5SJed Brown #include <petscblaslapack.h>
8289bc588SBarry Smith 
96a63e612SBarry Smith #include <../src/mat/impls/aij/seq/aij.h>
10b2573a8aSBarry Smith 
116a63e612SBarry Smith #undef __FUNCT__
12b49cda9fSStefano Zampini #define __FUNCT__ "MatConvert_SeqAIJ_SeqDense"
13b49cda9fSStefano Zampini PETSC_EXTERN PetscErrorCode MatConvert_SeqAIJ_SeqDense(Mat A,MatType newtype,MatReuse reuse,Mat *newmat)
14b49cda9fSStefano Zampini {
15b49cda9fSStefano Zampini   Mat            B;
16b49cda9fSStefano Zampini   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)A->data;
17b49cda9fSStefano Zampini   Mat_SeqDense   *b;
18b49cda9fSStefano Zampini   PetscErrorCode ierr;
19b49cda9fSStefano Zampini   PetscInt       *ai=a->i,*aj=a->j,m=A->rmap->N,n=A->cmap->N,i;
20b49cda9fSStefano Zampini   MatScalar      *av=a->a;
21b49cda9fSStefano Zampini 
22b49cda9fSStefano Zampini   PetscFunctionBegin;
23b49cda9fSStefano Zampini   ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr);
24b49cda9fSStefano Zampini   ierr = MatSetSizes(B,m,n,m,n);CHKERRQ(ierr);
25b49cda9fSStefano Zampini   ierr = MatSetType(B,MATSEQDENSE);CHKERRQ(ierr);
26b49cda9fSStefano Zampini   ierr = MatSeqDenseSetPreallocation(B,NULL);CHKERRQ(ierr);
27b49cda9fSStefano Zampini 
28b49cda9fSStefano Zampini   b  = (Mat_SeqDense*)(B->data);
29b49cda9fSStefano Zampini   for (i=0; i<m; i++) {
30b49cda9fSStefano Zampini     PetscInt j;
31b49cda9fSStefano Zampini     for (j=0;j<ai[1]-ai[0];j++) {
32b49cda9fSStefano Zampini       b->v[*aj*m+i] = *av;
33b49cda9fSStefano Zampini       aj++;
34b49cda9fSStefano Zampini       av++;
35b49cda9fSStefano Zampini     }
36b49cda9fSStefano Zampini     ai++;
37b49cda9fSStefano Zampini   }
38b49cda9fSStefano Zampini   ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
39b49cda9fSStefano Zampini   ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
40b49cda9fSStefano Zampini 
41b49cda9fSStefano Zampini   if (reuse == MAT_REUSE_MATRIX) {
42b49cda9fSStefano Zampini     ierr = MatHeaderReplace(A,B);CHKERRQ(ierr);
43b49cda9fSStefano Zampini   } else {
44b49cda9fSStefano Zampini     *newmat = B;
45b49cda9fSStefano Zampini   }
46b49cda9fSStefano Zampini   PetscFunctionReturn(0);
47b49cda9fSStefano Zampini }
48b49cda9fSStefano Zampini 
49b49cda9fSStefano Zampini #undef __FUNCT__
506a63e612SBarry Smith #define __FUNCT__ "MatConvert_SeqDense_SeqAIJ"
518cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatConvert_SeqDense_SeqAIJ(Mat A, MatType newtype,MatReuse reuse,Mat *newmat)
526a63e612SBarry Smith {
536a63e612SBarry Smith   Mat            B;
546a63e612SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
556a63e612SBarry Smith   PetscErrorCode ierr;
569399e1b8SMatthew G. Knepley   PetscInt       i, j;
579399e1b8SMatthew G. Knepley   PetscInt       *rows, *nnz;
589399e1b8SMatthew G. Knepley   MatScalar      *aa = a->v, *vals;
596a63e612SBarry Smith 
606a63e612SBarry Smith   PetscFunctionBegin;
61ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr);
626a63e612SBarry Smith   ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr);
636a63e612SBarry Smith   ierr = MatSetType(B,MATSEQAIJ);CHKERRQ(ierr);
649399e1b8SMatthew G. Knepley   ierr = PetscCalloc3(A->rmap->n,&rows,A->rmap->n,&nnz,A->rmap->n,&vals);CHKERRQ(ierr);
659399e1b8SMatthew G. Knepley   for (j=0; j<A->cmap->n; j++) {
669399e1b8SMatthew G. Knepley     for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) ++nnz[i];
676a63e612SBarry Smith     aa += a->lda;
686a63e612SBarry Smith   }
699399e1b8SMatthew G. Knepley   ierr = MatSeqAIJSetPreallocation(B,PETSC_DETERMINE,nnz);CHKERRQ(ierr);
709399e1b8SMatthew G. Knepley   aa = a->v;
719399e1b8SMatthew G. Knepley   for (j=0; j<A->cmap->n; j++) {
729399e1b8SMatthew G. Knepley     PetscInt numRows = 0;
739399e1b8SMatthew G. Knepley     for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) {rows[numRows] = i; vals[numRows++] = aa[i];}
749399e1b8SMatthew G. Knepley     ierr = MatSetValues(B,numRows,rows,1,&j,vals,INSERT_VALUES);CHKERRQ(ierr);
759399e1b8SMatthew G. Knepley     aa  += a->lda;
769399e1b8SMatthew G. Knepley   }
779399e1b8SMatthew G. Knepley   ierr = PetscFree3(rows,nnz,vals);CHKERRQ(ierr);
786a63e612SBarry Smith   ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
796a63e612SBarry Smith   ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
806a63e612SBarry Smith 
816a63e612SBarry Smith   if (reuse == MAT_REUSE_MATRIX) {
826a63e612SBarry Smith     ierr = MatHeaderReplace(A,B);CHKERRQ(ierr);
836a63e612SBarry Smith   } else {
846a63e612SBarry Smith     *newmat = B;
856a63e612SBarry Smith   }
866a63e612SBarry Smith   PetscFunctionReturn(0);
876a63e612SBarry Smith }
886a63e612SBarry Smith 
894a2ae208SSatish Balay #undef __FUNCT__
904a2ae208SSatish Balay #define __FUNCT__ "MatAXPY_SeqDense"
91f4df32b1SMatthew Knepley PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str)
921987afe7SBarry Smith {
931987afe7SBarry Smith   Mat_SeqDense   *x     = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data;
94f4df32b1SMatthew Knepley   PetscScalar    oalpha = alpha;
9513f74950SBarry Smith   PetscInt       j;
960805154bSBarry Smith   PetscBLASInt   N,m,ldax,lday,one = 1;
97efee365bSSatish Balay   PetscErrorCode ierr;
983a40ed3dSBarry Smith 
993a40ed3dSBarry Smith   PetscFunctionBegin;
100c5df96a5SBarry Smith   ierr = PetscBLASIntCast(X->rmap->n*X->cmap->n,&N);CHKERRQ(ierr);
101c5df96a5SBarry Smith   ierr = PetscBLASIntCast(X->rmap->n,&m);CHKERRQ(ierr);
102c5df96a5SBarry Smith   ierr = PetscBLASIntCast(x->lda,&ldax);CHKERRQ(ierr);
103c5df96a5SBarry Smith   ierr = PetscBLASIntCast(y->lda,&lday);CHKERRQ(ierr);
104a5ce6ee0Svictorle   if (ldax>m || lday>m) {
105d0f46423SBarry Smith     for (j=0; j<X->cmap->n; j++) {
1068b83055fSJed Brown       PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&m,&oalpha,x->v+j*ldax,&one,y->v+j*lday,&one));
107a5ce6ee0Svictorle     }
108a5ce6ee0Svictorle   } else {
1098b83055fSJed Brown     PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&N,&oalpha,x->v,&one,y->v,&one));
110a5ce6ee0Svictorle   }
111a3fa217bSJose E. Roman   ierr = PetscObjectStateIncrease((PetscObject)Y);CHKERRQ(ierr);
1120450473dSBarry Smith   ierr = PetscLogFlops(PetscMax(2*N-1,0));CHKERRQ(ierr);
1133a40ed3dSBarry Smith   PetscFunctionReturn(0);
1141987afe7SBarry Smith }
1151987afe7SBarry Smith 
1164a2ae208SSatish Balay #undef __FUNCT__
1174a2ae208SSatish Balay #define __FUNCT__ "MatGetInfo_SeqDense"
118dfbe8321SBarry Smith PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info)
119289bc588SBarry Smith {
120d0f46423SBarry Smith   PetscInt N = A->rmap->n*A->cmap->n;
1213a40ed3dSBarry Smith 
1223a40ed3dSBarry Smith   PetscFunctionBegin;
1234e220ebcSLois Curfman McInnes   info->block_size        = 1.0;
1244e220ebcSLois Curfman McInnes   info->nz_allocated      = (double)N;
1256de62eeeSBarry Smith   info->nz_used           = (double)N;
1266de62eeeSBarry Smith   info->nz_unneeded       = (double)0;
1274e220ebcSLois Curfman McInnes   info->assemblies        = (double)A->num_ass;
1284e220ebcSLois Curfman McInnes   info->mallocs           = 0;
1297adad957SLisandro Dalcin   info->memory            = ((PetscObject)A)->mem;
1304e220ebcSLois Curfman McInnes   info->fill_ratio_given  = 0;
1314e220ebcSLois Curfman McInnes   info->fill_ratio_needed = 0;
1324e220ebcSLois Curfman McInnes   info->factor_mallocs    = 0;
1333a40ed3dSBarry Smith   PetscFunctionReturn(0);
134289bc588SBarry Smith }
135289bc588SBarry Smith 
1364a2ae208SSatish Balay #undef __FUNCT__
1374a2ae208SSatish Balay #define __FUNCT__ "MatScale_SeqDense"
138f4df32b1SMatthew Knepley PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha)
13980cd9d93SLois Curfman McInnes {
140273d9f13SBarry Smith   Mat_SeqDense   *a     = (Mat_SeqDense*)A->data;
141f4df32b1SMatthew Knepley   PetscScalar    oalpha = alpha;
142efee365bSSatish Balay   PetscErrorCode ierr;
143c5df96a5SBarry Smith   PetscBLASInt   one = 1,j,nz,lda;
14480cd9d93SLois Curfman McInnes 
1453a40ed3dSBarry Smith   PetscFunctionBegin;
146c5df96a5SBarry Smith   ierr = PetscBLASIntCast(a->lda,&lda);CHKERRQ(ierr);
147d0f46423SBarry Smith   if (lda>A->rmap->n) {
148c5df96a5SBarry Smith     ierr = PetscBLASIntCast(A->rmap->n,&nz);CHKERRQ(ierr);
149d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1508b83055fSJed Brown       PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v+j*lda,&one));
151a5ce6ee0Svictorle     }
152a5ce6ee0Svictorle   } else {
153c5df96a5SBarry Smith     ierr = PetscBLASIntCast(A->rmap->n*A->cmap->n,&nz);CHKERRQ(ierr);
1548b83055fSJed Brown     PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v,&one));
155a5ce6ee0Svictorle   }
156efee365bSSatish Balay   ierr = PetscLogFlops(nz);CHKERRQ(ierr);
1573a40ed3dSBarry Smith   PetscFunctionReturn(0);
15880cd9d93SLois Curfman McInnes }
15980cd9d93SLois Curfman McInnes 
1601cbb95d3SBarry Smith #undef __FUNCT__
1611cbb95d3SBarry Smith #define __FUNCT__ "MatIsHermitian_SeqDense"
162ace3abfcSBarry Smith PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscBool  *fl)
1631cbb95d3SBarry Smith {
1641cbb95d3SBarry Smith   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
165d0f46423SBarry Smith   PetscInt     i,j,m = A->rmap->n,N;
1661cbb95d3SBarry Smith   PetscScalar  *v = a->v;
1671cbb95d3SBarry Smith 
1681cbb95d3SBarry Smith   PetscFunctionBegin;
1691cbb95d3SBarry Smith   *fl = PETSC_FALSE;
170d0f46423SBarry Smith   if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0);
1711cbb95d3SBarry Smith   N = a->lda;
1721cbb95d3SBarry Smith 
1731cbb95d3SBarry Smith   for (i=0; i<m; i++) {
1741cbb95d3SBarry Smith     for (j=i+1; j<m; j++) {
1751cbb95d3SBarry Smith       if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) PetscFunctionReturn(0);
1761cbb95d3SBarry Smith     }
1771cbb95d3SBarry Smith   }
1781cbb95d3SBarry Smith   *fl = PETSC_TRUE;
1791cbb95d3SBarry Smith   PetscFunctionReturn(0);
1801cbb95d3SBarry Smith }
1811cbb95d3SBarry Smith 
182b24902e0SBarry Smith #undef __FUNCT__
183b24902e0SBarry Smith #define __FUNCT__ "MatDuplicateNoCreate_SeqDense"
184719d5645SBarry Smith PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat newi,Mat A,MatDuplicateOption cpvalues)
185b24902e0SBarry Smith {
186b24902e0SBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data,*l;
187b24902e0SBarry Smith   PetscErrorCode ierr;
188b24902e0SBarry Smith   PetscInt       lda = (PetscInt)mat->lda,j,m;
189b24902e0SBarry Smith 
190b24902e0SBarry Smith   PetscFunctionBegin;
191aa5ea44dSBarry Smith   ierr = PetscLayoutReference(A->rmap,&newi->rmap);CHKERRQ(ierr);
192aa5ea44dSBarry Smith   ierr = PetscLayoutReference(A->cmap,&newi->cmap);CHKERRQ(ierr);
1930298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(newi,NULL);CHKERRQ(ierr);
194b24902e0SBarry Smith   if (cpvalues == MAT_COPY_VALUES) {
195b24902e0SBarry Smith     l = (Mat_SeqDense*)newi->data;
196d0f46423SBarry Smith     if (lda>A->rmap->n) {
197d0f46423SBarry Smith       m = A->rmap->n;
198d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
199b24902e0SBarry Smith         ierr = PetscMemcpy(l->v+j*m,mat->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
200b24902e0SBarry Smith       }
201b24902e0SBarry Smith     } else {
202d0f46423SBarry Smith       ierr = PetscMemcpy(l->v,mat->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
203b24902e0SBarry Smith     }
204b24902e0SBarry Smith   }
205b24902e0SBarry Smith   newi->assembled = PETSC_TRUE;
206b24902e0SBarry Smith   PetscFunctionReturn(0);
207b24902e0SBarry Smith }
208b24902e0SBarry Smith 
2094a2ae208SSatish Balay #undef __FUNCT__
2104a2ae208SSatish Balay #define __FUNCT__ "MatDuplicate_SeqDense"
211dfbe8321SBarry Smith PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat)
21202cad45dSBarry Smith {
2136849ba73SBarry Smith   PetscErrorCode ierr;
21402cad45dSBarry Smith 
2153a40ed3dSBarry Smith   PetscFunctionBegin;
216ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),newmat);CHKERRQ(ierr);
217d0f46423SBarry Smith   ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
2185c9eb25fSBarry Smith   ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
219719d5645SBarry Smith   ierr = MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues);CHKERRQ(ierr);
220b24902e0SBarry Smith   PetscFunctionReturn(0);
221b24902e0SBarry Smith }
222b24902e0SBarry Smith 
2236ee01492SSatish Balay 
2240481f469SBarry Smith extern PetscErrorCode MatLUFactor_SeqDense(Mat,IS,IS,const MatFactorInfo*);
225719d5645SBarry Smith 
2264a2ae208SSatish Balay #undef __FUNCT__
2274a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorNumeric_SeqDense"
2280481f469SBarry Smith PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
229289bc588SBarry Smith {
2304482741eSBarry Smith   MatFactorInfo  info;
231a093e273SMatthew Knepley   PetscErrorCode ierr;
2323a40ed3dSBarry Smith 
2333a40ed3dSBarry Smith   PetscFunctionBegin;
234c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
235719d5645SBarry Smith   ierr = MatLUFactor_SeqDense(fact,0,0,&info);CHKERRQ(ierr);
2363a40ed3dSBarry Smith   PetscFunctionReturn(0);
237289bc588SBarry Smith }
2386ee01492SSatish Balay 
2390b4b3355SBarry Smith #undef __FUNCT__
2404a2ae208SSatish Balay #define __FUNCT__ "MatSolve_SeqDense"
241dfbe8321SBarry Smith PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy)
242289bc588SBarry Smith {
243c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
2446849ba73SBarry Smith   PetscErrorCode    ierr;
245f1ceaac6SMatthew G. Knepley   const PetscScalar *x;
246f1ceaac6SMatthew G. Knepley   PetscScalar       *y;
247c5df96a5SBarry Smith   PetscBLASInt      one = 1,info,m;
24867e560aaSBarry Smith 
2493a40ed3dSBarry Smith   PetscFunctionBegin;
250c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
251f1ceaac6SMatthew G. Knepley   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
2521ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
253d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
254d5f3da31SBarry Smith   if (A->factortype == MAT_FACTOR_LU) {
255ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
256e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
257ae7cfcebSSatish Balay #else
2588b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
259e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
260ae7cfcebSSatish Balay #endif
261d5f3da31SBarry Smith   } else if (A->factortype == MAT_FACTOR_CHOLESKY) {
262ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
263e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
264ae7cfcebSSatish Balay #else
2658b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
266e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
267ae7cfcebSSatish Balay #endif
2682205254eSKarl Rupp   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
269f1ceaac6SMatthew G. Knepley   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
2701ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
271dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
2723a40ed3dSBarry Smith   PetscFunctionReturn(0);
273289bc588SBarry Smith }
2746ee01492SSatish Balay 
2754a2ae208SSatish Balay #undef __FUNCT__
27685e2c93fSHong Zhang #define __FUNCT__ "MatMatSolve_SeqDense"
27785e2c93fSHong Zhang PetscErrorCode MatMatSolve_SeqDense(Mat A,Mat B,Mat X)
27885e2c93fSHong Zhang {
27985e2c93fSHong Zhang   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
28085e2c93fSHong Zhang   PetscErrorCode ierr;
28185e2c93fSHong Zhang   PetscScalar    *b,*x;
282efb80c78SLisandro Dalcin   PetscInt       n;
283783b601eSJed Brown   PetscBLASInt   nrhs,info,m;
284bda8bf91SBarry Smith   PetscBool      flg;
28585e2c93fSHong Zhang 
28685e2c93fSHong Zhang   PetscFunctionBegin;
287c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
2880298fd71SBarry Smith   ierr = PetscObjectTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr);
289ce94432eSBarry Smith   if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix B must be MATDENSE matrix");
2900298fd71SBarry Smith   ierr = PetscObjectTypeCompareAny((PetscObject)X,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr);
291ce94432eSBarry Smith   if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix X must be MATDENSE matrix");
292bda8bf91SBarry Smith 
2930298fd71SBarry Smith   ierr = MatGetSize(B,NULL,&n);CHKERRQ(ierr);
294c5df96a5SBarry Smith   ierr = PetscBLASIntCast(n,&nrhs);CHKERRQ(ierr);
2958c778c55SBarry Smith   ierr = MatDenseGetArray(B,&b);CHKERRQ(ierr);
2968c778c55SBarry Smith   ierr = MatDenseGetArray(X,&x);CHKERRQ(ierr);
29785e2c93fSHong Zhang 
298f272c775SHong Zhang   ierr = PetscMemcpy(x,b,m*nrhs*sizeof(PetscScalar));CHKERRQ(ierr);
29985e2c93fSHong Zhang 
30085e2c93fSHong Zhang   if (A->factortype == MAT_FACTOR_LU) {
30185e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_GETRS)
30285e2c93fSHong Zhang     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
30385e2c93fSHong Zhang #else
3048b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info));
30585e2c93fSHong Zhang     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
30685e2c93fSHong Zhang #endif
30785e2c93fSHong Zhang   } else if (A->factortype == MAT_FACTOR_CHOLESKY) {
30885e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_POTRS)
30985e2c93fSHong Zhang     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
31085e2c93fSHong Zhang #else
3118b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info));
31285e2c93fSHong Zhang     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
31385e2c93fSHong Zhang #endif
3142205254eSKarl Rupp   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
31585e2c93fSHong Zhang 
3168c778c55SBarry Smith   ierr = MatDenseRestoreArray(B,&b);CHKERRQ(ierr);
3178c778c55SBarry Smith   ierr = MatDenseRestoreArray(X,&x);CHKERRQ(ierr);
31885e2c93fSHong Zhang   ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr);
31985e2c93fSHong Zhang   PetscFunctionReturn(0);
32085e2c93fSHong Zhang }
32185e2c93fSHong Zhang 
32285e2c93fSHong Zhang #undef __FUNCT__
3234a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense"
324dfbe8321SBarry Smith PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy)
325da3a660dSBarry Smith {
326c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
327dfbe8321SBarry Smith   PetscErrorCode    ierr;
328f1ceaac6SMatthew G. Knepley   const PetscScalar *x;
329f1ceaac6SMatthew G. Knepley   PetscScalar       *y;
330c5df96a5SBarry Smith   PetscBLASInt      one = 1,info,m;
33167e560aaSBarry Smith 
3323a40ed3dSBarry Smith   PetscFunctionBegin;
333c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
334f1ceaac6SMatthew G. Knepley   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
3351ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
336d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
337752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
338da3a660dSBarry Smith   if (mat->pivots) {
339ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
340e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
341ae7cfcebSSatish Balay #else
3428b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
343e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve");
344ae7cfcebSSatish Balay #endif
3457a97a34bSBarry Smith   } else {
346ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
347e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
348ae7cfcebSSatish Balay #else
3498b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
350e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve");
351ae7cfcebSSatish Balay #endif
352da3a660dSBarry Smith   }
353f1ceaac6SMatthew G. Knepley   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
3541ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
355dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
3563a40ed3dSBarry Smith   PetscFunctionReturn(0);
357da3a660dSBarry Smith }
3586ee01492SSatish Balay 
3594a2ae208SSatish Balay #undef __FUNCT__
3604a2ae208SSatish Balay #define __FUNCT__ "MatSolveAdd_SeqDense"
361dfbe8321SBarry Smith PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
362da3a660dSBarry Smith {
363c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
364dfbe8321SBarry Smith   PetscErrorCode    ierr;
365f1ceaac6SMatthew G. Knepley   const PetscScalar *x;
366f1ceaac6SMatthew G. Knepley   PetscScalar       *y,sone = 1.0;
367da3a660dSBarry Smith   Vec               tmp = 0;
368c5df96a5SBarry Smith   PetscBLASInt      one = 1,info,m;
36967e560aaSBarry Smith 
3703a40ed3dSBarry Smith   PetscFunctionBegin;
371c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
372f1ceaac6SMatthew G. Knepley   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
3731ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
374d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
375da3a660dSBarry Smith   if (yy == zz) {
37678b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
3773bb1ff40SBarry Smith     ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr);
37878b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
379da3a660dSBarry Smith   }
380d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
381752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
382da3a660dSBarry Smith   if (mat->pivots) {
383ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
384e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
385ae7cfcebSSatish Balay #else
3868b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
387e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
388ae7cfcebSSatish Balay #endif
389a8c6a408SBarry Smith   } else {
390ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
391e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
392ae7cfcebSSatish Balay #else
3938b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
394e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
395ae7cfcebSSatish Balay #endif
396da3a660dSBarry Smith   }
3976bf464f9SBarry Smith   if (tmp) {
3986bf464f9SBarry Smith     ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr);
3996bf464f9SBarry Smith     ierr = VecDestroy(&tmp);CHKERRQ(ierr);
4006bf464f9SBarry Smith   } else {
4016bf464f9SBarry Smith     ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);
4026bf464f9SBarry Smith   }
403f1ceaac6SMatthew G. Knepley   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
4041ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
405dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
4063a40ed3dSBarry Smith   PetscFunctionReturn(0);
407da3a660dSBarry Smith }
40867e560aaSBarry Smith 
4094a2ae208SSatish Balay #undef __FUNCT__
4104a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense"
411dfbe8321SBarry Smith PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
412da3a660dSBarry Smith {
413c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
4146849ba73SBarry Smith   PetscErrorCode    ierr;
415f1ceaac6SMatthew G. Knepley   const PetscScalar *x;
416f1ceaac6SMatthew G. Knepley   PetscScalar       *y,sone = 1.0;
417da3a660dSBarry Smith   Vec               tmp;
418c5df96a5SBarry Smith   PetscBLASInt      one = 1,info,m;
41967e560aaSBarry Smith 
4203a40ed3dSBarry Smith   PetscFunctionBegin;
421c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
422d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
423f1ceaac6SMatthew G. Knepley   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
4241ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
425da3a660dSBarry Smith   if (yy == zz) {
42678b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
4273bb1ff40SBarry Smith     ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr);
42878b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
429da3a660dSBarry Smith   }
430d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
431752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
432da3a660dSBarry Smith   if (mat->pivots) {
433ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
434e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
435ae7cfcebSSatish Balay #else
4368b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
437e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
438ae7cfcebSSatish Balay #endif
4393a40ed3dSBarry Smith   } else {
440ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
441e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
442ae7cfcebSSatish Balay #else
4438b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
444e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
445ae7cfcebSSatish Balay #endif
446da3a660dSBarry Smith   }
44790f02eecSBarry Smith   if (tmp) {
4482dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr);
4496bf464f9SBarry Smith     ierr = VecDestroy(&tmp);CHKERRQ(ierr);
4503a40ed3dSBarry Smith   } else {
4512dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);
45290f02eecSBarry Smith   }
453f1ceaac6SMatthew G. Knepley   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
4541ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
455dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
4563a40ed3dSBarry Smith   PetscFunctionReturn(0);
457da3a660dSBarry Smith }
458db4efbfdSBarry Smith 
459db4efbfdSBarry Smith /* ---------------------------------------------------------------*/
460db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots,
461db4efbfdSBarry Smith    rather than put it in the Mat->row slot.*/
462db4efbfdSBarry Smith #undef __FUNCT__
463db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactor_SeqDense"
4640481f469SBarry Smith PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo)
465db4efbfdSBarry Smith {
466db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF)
467db4efbfdSBarry Smith   PetscFunctionBegin;
468e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable.");
469db4efbfdSBarry Smith #else
470db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
471db4efbfdSBarry Smith   PetscErrorCode ierr;
472db4efbfdSBarry Smith   PetscBLASInt   n,m,info;
473db4efbfdSBarry Smith 
474db4efbfdSBarry Smith   PetscFunctionBegin;
475c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
476c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
477db4efbfdSBarry Smith   if (!mat->pivots) {
478854ce69bSBarry Smith     ierr = PetscMalloc1(A->rmap->n+1,&mat->pivots);CHKERRQ(ierr);
4793bb1ff40SBarry Smith     ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr);
480db4efbfdSBarry Smith   }
481db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
4828e57ea43SSatish Balay   ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
4838b83055fSJed Brown   PetscStackCallBLAS("LAPACKgetrf",LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info));
4848e57ea43SSatish Balay   ierr = PetscFPTrapPop();CHKERRQ(ierr);
4858e57ea43SSatish Balay 
486e32f2f54SBarry Smith   if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization");
487e32f2f54SBarry Smith   if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization");
488db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
489db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
490db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
491db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
492d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_LU;
493db4efbfdSBarry Smith 
494dc0b31edSSatish Balay   ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr);
495db4efbfdSBarry Smith #endif
496db4efbfdSBarry Smith   PetscFunctionReturn(0);
497db4efbfdSBarry Smith }
498db4efbfdSBarry Smith 
499db4efbfdSBarry Smith #undef __FUNCT__
500db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactor_SeqDense"
5010481f469SBarry Smith PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo)
502db4efbfdSBarry Smith {
503db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF)
504db4efbfdSBarry Smith   PetscFunctionBegin;
505e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable.");
506db4efbfdSBarry Smith #else
507db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
508db4efbfdSBarry Smith   PetscErrorCode ierr;
509c5df96a5SBarry Smith   PetscBLASInt   info,n;
510db4efbfdSBarry Smith 
511db4efbfdSBarry Smith   PetscFunctionBegin;
512c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
513db4efbfdSBarry Smith   ierr = PetscFree(mat->pivots);CHKERRQ(ierr);
514db4efbfdSBarry Smith 
515db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
5168b83055fSJed Brown   PetscStackCallBLAS("LAPACKpotrf",LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info));
517e32f2f54SBarry Smith   if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1);
518db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
519db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
520db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
521db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
522d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_CHOLESKY;
5232205254eSKarl Rupp 
524eb3f19e4SBarry Smith   ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr);
525db4efbfdSBarry Smith #endif
526db4efbfdSBarry Smith   PetscFunctionReturn(0);
527db4efbfdSBarry Smith }
528db4efbfdSBarry Smith 
529db4efbfdSBarry Smith 
530db4efbfdSBarry Smith #undef __FUNCT__
531db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense"
5320481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
533db4efbfdSBarry Smith {
534db4efbfdSBarry Smith   PetscErrorCode ierr;
535db4efbfdSBarry Smith   MatFactorInfo  info;
536db4efbfdSBarry Smith 
537db4efbfdSBarry Smith   PetscFunctionBegin;
538db4efbfdSBarry Smith   info.fill = 1.0;
5392205254eSKarl Rupp 
540c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
541719d5645SBarry Smith   ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr);
542db4efbfdSBarry Smith   PetscFunctionReturn(0);
543db4efbfdSBarry Smith }
544db4efbfdSBarry Smith 
545db4efbfdSBarry Smith #undef __FUNCT__
546db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense"
5470481f469SBarry Smith PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info)
548db4efbfdSBarry Smith {
549db4efbfdSBarry Smith   PetscFunctionBegin;
550c3ef05f6SHong Zhang   fact->assembled                  = PETSC_TRUE;
5511bbcc794SSatish Balay   fact->preallocated               = PETSC_TRUE;
552719d5645SBarry Smith   fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense;
553db4efbfdSBarry Smith   PetscFunctionReturn(0);
554db4efbfdSBarry Smith }
555db4efbfdSBarry Smith 
556db4efbfdSBarry Smith #undef __FUNCT__
557db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactorSymbolic_SeqDense"
5580481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info)
559db4efbfdSBarry Smith {
560db4efbfdSBarry Smith   PetscFunctionBegin;
561b66fe19dSMatthew G Knepley   fact->preallocated         = PETSC_TRUE;
562c3ef05f6SHong Zhang   fact->assembled            = PETSC_TRUE;
563719d5645SBarry Smith   fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense;
564db4efbfdSBarry Smith   PetscFunctionReturn(0);
565db4efbfdSBarry Smith }
566db4efbfdSBarry Smith 
567db4efbfdSBarry Smith #undef __FUNCT__
568db4efbfdSBarry Smith #define __FUNCT__ "MatGetFactor_seqdense_petsc"
5698cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact)
570db4efbfdSBarry Smith {
571db4efbfdSBarry Smith   PetscErrorCode ierr;
572db4efbfdSBarry Smith 
573db4efbfdSBarry Smith   PetscFunctionBegin;
574ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),fact);CHKERRQ(ierr);
575db4efbfdSBarry Smith   ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
576db4efbfdSBarry Smith   ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr);
577db4efbfdSBarry Smith   if (ftype == MAT_FACTOR_LU) {
578db4efbfdSBarry Smith     (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense;
579db4efbfdSBarry Smith   } else {
580db4efbfdSBarry Smith     (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense;
581db4efbfdSBarry Smith   }
582d5f3da31SBarry Smith   (*fact)->factortype = ftype;
583db4efbfdSBarry Smith   PetscFunctionReturn(0);
584db4efbfdSBarry Smith }
585db4efbfdSBarry Smith 
586289bc588SBarry Smith /* ------------------------------------------------------------------*/
5874a2ae208SSatish Balay #undef __FUNCT__
58841f059aeSBarry Smith #define __FUNCT__ "MatSOR_SeqDense"
58941f059aeSBarry Smith PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx)
590289bc588SBarry Smith {
591c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
592d9ca1df4SBarry Smith   PetscScalar       *x,*v = mat->v,zero = 0.0,xt;
593d9ca1df4SBarry Smith   const PetscScalar *b;
594dfbe8321SBarry Smith   PetscErrorCode    ierr;
595d0f46423SBarry Smith   PetscInt          m = A->rmap->n,i;
596c5df96a5SBarry Smith   PetscBLASInt      o = 1,bm;
597289bc588SBarry Smith 
5983a40ed3dSBarry Smith   PetscFunctionBegin;
599422a814eSBarry Smith   if (shift == -1) shift = 0.0; /* negative shift indicates do not error on zero diagonal; this code never zeros on zero diagonal */
600c5df96a5SBarry Smith   ierr = PetscBLASIntCast(m,&bm);CHKERRQ(ierr);
601289bc588SBarry Smith   if (flag & SOR_ZERO_INITIAL_GUESS) {
60271044d3cSBarry Smith     /* this is a hack fix, should have another version without the second BLASdot */
6032dcb1b2aSMatthew Knepley     ierr = VecSet(xx,zero);CHKERRQ(ierr);
604289bc588SBarry Smith   }
6051ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
606d9ca1df4SBarry Smith   ierr = VecGetArrayRead(bb,&b);CHKERRQ(ierr);
607b965ef7fSBarry Smith   its  = its*lits;
608e32f2f54SBarry Smith   if (its <= 0) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Relaxation requires global its %D and local its %D both positive",its,lits);
609289bc588SBarry Smith   while (its--) {
610fccaa45eSBarry Smith     if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) {
611289bc588SBarry Smith       for (i=0; i<m; i++) {
6128b83055fSJed Brown         PetscStackCallBLAS("BLASdot",xt   = b[i] - BLASdot_(&bm,v+i,&bm,x,&o));
61355a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
614289bc588SBarry Smith       }
615289bc588SBarry Smith     }
616fccaa45eSBarry Smith     if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) {
617289bc588SBarry Smith       for (i=m-1; i>=0; i--) {
6188b83055fSJed Brown         PetscStackCallBLAS("BLASdot",xt   = b[i] - BLASdot_(&bm,v+i,&bm,x,&o));
61955a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
620289bc588SBarry Smith       }
621289bc588SBarry Smith     }
622289bc588SBarry Smith   }
623d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(bb,&b);CHKERRQ(ierr);
6241ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6253a40ed3dSBarry Smith   PetscFunctionReturn(0);
626289bc588SBarry Smith }
627289bc588SBarry Smith 
628289bc588SBarry Smith /* -----------------------------------------------------------------*/
6294a2ae208SSatish Balay #undef __FUNCT__
6304a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense"
631dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy)
632289bc588SBarry Smith {
633c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
634d9ca1df4SBarry Smith   const PetscScalar *v   = mat->v,*x;
635d9ca1df4SBarry Smith   PetscScalar       *y;
636dfbe8321SBarry Smith   PetscErrorCode    ierr;
6370805154bSBarry Smith   PetscBLASInt      m, n,_One=1;
638ea709b57SSatish Balay   PetscScalar       _DOne=1.0,_DZero=0.0;
6393a40ed3dSBarry Smith 
6403a40ed3dSBarry Smith   PetscFunctionBegin;
641c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
642c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
643d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
644d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
6451ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
6468b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One));
647d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
6481ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
649dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
6503a40ed3dSBarry Smith   PetscFunctionReturn(0);
651289bc588SBarry Smith }
652800995b7SMatthew Knepley 
6534a2ae208SSatish Balay #undef __FUNCT__
6544a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense"
655dfbe8321SBarry Smith PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy)
656289bc588SBarry Smith {
657c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
658d9ca1df4SBarry Smith   PetscScalar       *y,_DOne=1.0,_DZero=0.0;
659dfbe8321SBarry Smith   PetscErrorCode    ierr;
6600805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
661d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
6623a40ed3dSBarry Smith 
6633a40ed3dSBarry Smith   PetscFunctionBegin;
664c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
665c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
666d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
667d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
6681ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
6698b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One));
670d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
6711ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
672dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr);
6733a40ed3dSBarry Smith   PetscFunctionReturn(0);
674289bc588SBarry Smith }
6756ee01492SSatish Balay 
6764a2ae208SSatish Balay #undef __FUNCT__
6774a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense"
678dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
679289bc588SBarry Smith {
680c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
681d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
682d9ca1df4SBarry Smith   PetscScalar       *y,_DOne=1.0;
683dfbe8321SBarry Smith   PetscErrorCode    ierr;
6840805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
6853a40ed3dSBarry Smith 
6863a40ed3dSBarry Smith   PetscFunctionBegin;
687c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
688c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
689d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
690600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
691d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
6921ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
6938b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
694d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
6951ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
696dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
6973a40ed3dSBarry Smith   PetscFunctionReturn(0);
698289bc588SBarry Smith }
6996ee01492SSatish Balay 
7004a2ae208SSatish Balay #undef __FUNCT__
7014a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense"
702dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
703289bc588SBarry Smith {
704c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
705d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
706d9ca1df4SBarry Smith   PetscScalar       *y;
707dfbe8321SBarry Smith   PetscErrorCode    ierr;
7080805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
70987828ca2SBarry Smith   PetscScalar       _DOne=1.0;
7103a40ed3dSBarry Smith 
7113a40ed3dSBarry Smith   PetscFunctionBegin;
712c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
713c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
714d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
715600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
716d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
7171ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
7188b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
719d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
7201ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
721dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
7223a40ed3dSBarry Smith   PetscFunctionReturn(0);
723289bc588SBarry Smith }
724289bc588SBarry Smith 
725289bc588SBarry Smith /* -----------------------------------------------------------------*/
7264a2ae208SSatish Balay #undef __FUNCT__
7274a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense"
72813f74950SBarry Smith PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
729289bc588SBarry Smith {
730c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
73187828ca2SBarry Smith   PetscScalar    *v;
7326849ba73SBarry Smith   PetscErrorCode ierr;
73313f74950SBarry Smith   PetscInt       i;
73467e560aaSBarry Smith 
7353a40ed3dSBarry Smith   PetscFunctionBegin;
736d0f46423SBarry Smith   *ncols = A->cmap->n;
737289bc588SBarry Smith   if (cols) {
738854ce69bSBarry Smith     ierr = PetscMalloc1(A->cmap->n+1,cols);CHKERRQ(ierr);
739d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) (*cols)[i] = i;
740289bc588SBarry Smith   }
741289bc588SBarry Smith   if (vals) {
742854ce69bSBarry Smith     ierr = PetscMalloc1(A->cmap->n+1,vals);CHKERRQ(ierr);
743289bc588SBarry Smith     v    = mat->v + row;
744d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;}
745289bc588SBarry Smith   }
7463a40ed3dSBarry Smith   PetscFunctionReturn(0);
747289bc588SBarry Smith }
7486ee01492SSatish Balay 
7494a2ae208SSatish Balay #undef __FUNCT__
7504a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense"
75113f74950SBarry Smith PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
752289bc588SBarry Smith {
753dfbe8321SBarry Smith   PetscErrorCode ierr;
7546e111a19SKarl Rupp 
755606d414cSSatish Balay   PetscFunctionBegin;
756606d414cSSatish Balay   if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);}
757606d414cSSatish Balay   if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); }
7583a40ed3dSBarry Smith   PetscFunctionReturn(0);
759289bc588SBarry Smith }
760289bc588SBarry Smith /* ----------------------------------------------------------------*/
7614a2ae208SSatish Balay #undef __FUNCT__
7624a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense"
76313f74950SBarry Smith PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv)
764289bc588SBarry Smith {
765c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
76613f74950SBarry Smith   PetscInt     i,j,idx=0;
767d6dfbf8fSBarry Smith 
7683a40ed3dSBarry Smith   PetscFunctionBegin;
769289bc588SBarry Smith   if (!mat->roworiented) {
770dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
771289bc588SBarry Smith       for (j=0; j<n; j++) {
772cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
7732515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
774e32f2f54SBarry Smith         if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1);
77558804f6dSBarry Smith #endif
776289bc588SBarry Smith         for (i=0; i<m; i++) {
777cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
7782515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
779e32f2f54SBarry Smith           if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
78058804f6dSBarry Smith #endif
781cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
782289bc588SBarry Smith         }
783289bc588SBarry Smith       }
7843a40ed3dSBarry Smith     } else {
785289bc588SBarry Smith       for (j=0; j<n; j++) {
786cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
7872515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
788e32f2f54SBarry Smith         if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1);
78958804f6dSBarry Smith #endif
790289bc588SBarry Smith         for (i=0; i<m; i++) {
791cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
7922515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
793e32f2f54SBarry Smith           if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
79458804f6dSBarry Smith #endif
795cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
796289bc588SBarry Smith         }
797289bc588SBarry Smith       }
798289bc588SBarry Smith     }
7993a40ed3dSBarry Smith   } else {
800dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
801e8d4e0b9SBarry Smith       for (i=0; i<m; i++) {
802cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
8032515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
804e32f2f54SBarry Smith         if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
80558804f6dSBarry Smith #endif
806e8d4e0b9SBarry Smith         for (j=0; j<n; j++) {
807cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
8082515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
809e32f2f54SBarry Smith           if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1);
81058804f6dSBarry Smith #endif
811cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
812e8d4e0b9SBarry Smith         }
813e8d4e0b9SBarry Smith       }
8143a40ed3dSBarry Smith     } else {
815289bc588SBarry Smith       for (i=0; i<m; i++) {
816cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
8172515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
818e32f2f54SBarry Smith         if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
81958804f6dSBarry Smith #endif
820289bc588SBarry Smith         for (j=0; j<n; j++) {
821cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
8222515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
823e32f2f54SBarry Smith           if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1);
82458804f6dSBarry Smith #endif
825cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
826289bc588SBarry Smith         }
827289bc588SBarry Smith       }
828289bc588SBarry Smith     }
829e8d4e0b9SBarry Smith   }
8303a40ed3dSBarry Smith   PetscFunctionReturn(0);
831289bc588SBarry Smith }
832e8d4e0b9SBarry Smith 
8334a2ae208SSatish Balay #undef __FUNCT__
8344a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense"
83513f74950SBarry Smith PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[])
836ae80bb75SLois Curfman McInnes {
837ae80bb75SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
83813f74950SBarry Smith   PetscInt     i,j;
839ae80bb75SLois Curfman McInnes 
8403a40ed3dSBarry Smith   PetscFunctionBegin;
841ae80bb75SLois Curfman McInnes   /* row-oriented output */
842ae80bb75SLois Curfman McInnes   for (i=0; i<m; i++) {
84397e567efSBarry Smith     if (indexm[i] < 0) {v += n;continue;}
844e32f2f54SBarry Smith     if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row %D requested larger than number rows %D",indexm[i],A->rmap->n);
845ae80bb75SLois Curfman McInnes     for (j=0; j<n; j++) {
8466f31f424SBarry Smith       if (indexn[j] < 0) {v++; continue;}
847e32f2f54SBarry Smith       if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column %D requested larger than number columns %D",indexn[j],A->cmap->n);
84897e567efSBarry Smith       *v++ = mat->v[indexn[j]*mat->lda + indexm[i]];
849ae80bb75SLois Curfman McInnes     }
850ae80bb75SLois Curfman McInnes   }
8513a40ed3dSBarry Smith   PetscFunctionReturn(0);
852ae80bb75SLois Curfman McInnes }
853ae80bb75SLois Curfman McInnes 
854289bc588SBarry Smith /* -----------------------------------------------------------------*/
855289bc588SBarry Smith 
8564a2ae208SSatish Balay #undef __FUNCT__
8575bba2384SShri Abhyankar #define __FUNCT__ "MatLoad_SeqDense"
858112444f4SShri Abhyankar PetscErrorCode MatLoad_SeqDense(Mat newmat,PetscViewer viewer)
859aabbc4fbSShri Abhyankar {
860aabbc4fbSShri Abhyankar   Mat_SeqDense   *a;
861aabbc4fbSShri Abhyankar   PetscErrorCode ierr;
862aabbc4fbSShri Abhyankar   PetscInt       *scols,i,j,nz,header[4];
863aabbc4fbSShri Abhyankar   int            fd;
864aabbc4fbSShri Abhyankar   PetscMPIInt    size;
865aabbc4fbSShri Abhyankar   PetscInt       *rowlengths = 0,M,N,*cols,grows,gcols;
866aabbc4fbSShri Abhyankar   PetscScalar    *vals,*svals,*v,*w;
867ce94432eSBarry Smith   MPI_Comm       comm;
868aabbc4fbSShri Abhyankar 
869aabbc4fbSShri Abhyankar   PetscFunctionBegin;
870c98fd787SBarry Smith   /* force binary viewer to load .info file if it has not yet done so */
871c98fd787SBarry Smith   ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr);
872ce94432eSBarry Smith   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
873aabbc4fbSShri Abhyankar   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
874aabbc4fbSShri Abhyankar   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor");
875aabbc4fbSShri Abhyankar   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
876aabbc4fbSShri Abhyankar   ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr);
877aabbc4fbSShri Abhyankar   if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object");
878aabbc4fbSShri Abhyankar   M = header[1]; N = header[2]; nz = header[3];
879aabbc4fbSShri Abhyankar 
880aabbc4fbSShri Abhyankar   /* set global size if not set already*/
881aabbc4fbSShri Abhyankar   if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) {
882aabbc4fbSShri Abhyankar     ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr);
883aabbc4fbSShri Abhyankar   } else {
884aabbc4fbSShri Abhyankar     /* if sizes and type are already set, check if the vector global sizes are correct */
885aabbc4fbSShri Abhyankar     ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr);
886aabbc4fbSShri Abhyankar     if (M != grows ||  N != gcols) SETERRQ4(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED, "Matrix in file of different length (%d, %d) than the input matrix (%d, %d)",M,N,grows,gcols);
887aabbc4fbSShri Abhyankar   }
888e6324fbbSBarry Smith   a = (Mat_SeqDense*)newmat->data;
889e6324fbbSBarry Smith   if (!a->user_alloc) {
8900298fd71SBarry Smith     ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr);
891e6324fbbSBarry Smith   }
892aabbc4fbSShri Abhyankar 
893aabbc4fbSShri Abhyankar   if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */
894aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
895aabbc4fbSShri Abhyankar     v = a->v;
896aabbc4fbSShri Abhyankar     /* Allocate some temp space to read in the values and then flip them
897aabbc4fbSShri Abhyankar        from row major to column major */
898854ce69bSBarry Smith     ierr = PetscMalloc1(M*N > 0 ? M*N : 1,&w);CHKERRQ(ierr);
899aabbc4fbSShri Abhyankar     /* read in nonzero values */
900aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr);
901aabbc4fbSShri Abhyankar     /* now flip the values and store them in the matrix*/
902aabbc4fbSShri Abhyankar     for (j=0; j<N; j++) {
903aabbc4fbSShri Abhyankar       for (i=0; i<M; i++) {
904aabbc4fbSShri Abhyankar         *v++ =w[i*N+j];
905aabbc4fbSShri Abhyankar       }
906aabbc4fbSShri Abhyankar     }
907aabbc4fbSShri Abhyankar     ierr = PetscFree(w);CHKERRQ(ierr);
908aabbc4fbSShri Abhyankar   } else {
909aabbc4fbSShri Abhyankar     /* read row lengths */
910854ce69bSBarry Smith     ierr = PetscMalloc1(M+1,&rowlengths);CHKERRQ(ierr);
911aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr);
912aabbc4fbSShri Abhyankar 
913aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
914aabbc4fbSShri Abhyankar     v = a->v;
915aabbc4fbSShri Abhyankar 
916aabbc4fbSShri Abhyankar     /* read column indices and nonzeros */
917854ce69bSBarry Smith     ierr = PetscMalloc1(nz+1,&scols);CHKERRQ(ierr);
918aabbc4fbSShri Abhyankar     cols = scols;
919aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr);
920854ce69bSBarry Smith     ierr = PetscMalloc1(nz+1,&svals);CHKERRQ(ierr);
921aabbc4fbSShri Abhyankar     vals = svals;
922aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr);
923aabbc4fbSShri Abhyankar 
924aabbc4fbSShri Abhyankar     /* insert into matrix */
925aabbc4fbSShri Abhyankar     for (i=0; i<M; i++) {
926aabbc4fbSShri Abhyankar       for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j];
927aabbc4fbSShri Abhyankar       svals += rowlengths[i]; scols += rowlengths[i];
928aabbc4fbSShri Abhyankar     }
929aabbc4fbSShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
930aabbc4fbSShri Abhyankar     ierr = PetscFree(cols);CHKERRQ(ierr);
931aabbc4fbSShri Abhyankar     ierr = PetscFree(rowlengths);CHKERRQ(ierr);
932aabbc4fbSShri Abhyankar   }
933aabbc4fbSShri Abhyankar   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
934aabbc4fbSShri Abhyankar   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
935aabbc4fbSShri Abhyankar   PetscFunctionReturn(0);
936aabbc4fbSShri Abhyankar }
937aabbc4fbSShri Abhyankar 
938aabbc4fbSShri Abhyankar #undef __FUNCT__
9394a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII"
9406849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer)
941289bc588SBarry Smith {
942932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
943dfbe8321SBarry Smith   PetscErrorCode    ierr;
94413f74950SBarry Smith   PetscInt          i,j;
9452dcb1b2aSMatthew Knepley   const char        *name;
94687828ca2SBarry Smith   PetscScalar       *v;
947f3ef73ceSBarry Smith   PetscViewerFormat format;
9485f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX)
949ace3abfcSBarry Smith   PetscBool         allreal = PETSC_TRUE;
9505f481a85SSatish Balay #endif
951932b0c3eSLois Curfman McInnes 
9523a40ed3dSBarry Smith   PetscFunctionBegin;
953b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
954456192e2SBarry Smith   if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
9553a40ed3dSBarry Smith     PetscFunctionReturn(0);  /* do nothing for now */
956fb9695e5SSatish Balay   } else if (format == PETSC_VIEWER_ASCII_COMMON) {
957d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
958d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
95944cd7ae7SLois Curfman McInnes       v    = a->v + i;
96077431f27SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr);
961d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
962aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
963329f5518SBarry Smith         if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) {
96457622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g + %g i) ",j,(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr);
965329f5518SBarry Smith         } else if (PetscRealPart(*v)) {
96657622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)PetscRealPart(*v));CHKERRQ(ierr);
9676831982aSBarry Smith         }
96880cd9d93SLois Curfman McInnes #else
9696831982aSBarry Smith         if (*v) {
97057622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)*v);CHKERRQ(ierr);
9716831982aSBarry Smith         }
97280cd9d93SLois Curfman McInnes #endif
9731b807ce4Svictorle         v += a->lda;
97480cd9d93SLois Curfman McInnes       }
975b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
97680cd9d93SLois Curfman McInnes     }
977d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
9783a40ed3dSBarry Smith   } else {
979d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
980aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
98147989497SBarry Smith     /* determine if matrix has all real values */
98247989497SBarry Smith     v = a->v;
983d0f46423SBarry Smith     for (i=0; i<A->rmap->n*A->cmap->n; i++) {
984ffac6cdbSBarry Smith       if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break;}
98547989497SBarry Smith     }
98647989497SBarry Smith #endif
987fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
9883a7fca6bSBarry Smith       ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr);
989d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr);
990d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
991fb9695e5SSatish Balay       ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr);
992ffac6cdbSBarry Smith     }
993ffac6cdbSBarry Smith 
994d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
995932b0c3eSLois Curfman McInnes       v = a->v + i;
996d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
997aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
99847989497SBarry Smith         if (allreal) {
999c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr);
100047989497SBarry Smith         } else {
1001c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr);
100247989497SBarry Smith         }
1003289bc588SBarry Smith #else
1004c61cd2faSJed Brown         ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr);
1005289bc588SBarry Smith #endif
10061b807ce4Svictorle         v += a->lda;
1007289bc588SBarry Smith       }
1008b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
1009289bc588SBarry Smith     }
1010fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
1011b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr);
1012ffac6cdbSBarry Smith     }
1013d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
1014da3a660dSBarry Smith   }
1015b0a32e0cSBarry Smith   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
10163a40ed3dSBarry Smith   PetscFunctionReturn(0);
1017289bc588SBarry Smith }
1018289bc588SBarry Smith 
10194a2ae208SSatish Balay #undef __FUNCT__
10204a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary"
10216849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer)
1022932b0c3eSLois Curfman McInnes {
1023932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
10246849ba73SBarry Smith   PetscErrorCode    ierr;
102513f74950SBarry Smith   int               fd;
1026d0f46423SBarry Smith   PetscInt          ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n;
1027f4403165SShri Abhyankar   PetscScalar       *v,*anonz,*vals;
1028f4403165SShri Abhyankar   PetscViewerFormat format;
1029932b0c3eSLois Curfman McInnes 
10303a40ed3dSBarry Smith   PetscFunctionBegin;
1031b0a32e0cSBarry Smith   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
103290ace30eSBarry Smith 
1033f4403165SShri Abhyankar   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1034f4403165SShri Abhyankar   if (format == PETSC_VIEWER_NATIVE) {
1035f4403165SShri Abhyankar     /* store the matrix as a dense matrix */
1036785e854fSJed Brown     ierr = PetscMalloc1(4,&col_lens);CHKERRQ(ierr);
10372205254eSKarl Rupp 
1038f4403165SShri Abhyankar     col_lens[0] = MAT_FILE_CLASSID;
1039f4403165SShri Abhyankar     col_lens[1] = m;
1040f4403165SShri Abhyankar     col_lens[2] = n;
1041f4403165SShri Abhyankar     col_lens[3] = MATRIX_BINARY_FORMAT_DENSE;
10422205254eSKarl Rupp 
1043f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
1044f4403165SShri Abhyankar     ierr = PetscFree(col_lens);CHKERRQ(ierr);
1045f4403165SShri Abhyankar 
1046f4403165SShri Abhyankar     /* write out matrix, by rows */
1047854ce69bSBarry Smith     ierr = PetscMalloc1(m*n+1,&vals);CHKERRQ(ierr);
1048f4403165SShri Abhyankar     v    = a->v;
1049f4403165SShri Abhyankar     for (j=0; j<n; j++) {
1050f4403165SShri Abhyankar       for (i=0; i<m; i++) {
1051f4403165SShri Abhyankar         vals[j + i*n] = *v++;
1052f4403165SShri Abhyankar       }
1053f4403165SShri Abhyankar     }
1054f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
1055f4403165SShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
1056f4403165SShri Abhyankar   } else {
1057854ce69bSBarry Smith     ierr = PetscMalloc1(4+nz,&col_lens);CHKERRQ(ierr);
10582205254eSKarl Rupp 
10590700a824SBarry Smith     col_lens[0] = MAT_FILE_CLASSID;
1060932b0c3eSLois Curfman McInnes     col_lens[1] = m;
1061932b0c3eSLois Curfman McInnes     col_lens[2] = n;
1062932b0c3eSLois Curfman McInnes     col_lens[3] = nz;
1063932b0c3eSLois Curfman McInnes 
1064932b0c3eSLois Curfman McInnes     /* store lengths of each row and write (including header) to file */
1065932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) col_lens[4+i] = n;
10666f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
1067932b0c3eSLois Curfman McInnes 
1068932b0c3eSLois Curfman McInnes     /* Possibly should write in smaller increments, not whole matrix at once? */
1069932b0c3eSLois Curfman McInnes     /* store column indices (zero start index) */
1070932b0c3eSLois Curfman McInnes     ict = 0;
1071932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1072932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) col_lens[ict++] = j;
1073932b0c3eSLois Curfman McInnes     }
10746f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
1075606d414cSSatish Balay     ierr = PetscFree(col_lens);CHKERRQ(ierr);
1076932b0c3eSLois Curfman McInnes 
1077932b0c3eSLois Curfman McInnes     /* store nonzero values */
1078854ce69bSBarry Smith     ierr = PetscMalloc1(nz+1,&anonz);CHKERRQ(ierr);
1079932b0c3eSLois Curfman McInnes     ict  = 0;
1080932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1081932b0c3eSLois Curfman McInnes       v = a->v + i;
1082932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) {
10831b807ce4Svictorle         anonz[ict++] = *v; v += a->lda;
1084932b0c3eSLois Curfman McInnes       }
1085932b0c3eSLois Curfman McInnes     }
10866f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
1087606d414cSSatish Balay     ierr = PetscFree(anonz);CHKERRQ(ierr);
1088f4403165SShri Abhyankar   }
10893a40ed3dSBarry Smith   PetscFunctionReturn(0);
1090932b0c3eSLois Curfman McInnes }
1091932b0c3eSLois Curfman McInnes 
10929804daf3SBarry Smith #include <petscdraw.h>
10934a2ae208SSatish Balay #undef __FUNCT__
10944a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom"
1095dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa)
1096f1af5d2fSBarry Smith {
1097f1af5d2fSBarry Smith   Mat               A  = (Mat) Aa;
1098f1af5d2fSBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
10996849ba73SBarry Smith   PetscErrorCode    ierr;
1100d0f46423SBarry Smith   PetscInt          m  = A->rmap->n,n = A->cmap->n,color,i,j;
110187828ca2SBarry Smith   PetscScalar       *v = a->v;
1102b0a32e0cSBarry Smith   PetscViewer       viewer;
1103b0a32e0cSBarry Smith   PetscDraw         popup;
1104329f5518SBarry Smith   PetscReal         xl,yl,xr,yr,x_l,x_r,y_l,y_r,scale,maxv = 0.0;
1105f3ef73ceSBarry Smith   PetscViewerFormat format;
1106f1af5d2fSBarry Smith 
1107f1af5d2fSBarry Smith   PetscFunctionBegin;
1108f1af5d2fSBarry Smith   ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr);
1109b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1110b0a32e0cSBarry Smith   ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr);
1111f1af5d2fSBarry Smith 
1112f1af5d2fSBarry Smith   /* Loop over matrix elements drawing boxes */
1113fb9695e5SSatish Balay   if (format != PETSC_VIEWER_DRAW_CONTOUR) {
1114f1af5d2fSBarry Smith     /* Blue for negative and Red for positive */
1115b0a32e0cSBarry Smith     color = PETSC_DRAW_BLUE;
1116f1af5d2fSBarry Smith     for (j = 0; j < n; j++) {
1117f1af5d2fSBarry Smith       x_l = j;
1118f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1119f1af5d2fSBarry Smith       for (i = 0; i < m; i++) {
1120f1af5d2fSBarry Smith         y_l = m - i - 1.0;
1121f1af5d2fSBarry Smith         y_r = y_l + 1.0;
1122329f5518SBarry Smith         if (PetscRealPart(v[j*m+i]) >  0.) {
1123b0a32e0cSBarry Smith           color = PETSC_DRAW_RED;
1124329f5518SBarry Smith         } else if (PetscRealPart(v[j*m+i]) <  0.) {
1125b0a32e0cSBarry Smith           color = PETSC_DRAW_BLUE;
1126f1af5d2fSBarry Smith         } else {
1127f1af5d2fSBarry Smith           continue;
1128f1af5d2fSBarry Smith         }
1129b0a32e0cSBarry Smith         ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1130f1af5d2fSBarry Smith       }
1131f1af5d2fSBarry Smith     }
1132f1af5d2fSBarry Smith   } else {
1133f1af5d2fSBarry Smith     /* use contour shading to indicate magnitude of values */
1134f1af5d2fSBarry Smith     /* first determine max of all nonzero values */
1135f1af5d2fSBarry Smith     for (i = 0; i < m*n; i++) {
1136f1af5d2fSBarry Smith       if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]);
1137f1af5d2fSBarry Smith     }
1138b0a32e0cSBarry Smith     scale = (245.0 - PETSC_DRAW_BASIC_COLORS)/maxv;
1139b0a32e0cSBarry Smith     ierr  = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr);
1140b0a32e0cSBarry Smith     if (popup) {ierr = PetscDrawScalePopup(popup,0.0,maxv);CHKERRQ(ierr);}
1141f1af5d2fSBarry Smith     for (j = 0; j < n; j++) {
1142f1af5d2fSBarry Smith       x_l = j;
1143f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1144f1af5d2fSBarry Smith       for (i = 0; i < m; i++) {
1145f1af5d2fSBarry Smith         y_l   = m - i - 1.0;
1146f1af5d2fSBarry Smith         y_r   = y_l + 1.0;
1147b0a32e0cSBarry Smith         color = PETSC_DRAW_BASIC_COLORS + (int)(scale*PetscAbsScalar(v[j*m+i]));
1148b0a32e0cSBarry Smith         ierr  = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1149f1af5d2fSBarry Smith       }
1150f1af5d2fSBarry Smith     }
1151f1af5d2fSBarry Smith   }
1152f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1153f1af5d2fSBarry Smith }
1154f1af5d2fSBarry Smith 
11554a2ae208SSatish Balay #undef __FUNCT__
11564a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw"
1157dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer)
1158f1af5d2fSBarry Smith {
1159b0a32e0cSBarry Smith   PetscDraw      draw;
1160ace3abfcSBarry Smith   PetscBool      isnull;
1161329f5518SBarry Smith   PetscReal      xr,yr,xl,yl,h,w;
1162dfbe8321SBarry Smith   PetscErrorCode ierr;
1163f1af5d2fSBarry Smith 
1164f1af5d2fSBarry Smith   PetscFunctionBegin;
1165b0a32e0cSBarry Smith   ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
1166b0a32e0cSBarry Smith   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
1167abc0a331SBarry Smith   if (isnull) PetscFunctionReturn(0);
1168f1af5d2fSBarry Smith 
1169f1af5d2fSBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr);
1170d0f46423SBarry Smith   xr   = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0;
1171f1af5d2fSBarry Smith   xr  += w;    yr += h;  xl = -w;     yl = -h;
1172b0a32e0cSBarry Smith   ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr);
1173b0a32e0cSBarry Smith   ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr);
11740298fd71SBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr);
1175f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1176f1af5d2fSBarry Smith }
1177f1af5d2fSBarry Smith 
11784a2ae208SSatish Balay #undef __FUNCT__
11794a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense"
1180dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer)
1181932b0c3eSLois Curfman McInnes {
1182dfbe8321SBarry Smith   PetscErrorCode ierr;
1183ace3abfcSBarry Smith   PetscBool      iascii,isbinary,isdraw;
1184932b0c3eSLois Curfman McInnes 
11853a40ed3dSBarry Smith   PetscFunctionBegin;
1186251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
1187251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
1188251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
11890f5bd95cSBarry Smith 
1190c45a1595SBarry Smith   if (iascii) {
1191c45a1595SBarry Smith     ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr);
11920f5bd95cSBarry Smith   } else if (isbinary) {
11933a40ed3dSBarry Smith     ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr);
1194f1af5d2fSBarry Smith   } else if (isdraw) {
1195f1af5d2fSBarry Smith     ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr);
1196932b0c3eSLois Curfman McInnes   }
11973a40ed3dSBarry Smith   PetscFunctionReturn(0);
1198932b0c3eSLois Curfman McInnes }
1199289bc588SBarry Smith 
12004a2ae208SSatish Balay #undef __FUNCT__
12014a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense"
1202dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqDense(Mat mat)
1203289bc588SBarry Smith {
1204ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)mat->data;
1205dfbe8321SBarry Smith   PetscErrorCode ierr;
120690f02eecSBarry Smith 
12073a40ed3dSBarry Smith   PetscFunctionBegin;
1208aa482453SBarry Smith #if defined(PETSC_USE_LOG)
1209d0f46423SBarry Smith   PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n);
1210a5a9c739SBarry Smith #endif
121105b42c5fSBarry Smith   ierr = PetscFree(l->pivots);CHKERRQ(ierr);
12126857c123SSatish Balay   if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);}
1213bf0cc555SLisandro Dalcin   ierr = PetscFree(mat->data);CHKERRQ(ierr);
1214dbd8c25aSHong Zhang 
1215dbd8c25aSHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr);
1216bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL);CHKERRQ(ierr);
1217bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL);CHKERRQ(ierr);
12188baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL);CHKERRQ(ierr);
12198baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
12208baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL);CHKERRQ(ierr);
12218baccfbdSHong Zhang #endif
1222bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL);CHKERRQ(ierr);
1223bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1224bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1225bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
12263bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
12273bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
12283bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
12293a40ed3dSBarry Smith   PetscFunctionReturn(0);
1230289bc588SBarry Smith }
1231289bc588SBarry Smith 
12324a2ae208SSatish Balay #undef __FUNCT__
12334a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense"
1234fc4dec0aSBarry Smith PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout)
1235289bc588SBarry Smith {
1236c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
12376849ba73SBarry Smith   PetscErrorCode ierr;
123813f74950SBarry Smith   PetscInt       k,j,m,n,M;
123987828ca2SBarry Smith   PetscScalar    *v,tmp;
124048b35521SBarry Smith 
12413a40ed3dSBarry Smith   PetscFunctionBegin;
1242d0f46423SBarry Smith   v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n;
1243e9695a30SBarry Smith   if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */
1244e7e72b3dSBarry Smith     if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place");
1245e7e72b3dSBarry Smith     else {
1246d3e5ee88SLois Curfman McInnes       for (j=0; j<m; j++) {
1247289bc588SBarry Smith         for (k=0; k<j; k++) {
12481b807ce4Svictorle           tmp        = v[j + k*M];
12491b807ce4Svictorle           v[j + k*M] = v[k + j*M];
12501b807ce4Svictorle           v[k + j*M] = tmp;
1251289bc588SBarry Smith         }
1252289bc588SBarry Smith       }
1253d64ed03dSBarry Smith     }
12543a40ed3dSBarry Smith   } else { /* out-of-place transpose */
1255d3e5ee88SLois Curfman McInnes     Mat          tmat;
1256ec8511deSBarry Smith     Mat_SeqDense *tmatd;
125787828ca2SBarry Smith     PetscScalar  *v2;
1258af36a384SStefano Zampini     PetscInt     M2;
1259ea709b57SSatish Balay 
1260fc4dec0aSBarry Smith     if (reuse == MAT_INITIAL_MATRIX) {
1261ce94432eSBarry Smith       ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr);
1262d0f46423SBarry Smith       ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr);
12637adad957SLisandro Dalcin       ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
12640298fd71SBarry Smith       ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr);
1265fc4dec0aSBarry Smith     } else {
1266fc4dec0aSBarry Smith       tmat = *matout;
1267fc4dec0aSBarry Smith     }
1268ec8511deSBarry Smith     tmatd = (Mat_SeqDense*)tmat->data;
1269af36a384SStefano Zampini     v = mat->v; v2 = tmatd->v; M2 = tmatd->lda;
1270d3e5ee88SLois Curfman McInnes     for (j=0; j<n; j++) {
1271af36a384SStefano Zampini       for (k=0; k<m; k++) v2[j + k*M2] = v[k + j*M];
1272d3e5ee88SLois Curfman McInnes     }
12736d4a8577SBarry Smith     ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
12746d4a8577SBarry Smith     ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1275d3e5ee88SLois Curfman McInnes     *matout = tmat;
127648b35521SBarry Smith   }
12773a40ed3dSBarry Smith   PetscFunctionReturn(0);
1278289bc588SBarry Smith }
1279289bc588SBarry Smith 
12804a2ae208SSatish Balay #undef __FUNCT__
12814a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense"
1282ace3abfcSBarry Smith PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool  *flg)
1283289bc588SBarry Smith {
1284c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data;
1285c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data;
128613f74950SBarry Smith   PetscInt     i,j;
1287a2ea699eSBarry Smith   PetscScalar  *v1,*v2;
12889ea5d5aeSSatish Balay 
12893a40ed3dSBarry Smith   PetscFunctionBegin;
1290d0f46423SBarry Smith   if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1291d0f46423SBarry Smith   if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1292d0f46423SBarry Smith   for (i=0; i<A1->rmap->n; i++) {
12931b807ce4Svictorle     v1 = mat1->v+i; v2 = mat2->v+i;
1294d0f46423SBarry Smith     for (j=0; j<A1->cmap->n; j++) {
12953a40ed3dSBarry Smith       if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
12961b807ce4Svictorle       v1 += mat1->lda; v2 += mat2->lda;
12971b807ce4Svictorle     }
1298289bc588SBarry Smith   }
129977c4ece6SBarry Smith   *flg = PETSC_TRUE;
13003a40ed3dSBarry Smith   PetscFunctionReturn(0);
1301289bc588SBarry Smith }
1302289bc588SBarry Smith 
13034a2ae208SSatish Balay #undef __FUNCT__
13044a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense"
1305dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v)
1306289bc588SBarry Smith {
1307c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
1308dfbe8321SBarry Smith   PetscErrorCode ierr;
130913f74950SBarry Smith   PetscInt       i,n,len;
131087828ca2SBarry Smith   PetscScalar    *x,zero = 0.0;
131144cd7ae7SLois Curfman McInnes 
13123a40ed3dSBarry Smith   PetscFunctionBegin;
13132dcb1b2aSMatthew Knepley   ierr = VecSet(v,zero);CHKERRQ(ierr);
13147a97a34bSBarry Smith   ierr = VecGetSize(v,&n);CHKERRQ(ierr);
13151ebc52fbSHong Zhang   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1316d0f46423SBarry Smith   len  = PetscMin(A->rmap->n,A->cmap->n);
1317e32f2f54SBarry Smith   if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec");
131844cd7ae7SLois Curfman McInnes   for (i=0; i<len; i++) {
13191b807ce4Svictorle     x[i] = mat->v[i*mat->lda + i];
1320289bc588SBarry Smith   }
13211ebc52fbSHong Zhang   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
13223a40ed3dSBarry Smith   PetscFunctionReturn(0);
1323289bc588SBarry Smith }
1324289bc588SBarry Smith 
13254a2ae208SSatish Balay #undef __FUNCT__
13264a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense"
1327dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr)
1328289bc588SBarry Smith {
1329c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
1330f1ceaac6SMatthew G. Knepley   const PetscScalar *l,*r;
1331f1ceaac6SMatthew G. Knepley   PetscScalar       x,*v;
1332dfbe8321SBarry Smith   PetscErrorCode    ierr;
1333d0f46423SBarry Smith   PetscInt          i,j,m = A->rmap->n,n = A->cmap->n;
133455659b69SBarry Smith 
13353a40ed3dSBarry Smith   PetscFunctionBegin;
133628988994SBarry Smith   if (ll) {
13377a97a34bSBarry Smith     ierr = VecGetSize(ll,&m);CHKERRQ(ierr);
1338f1ceaac6SMatthew G. Knepley     ierr = VecGetArrayRead(ll,&l);CHKERRQ(ierr);
1339e32f2f54SBarry Smith     if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size");
1340da3a660dSBarry Smith     for (i=0; i<m; i++) {
1341da3a660dSBarry Smith       x = l[i];
1342da3a660dSBarry Smith       v = mat->v + i;
1343da3a660dSBarry Smith       for (j=0; j<n; j++) { (*v) *= x; v+= m;}
1344da3a660dSBarry Smith     }
1345f1ceaac6SMatthew G. Knepley     ierr = VecRestoreArrayRead(ll,&l);CHKERRQ(ierr);
1346eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr);
1347da3a660dSBarry Smith   }
134828988994SBarry Smith   if (rr) {
13497a97a34bSBarry Smith     ierr = VecGetSize(rr,&n);CHKERRQ(ierr);
1350f1ceaac6SMatthew G. Knepley     ierr = VecGetArrayRead(rr,&r);CHKERRQ(ierr);
1351e32f2f54SBarry Smith     if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size");
1352da3a660dSBarry Smith     for (i=0; i<n; i++) {
1353da3a660dSBarry Smith       x = r[i];
1354da3a660dSBarry Smith       v = mat->v + i*m;
13552205254eSKarl Rupp       for (j=0; j<m; j++) (*v++) *= x;
1356da3a660dSBarry Smith     }
1357f1ceaac6SMatthew G. Knepley     ierr = VecRestoreArrayRead(rr,&r);CHKERRQ(ierr);
1358eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr);
1359da3a660dSBarry Smith   }
13603a40ed3dSBarry Smith   PetscFunctionReturn(0);
1361289bc588SBarry Smith }
1362289bc588SBarry Smith 
13634a2ae208SSatish Balay #undef __FUNCT__
13644a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense"
1365dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm)
1366289bc588SBarry Smith {
1367c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
136887828ca2SBarry Smith   PetscScalar    *v   = mat->v;
1369329f5518SBarry Smith   PetscReal      sum  = 0.0;
1370d0f46423SBarry Smith   PetscInt       lda  =mat->lda,m=A->rmap->n,i,j;
1371efee365bSSatish Balay   PetscErrorCode ierr;
137255659b69SBarry Smith 
13733a40ed3dSBarry Smith   PetscFunctionBegin;
1374289bc588SBarry Smith   if (type == NORM_FROBENIUS) {
1375a5ce6ee0Svictorle     if (lda>m) {
1376d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1377a5ce6ee0Svictorle         v = mat->v+j*lda;
1378a5ce6ee0Svictorle         for (i=0; i<m; i++) {
1379a5ce6ee0Svictorle           sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1380a5ce6ee0Svictorle         }
1381a5ce6ee0Svictorle       }
1382a5ce6ee0Svictorle     } else {
1383d0f46423SBarry Smith       for (i=0; i<A->cmap->n*A->rmap->n; i++) {
1384329f5518SBarry Smith         sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1385289bc588SBarry Smith       }
1386a5ce6ee0Svictorle     }
13878f1a2a5eSBarry Smith     *nrm = PetscSqrtReal(sum);
1388dc0b31edSSatish Balay     ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
13893a40ed3dSBarry Smith   } else if (type == NORM_1) {
1390064f8208SBarry Smith     *nrm = 0.0;
1391d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
13921b807ce4Svictorle       v   = mat->v + j*mat->lda;
1393289bc588SBarry Smith       sum = 0.0;
1394d0f46423SBarry Smith       for (i=0; i<A->rmap->n; i++) {
139533a8263dSBarry Smith         sum += PetscAbsScalar(*v);  v++;
1396289bc588SBarry Smith       }
1397064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1398289bc588SBarry Smith     }
1399eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
14003a40ed3dSBarry Smith   } else if (type == NORM_INFINITY) {
1401064f8208SBarry Smith     *nrm = 0.0;
1402d0f46423SBarry Smith     for (j=0; j<A->rmap->n; j++) {
1403289bc588SBarry Smith       v   = mat->v + j;
1404289bc588SBarry Smith       sum = 0.0;
1405d0f46423SBarry Smith       for (i=0; i<A->cmap->n; i++) {
14061b807ce4Svictorle         sum += PetscAbsScalar(*v); v += mat->lda;
1407289bc588SBarry Smith       }
1408064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1409289bc588SBarry Smith     }
1410eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
1411e7e72b3dSBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm");
14123a40ed3dSBarry Smith   PetscFunctionReturn(0);
1413289bc588SBarry Smith }
1414289bc588SBarry Smith 
14154a2ae208SSatish Balay #undef __FUNCT__
14164a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense"
1417ace3abfcSBarry Smith PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg)
1418289bc588SBarry Smith {
1419c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *aij = (Mat_SeqDense*)A->data;
142063ba0a88SBarry Smith   PetscErrorCode ierr;
142167e560aaSBarry Smith 
14223a40ed3dSBarry Smith   PetscFunctionBegin;
1423b5a2b587SKris Buschelman   switch (op) {
1424b5a2b587SKris Buschelman   case MAT_ROW_ORIENTED:
14254e0d8c25SBarry Smith     aij->roworiented = flg;
1426b5a2b587SKris Buschelman     break;
1427512a5fc5SBarry Smith   case MAT_NEW_NONZERO_LOCATIONS:
1428b5a2b587SKris Buschelman   case MAT_NEW_NONZERO_LOCATION_ERR:
14293971808eSMatthew Knepley   case MAT_NEW_NONZERO_ALLOCATION_ERR:
14304e0d8c25SBarry Smith   case MAT_NEW_DIAGONALS:
143113fa8e87SLisandro Dalcin   case MAT_KEEP_NONZERO_PATTERN:
1432b5a2b587SKris Buschelman   case MAT_IGNORE_OFF_PROC_ENTRIES:
1433b5a2b587SKris Buschelman   case MAT_USE_HASH_TABLE:
14345021d80fSJed Brown   case MAT_IGNORE_LOWER_TRIANGULAR:
14355021d80fSJed Brown     ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr);
14365021d80fSJed Brown     break;
14375021d80fSJed Brown   case MAT_SPD:
143877e54ba9SKris Buschelman   case MAT_SYMMETRIC:
143977e54ba9SKris Buschelman   case MAT_STRUCTURALLY_SYMMETRIC:
14409a4540c5SBarry Smith   case MAT_HERMITIAN:
14419a4540c5SBarry Smith   case MAT_SYMMETRY_ETERNAL:
14425021d80fSJed Brown     /* These options are handled directly by MatSetOption() */
144377e54ba9SKris Buschelman     break;
1444b5a2b587SKris Buschelman   default:
1445e32f2f54SBarry Smith     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]);
14463a40ed3dSBarry Smith   }
14473a40ed3dSBarry Smith   PetscFunctionReturn(0);
1448289bc588SBarry Smith }
1449289bc588SBarry Smith 
14504a2ae208SSatish Balay #undef __FUNCT__
14514a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense"
1452dfbe8321SBarry Smith PetscErrorCode MatZeroEntries_SeqDense(Mat A)
14536f0a148fSBarry Smith {
1454ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)A->data;
14556849ba73SBarry Smith   PetscErrorCode ierr;
1456d0f46423SBarry Smith   PetscInt       lda=l->lda,m=A->rmap->n,j;
14573a40ed3dSBarry Smith 
14583a40ed3dSBarry Smith   PetscFunctionBegin;
1459a5ce6ee0Svictorle   if (lda>m) {
1460d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1461a5ce6ee0Svictorle       ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
1462a5ce6ee0Svictorle     }
1463a5ce6ee0Svictorle   } else {
1464d0f46423SBarry Smith     ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1465a5ce6ee0Svictorle   }
14663a40ed3dSBarry Smith   PetscFunctionReturn(0);
14676f0a148fSBarry Smith }
14686f0a148fSBarry Smith 
14694a2ae208SSatish Balay #undef __FUNCT__
14704a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense"
14712b40b63fSBarry Smith PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b)
14726f0a148fSBarry Smith {
147397b48c8fSBarry Smith   PetscErrorCode    ierr;
1474ec8511deSBarry Smith   Mat_SeqDense      *l = (Mat_SeqDense*)A->data;
1475b9679d65SBarry Smith   PetscInt          m  = l->lda, n = A->cmap->n, i,j;
147697b48c8fSBarry Smith   PetscScalar       *slot,*bb;
147797b48c8fSBarry Smith   const PetscScalar *xx;
147855659b69SBarry Smith 
14793a40ed3dSBarry Smith   PetscFunctionBegin;
1480b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG)
1481b9679d65SBarry Smith   for (i=0; i<N; i++) {
1482b9679d65SBarry Smith     if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed");
1483b9679d65SBarry Smith     if (rows[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row %D requested to be zeroed greater than or equal number of rows %D",rows[i],A->rmap->n);
1484b9679d65SBarry Smith   }
1485b9679d65SBarry Smith #endif
1486b9679d65SBarry Smith 
148797b48c8fSBarry Smith   /* fix right hand side if needed */
148897b48c8fSBarry Smith   if (x && b) {
148997b48c8fSBarry Smith     ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr);
149097b48c8fSBarry Smith     ierr = VecGetArray(b,&bb);CHKERRQ(ierr);
14912205254eSKarl Rupp     for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]];
149297b48c8fSBarry Smith     ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr);
149397b48c8fSBarry Smith     ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr);
149497b48c8fSBarry Smith   }
149597b48c8fSBarry Smith 
14966f0a148fSBarry Smith   for (i=0; i<N; i++) {
14976f0a148fSBarry Smith     slot = l->v + rows[i];
1498b9679d65SBarry Smith     for (j=0; j<n; j++) { *slot = 0.0; slot += m;}
14996f0a148fSBarry Smith   }
1500f4df32b1SMatthew Knepley   if (diag != 0.0) {
1501b9679d65SBarry Smith     if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices");
15026f0a148fSBarry Smith     for (i=0; i<N; i++) {
1503b9679d65SBarry Smith       slot  = l->v + (m+1)*rows[i];
1504f4df32b1SMatthew Knepley       *slot = diag;
15056f0a148fSBarry Smith     }
15066f0a148fSBarry Smith   }
15073a40ed3dSBarry Smith   PetscFunctionReturn(0);
15086f0a148fSBarry Smith }
1509557bce09SLois Curfman McInnes 
15104a2ae208SSatish Balay #undef __FUNCT__
15118c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray_SeqDense"
15128c778c55SBarry Smith PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar *array[])
151364e87e97SBarry Smith {
1514c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
15153a40ed3dSBarry Smith 
15163a40ed3dSBarry Smith   PetscFunctionBegin;
1517e32f2f54SBarry Smith   if (mat->lda != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get array for Dense matrices with LDA different from number of rows");
151864e87e97SBarry Smith   *array = mat->v;
15193a40ed3dSBarry Smith   PetscFunctionReturn(0);
152064e87e97SBarry Smith }
15210754003eSLois Curfman McInnes 
15224a2ae208SSatish Balay #undef __FUNCT__
15238c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray_SeqDense"
15248c778c55SBarry Smith PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar *array[])
1525ff14e315SSatish Balay {
15263a40ed3dSBarry Smith   PetscFunctionBegin;
152709b544d4SBarry Smith   *array = 0; /* user cannot accidently use the array later */
15283a40ed3dSBarry Smith   PetscFunctionReturn(0);
1529ff14e315SSatish Balay }
15300754003eSLois Curfman McInnes 
15314a2ae208SSatish Balay #undef __FUNCT__
15328c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray"
1533dec5eb66SMatthew G Knepley /*@C
15348c778c55SBarry Smith    MatDenseGetArray - gives access to the array where the data for a SeqDense matrix is stored
153573a71a0fSBarry Smith 
153673a71a0fSBarry Smith    Not Collective
153773a71a0fSBarry Smith 
153873a71a0fSBarry Smith    Input Parameter:
1539579dbff0SBarry Smith .  mat - a MATSEQDENSE or MATMPIDENSE matrix
154073a71a0fSBarry Smith 
154173a71a0fSBarry Smith    Output Parameter:
154273a71a0fSBarry Smith .   array - pointer to the data
154373a71a0fSBarry Smith 
154473a71a0fSBarry Smith    Level: intermediate
154573a71a0fSBarry Smith 
15468c778c55SBarry Smith .seealso: MatDenseRestoreArray()
154773a71a0fSBarry Smith @*/
15488c778c55SBarry Smith PetscErrorCode  MatDenseGetArray(Mat A,PetscScalar **array)
154973a71a0fSBarry Smith {
155073a71a0fSBarry Smith   PetscErrorCode ierr;
155173a71a0fSBarry Smith 
155273a71a0fSBarry Smith   PetscFunctionBegin;
15538c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
155473a71a0fSBarry Smith   PetscFunctionReturn(0);
155573a71a0fSBarry Smith }
155673a71a0fSBarry Smith 
155773a71a0fSBarry Smith #undef __FUNCT__
15588c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray"
1559dec5eb66SMatthew G Knepley /*@C
1560579dbff0SBarry Smith    MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray()
156173a71a0fSBarry Smith 
156273a71a0fSBarry Smith    Not Collective
156373a71a0fSBarry Smith 
156473a71a0fSBarry Smith    Input Parameters:
1565579dbff0SBarry Smith .  mat - a MATSEQDENSE or MATMPIDENSE matrix
156673a71a0fSBarry Smith .  array - pointer to the data
156773a71a0fSBarry Smith 
156873a71a0fSBarry Smith    Level: intermediate
156973a71a0fSBarry Smith 
15708c778c55SBarry Smith .seealso: MatDenseGetArray()
157173a71a0fSBarry Smith @*/
15728c778c55SBarry Smith PetscErrorCode  MatDenseRestoreArray(Mat A,PetscScalar **array)
157373a71a0fSBarry Smith {
157473a71a0fSBarry Smith   PetscErrorCode ierr;
157573a71a0fSBarry Smith 
157673a71a0fSBarry Smith   PetscFunctionBegin;
15778c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
157873a71a0fSBarry Smith   PetscFunctionReturn(0);
157973a71a0fSBarry Smith }
158073a71a0fSBarry Smith 
158173a71a0fSBarry Smith #undef __FUNCT__
15824a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense"
158313f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B)
15840754003eSLois Curfman McInnes {
1585c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
15866849ba73SBarry Smith   PetscErrorCode ierr;
15875d0c19d7SBarry Smith   PetscInt       i,j,nrows,ncols;
15885d0c19d7SBarry Smith   const PetscInt *irow,*icol;
158987828ca2SBarry Smith   PetscScalar    *av,*bv,*v = mat->v;
15900754003eSLois Curfman McInnes   Mat            newmat;
15910754003eSLois Curfman McInnes 
15923a40ed3dSBarry Smith   PetscFunctionBegin;
159378b31e54SBarry Smith   ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr);
159478b31e54SBarry Smith   ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr);
1595e03a110bSBarry Smith   ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr);
1596e03a110bSBarry Smith   ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr);
15970754003eSLois Curfman McInnes 
1598182d2002SSatish Balay   /* Check submatrixcall */
1599182d2002SSatish Balay   if (scall == MAT_REUSE_MATRIX) {
160013f74950SBarry Smith     PetscInt n_cols,n_rows;
1601182d2002SSatish Balay     ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr);
160221a2c019SBarry Smith     if (n_rows != nrows || n_cols != ncols) {
1603f746d493SDmitry Karpeev       /* resize the result matrix to match number of requested rows/columns */
1604c61587bbSBarry Smith       ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
160521a2c019SBarry Smith     }
1606182d2002SSatish Balay     newmat = *B;
1607182d2002SSatish Balay   } else {
16080754003eSLois Curfman McInnes     /* Create and fill new matrix */
1609ce94432eSBarry Smith     ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr);
1610f69a0ea3SMatthew Knepley     ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
16117adad957SLisandro Dalcin     ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
16120298fd71SBarry Smith     ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr);
1613182d2002SSatish Balay   }
1614182d2002SSatish Balay 
1615182d2002SSatish Balay   /* Now extract the data pointers and do the copy,column at a time */
1616182d2002SSatish Balay   bv = ((Mat_SeqDense*)newmat->data)->v;
1617182d2002SSatish Balay 
1618182d2002SSatish Balay   for (i=0; i<ncols; i++) {
16196de62eeeSBarry Smith     av = v + mat->lda*icol[i];
16202205254eSKarl Rupp     for (j=0; j<nrows; j++) *bv++ = av[irow[j]];
16210754003eSLois Curfman McInnes   }
1622182d2002SSatish Balay 
1623182d2002SSatish Balay   /* Assemble the matrices so that the correct flags are set */
16246d4a8577SBarry Smith   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
16256d4a8577SBarry Smith   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
16260754003eSLois Curfman McInnes 
16270754003eSLois Curfman McInnes   /* Free work space */
162878b31e54SBarry Smith   ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr);
162978b31e54SBarry Smith   ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr);
1630182d2002SSatish Balay   *B   = newmat;
16313a40ed3dSBarry Smith   PetscFunctionReturn(0);
16320754003eSLois Curfman McInnes }
16330754003eSLois Curfman McInnes 
16344a2ae208SSatish Balay #undef __FUNCT__
16354a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense"
163613f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[])
1637905e6a2fSBarry Smith {
16386849ba73SBarry Smith   PetscErrorCode ierr;
163913f74950SBarry Smith   PetscInt       i;
1640905e6a2fSBarry Smith 
16413a40ed3dSBarry Smith   PetscFunctionBegin;
1642905e6a2fSBarry Smith   if (scall == MAT_INITIAL_MATRIX) {
1643854ce69bSBarry Smith     ierr = PetscMalloc1(n+1,B);CHKERRQ(ierr);
1644905e6a2fSBarry Smith   }
1645905e6a2fSBarry Smith 
1646905e6a2fSBarry Smith   for (i=0; i<n; i++) {
16476a6a5d1dSBarry Smith     ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr);
1648905e6a2fSBarry Smith   }
16493a40ed3dSBarry Smith   PetscFunctionReturn(0);
1650905e6a2fSBarry Smith }
1651905e6a2fSBarry Smith 
16524a2ae208SSatish Balay #undef __FUNCT__
1653c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense"
1654c0aa2d19SHong Zhang PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode)
1655c0aa2d19SHong Zhang {
1656c0aa2d19SHong Zhang   PetscFunctionBegin;
1657c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1658c0aa2d19SHong Zhang }
1659c0aa2d19SHong Zhang 
1660c0aa2d19SHong Zhang #undef __FUNCT__
1661c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense"
1662c0aa2d19SHong Zhang PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode)
1663c0aa2d19SHong Zhang {
1664c0aa2d19SHong Zhang   PetscFunctionBegin;
1665c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1666c0aa2d19SHong Zhang }
1667c0aa2d19SHong Zhang 
1668c0aa2d19SHong Zhang #undef __FUNCT__
16694a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense"
1670dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str)
16714b0e389bSBarry Smith {
16724b0e389bSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data;
16736849ba73SBarry Smith   PetscErrorCode ierr;
1674d0f46423SBarry Smith   PetscInt       lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j;
16753a40ed3dSBarry Smith 
16763a40ed3dSBarry Smith   PetscFunctionBegin;
167733f4a19fSKris Buschelman   /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */
167833f4a19fSKris Buschelman   if (A->ops->copy != B->ops->copy) {
1679cb5b572fSBarry Smith     ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr);
16803a40ed3dSBarry Smith     PetscFunctionReturn(0);
16813a40ed3dSBarry Smith   }
1682e32f2f54SBarry Smith   if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)");
1683a5ce6ee0Svictorle   if (lda1>m || lda2>m) {
16840dbb7854Svictorle     for (j=0; j<n; j++) {
1685a5ce6ee0Svictorle       ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr);
1686a5ce6ee0Svictorle     }
1687a5ce6ee0Svictorle   } else {
1688d0f46423SBarry Smith     ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1689a5ce6ee0Svictorle   }
1690273d9f13SBarry Smith   PetscFunctionReturn(0);
1691273d9f13SBarry Smith }
1692273d9f13SBarry Smith 
16934a2ae208SSatish Balay #undef __FUNCT__
16944994cf47SJed Brown #define __FUNCT__ "MatSetUp_SeqDense"
16954994cf47SJed Brown PetscErrorCode MatSetUp_SeqDense(Mat A)
1696273d9f13SBarry Smith {
1697dfbe8321SBarry Smith   PetscErrorCode ierr;
1698273d9f13SBarry Smith 
1699273d9f13SBarry Smith   PetscFunctionBegin;
1700273d9f13SBarry Smith   ierr =  MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr);
17013a40ed3dSBarry Smith   PetscFunctionReturn(0);
17024b0e389bSBarry Smith }
17034b0e389bSBarry Smith 
1704284134d9SBarry Smith #undef __FUNCT__
1705ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense"
1706ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A)
1707ba337c44SJed Brown {
1708ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1709ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1710ba337c44SJed Brown   PetscScalar  *aa = a->v;
1711ba337c44SJed Brown 
1712ba337c44SJed Brown   PetscFunctionBegin;
1713ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]);
1714ba337c44SJed Brown   PetscFunctionReturn(0);
1715ba337c44SJed Brown }
1716ba337c44SJed Brown 
1717ba337c44SJed Brown #undef __FUNCT__
1718ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense"
1719ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A)
1720ba337c44SJed Brown {
1721ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1722ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1723ba337c44SJed Brown   PetscScalar  *aa = a->v;
1724ba337c44SJed Brown 
1725ba337c44SJed Brown   PetscFunctionBegin;
1726ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]);
1727ba337c44SJed Brown   PetscFunctionReturn(0);
1728ba337c44SJed Brown }
1729ba337c44SJed Brown 
1730ba337c44SJed Brown #undef __FUNCT__
1731ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense"
1732ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A)
1733ba337c44SJed Brown {
1734ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1735ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1736ba337c44SJed Brown   PetscScalar  *aa = a->v;
1737ba337c44SJed Brown 
1738ba337c44SJed Brown   PetscFunctionBegin;
1739ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]);
1740ba337c44SJed Brown   PetscFunctionReturn(0);
1741ba337c44SJed Brown }
1742284134d9SBarry Smith 
1743a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/
1744a9fe9ddaSSatish Balay #undef __FUNCT__
1745a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense"
1746a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1747a9fe9ddaSSatish Balay {
1748a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1749a9fe9ddaSSatish Balay 
1750a9fe9ddaSSatish Balay   PetscFunctionBegin;
1751a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
17523ff4c91cSHong Zhang     ierr = PetscLogEventBegin(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1753a9fe9ddaSSatish Balay     ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
17543ff4c91cSHong Zhang     ierr = PetscLogEventEnd(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1755a9fe9ddaSSatish Balay   }
17563ff4c91cSHong Zhang   ierr = PetscLogEventBegin(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1757a9fe9ddaSSatish Balay   ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
17583ff4c91cSHong Zhang   ierr = PetscLogEventEnd(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1759a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1760a9fe9ddaSSatish Balay }
1761a9fe9ddaSSatish Balay 
1762a9fe9ddaSSatish Balay #undef __FUNCT__
1763a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense"
1764a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1765a9fe9ddaSSatish Balay {
1766ee16a9a1SHong Zhang   PetscErrorCode ierr;
1767d0f46423SBarry Smith   PetscInt       m=A->rmap->n,n=B->cmap->n;
1768ee16a9a1SHong Zhang   Mat            Cmat;
1769a9fe9ddaSSatish Balay 
1770ee16a9a1SHong Zhang   PetscFunctionBegin;
1771e32f2f54SBarry Smith   if (A->cmap->n != B->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"A->cmap->n %d != B->rmap->n %d\n",A->cmap->n,B->rmap->n);
1772ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1773ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1774ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
17750298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr);
1776d73949e8SHong Zhang 
1777ee16a9a1SHong Zhang   *C = Cmat;
1778ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1779ee16a9a1SHong Zhang }
1780a9fe9ddaSSatish Balay 
178198a3b096SSatish Balay #undef __FUNCT__
1782a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense"
1783a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1784a9fe9ddaSSatish Balay {
1785a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1786a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1787a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
17880805154bSBarry Smith   PetscBLASInt   m,n,k;
1789a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1790c5df96a5SBarry Smith   PetscErrorCode ierr;
1791*fd4e9aacSBarry Smith   PetscBool      flg;
1792a9fe9ddaSSatish Balay 
1793a9fe9ddaSSatish Balay   PetscFunctionBegin;
1794*fd4e9aacSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)B,MATSEQDENSE,&flg);CHKERRQ(ierr);
1795*fd4e9aacSBarry Smith   if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Second matrix must be dense");
1796*fd4e9aacSBarry Smith 
1797*fd4e9aacSBarry Smith   /* Handle case where where user provided the final C matrix rather than calling MatMatMult() with MAT_INITIAL_MATRIX*/
1798*fd4e9aacSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&flg);CHKERRQ(ierr);
1799*fd4e9aacSBarry Smith   if (flg) {
1800*fd4e9aacSBarry Smith     C->ops->matmultnumeric = MatMatMultNumeric_SeqAIJ_SeqDense;
1801*fd4e9aacSBarry Smith     ierr = (*C->ops->matmultnumeric)(A,B,C);CHKERRQ(ierr);
1802*fd4e9aacSBarry Smith     PetscFunctionReturn(0);
1803*fd4e9aacSBarry Smith   }
1804*fd4e9aacSBarry Smith 
1805*fd4e9aacSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQDENSE,&flg);CHKERRQ(ierr);
1806*fd4e9aacSBarry Smith   if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"First matrix must be dense");
1807c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
1808c5df96a5SBarry Smith   ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr);
1809c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr);
18105ca1cc5dSStefano Zampini   PetscStackCallBLAS("BLASgemm",BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
1811a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1812a9fe9ddaSSatish Balay }
1813a9fe9ddaSSatish Balay 
1814a9fe9ddaSSatish Balay #undef __FUNCT__
181575648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqDense_SeqDense"
181675648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1817a9fe9ddaSSatish Balay {
1818a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1819a9fe9ddaSSatish Balay 
1820a9fe9ddaSSatish Balay   PetscFunctionBegin;
1821a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
18223ff4c91cSHong Zhang     ierr = PetscLogEventBegin(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
182375648e8dSHong Zhang     ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
18243ff4c91cSHong Zhang     ierr = PetscLogEventEnd(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1825a9fe9ddaSSatish Balay   }
18263ff4c91cSHong Zhang   ierr = PetscLogEventBegin(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr);
182775648e8dSHong Zhang   ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
18283ff4c91cSHong Zhang   ierr = PetscLogEventEnd(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1829a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1830a9fe9ddaSSatish Balay }
1831a9fe9ddaSSatish Balay 
1832a9fe9ddaSSatish Balay #undef __FUNCT__
183375648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqDense_SeqDense"
183475648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1835a9fe9ddaSSatish Balay {
1836ee16a9a1SHong Zhang   PetscErrorCode ierr;
1837d0f46423SBarry Smith   PetscInt       m=A->cmap->n,n=B->cmap->n;
1838ee16a9a1SHong Zhang   Mat            Cmat;
1839a9fe9ddaSSatish Balay 
1840ee16a9a1SHong Zhang   PetscFunctionBegin;
1841e32f2f54SBarry Smith   if (A->rmap->n != B->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"A->rmap->n %d != B->rmap->n %d\n",A->rmap->n,B->rmap->n);
1842ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1843ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1844ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
18450298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr);
18462205254eSKarl Rupp 
1847ee16a9a1SHong Zhang   Cmat->assembled = PETSC_TRUE;
18482205254eSKarl Rupp 
1849ee16a9a1SHong Zhang   *C = Cmat;
1850ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1851ee16a9a1SHong Zhang }
1852a9fe9ddaSSatish Balay 
1853a9fe9ddaSSatish Balay #undef __FUNCT__
185475648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqDense_SeqDense"
185575648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1856a9fe9ddaSSatish Balay {
1857a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1858a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1859a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
18600805154bSBarry Smith   PetscBLASInt   m,n,k;
1861a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1862c5df96a5SBarry Smith   PetscErrorCode ierr;
1863a9fe9ddaSSatish Balay 
1864a9fe9ddaSSatish Balay   PetscFunctionBegin;
1865c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&m);CHKERRQ(ierr);
1866c5df96a5SBarry Smith   ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr);
1867c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr);
18682fbe02b9SBarry Smith   /*
18692fbe02b9SBarry Smith      Note the m and n arguments below are the number rows and columns of A', not A!
18702fbe02b9SBarry Smith   */
18715ca1cc5dSStefano Zampini   PetscStackCallBLAS("BLASgemm",BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
1872a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1873a9fe9ddaSSatish Balay }
1874985db425SBarry Smith 
1875985db425SBarry Smith #undef __FUNCT__
1876985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense"
1877985db425SBarry Smith PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[])
1878985db425SBarry Smith {
1879985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1880985db425SBarry Smith   PetscErrorCode ierr;
1881d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1882985db425SBarry Smith   PetscScalar    *x;
1883985db425SBarry Smith   MatScalar      *aa = a->v;
1884985db425SBarry Smith 
1885985db425SBarry Smith   PetscFunctionBegin;
1886e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1887985db425SBarry Smith 
1888985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1889985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1890985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1891e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1892985db425SBarry Smith   for (i=0; i<m; i++) {
1893985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1894985db425SBarry Smith     for (j=1; j<n; j++) {
1895985db425SBarry Smith       if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1896985db425SBarry Smith     }
1897985db425SBarry Smith   }
1898985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1899985db425SBarry Smith   PetscFunctionReturn(0);
1900985db425SBarry Smith }
1901985db425SBarry Smith 
1902985db425SBarry Smith #undef __FUNCT__
1903985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense"
1904985db425SBarry Smith PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[])
1905985db425SBarry Smith {
1906985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1907985db425SBarry Smith   PetscErrorCode ierr;
1908d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1909985db425SBarry Smith   PetscScalar    *x;
1910985db425SBarry Smith   PetscReal      atmp;
1911985db425SBarry Smith   MatScalar      *aa = a->v;
1912985db425SBarry Smith 
1913985db425SBarry Smith   PetscFunctionBegin;
1914e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1915985db425SBarry Smith 
1916985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1917985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1918985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1919e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1920985db425SBarry Smith   for (i=0; i<m; i++) {
19219189402eSHong Zhang     x[i] = PetscAbsScalar(aa[i]);
1922985db425SBarry Smith     for (j=1; j<n; j++) {
1923985db425SBarry Smith       atmp = PetscAbsScalar(aa[i+m*j]);
1924985db425SBarry Smith       if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;}
1925985db425SBarry Smith     }
1926985db425SBarry Smith   }
1927985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1928985db425SBarry Smith   PetscFunctionReturn(0);
1929985db425SBarry Smith }
1930985db425SBarry Smith 
1931985db425SBarry Smith #undef __FUNCT__
1932985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense"
1933985db425SBarry Smith PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[])
1934985db425SBarry Smith {
1935985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1936985db425SBarry Smith   PetscErrorCode ierr;
1937d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1938985db425SBarry Smith   PetscScalar    *x;
1939985db425SBarry Smith   MatScalar      *aa = a->v;
1940985db425SBarry Smith 
1941985db425SBarry Smith   PetscFunctionBegin;
1942e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1943985db425SBarry Smith 
1944985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1945985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1946985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1947e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1948985db425SBarry Smith   for (i=0; i<m; i++) {
1949985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1950985db425SBarry Smith     for (j=1; j<n; j++) {
1951985db425SBarry Smith       if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1952985db425SBarry Smith     }
1953985db425SBarry Smith   }
1954985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1955985db425SBarry Smith   PetscFunctionReturn(0);
1956985db425SBarry Smith }
1957985db425SBarry Smith 
19588d0534beSBarry Smith #undef __FUNCT__
19598d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense"
19608d0534beSBarry Smith PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col)
19618d0534beSBarry Smith {
19628d0534beSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
19638d0534beSBarry Smith   PetscErrorCode ierr;
19648d0534beSBarry Smith   PetscScalar    *x;
19658d0534beSBarry Smith 
19668d0534beSBarry Smith   PetscFunctionBegin;
1967e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
19688d0534beSBarry Smith 
19698d0534beSBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1970d0f46423SBarry Smith   ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
19718d0534beSBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
19728d0534beSBarry Smith   PetscFunctionReturn(0);
19738d0534beSBarry Smith }
19748d0534beSBarry Smith 
19750716a85fSBarry Smith 
19760716a85fSBarry Smith #undef __FUNCT__
19770716a85fSBarry Smith #define __FUNCT__ "MatGetColumnNorms_SeqDense"
19780716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms)
19790716a85fSBarry Smith {
19800716a85fSBarry Smith   PetscErrorCode ierr;
19810716a85fSBarry Smith   PetscInt       i,j,m,n;
19820716a85fSBarry Smith   PetscScalar    *a;
19830716a85fSBarry Smith 
19840716a85fSBarry Smith   PetscFunctionBegin;
19850716a85fSBarry Smith   ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr);
19860716a85fSBarry Smith   ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr);
19878c778c55SBarry Smith   ierr = MatDenseGetArray(A,&a);CHKERRQ(ierr);
19880716a85fSBarry Smith   if (type == NORM_2) {
19890716a85fSBarry Smith     for (i=0; i<n; i++) {
19900716a85fSBarry Smith       for (j=0; j<m; j++) {
19910716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]*a[j]);
19920716a85fSBarry Smith       }
19930716a85fSBarry Smith       a += m;
19940716a85fSBarry Smith     }
19950716a85fSBarry Smith   } else if (type == NORM_1) {
19960716a85fSBarry Smith     for (i=0; i<n; i++) {
19970716a85fSBarry Smith       for (j=0; j<m; j++) {
19980716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]);
19990716a85fSBarry Smith       }
20000716a85fSBarry Smith       a += m;
20010716a85fSBarry Smith     }
20020716a85fSBarry Smith   } else if (type == NORM_INFINITY) {
20030716a85fSBarry Smith     for (i=0; i<n; i++) {
20040716a85fSBarry Smith       for (j=0; j<m; j++) {
20050716a85fSBarry Smith         norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]);
20060716a85fSBarry Smith       }
20070716a85fSBarry Smith       a += m;
20080716a85fSBarry Smith     }
2009ce94432eSBarry Smith   } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType");
20108c778c55SBarry Smith   ierr = MatDenseRestoreArray(A,&a);CHKERRQ(ierr);
20110716a85fSBarry Smith   if (type == NORM_2) {
20128f1a2a5eSBarry Smith     for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]);
20130716a85fSBarry Smith   }
20140716a85fSBarry Smith   PetscFunctionReturn(0);
20150716a85fSBarry Smith }
20160716a85fSBarry Smith 
201773a71a0fSBarry Smith #undef __FUNCT__
201873a71a0fSBarry Smith #define __FUNCT__ "MatSetRandom_SeqDense"
201973a71a0fSBarry Smith static PetscErrorCode  MatSetRandom_SeqDense(Mat x,PetscRandom rctx)
202073a71a0fSBarry Smith {
202173a71a0fSBarry Smith   PetscErrorCode ierr;
202273a71a0fSBarry Smith   PetscScalar    *a;
202373a71a0fSBarry Smith   PetscInt       m,n,i;
202473a71a0fSBarry Smith 
202573a71a0fSBarry Smith   PetscFunctionBegin;
202673a71a0fSBarry Smith   ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr);
20278c778c55SBarry Smith   ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr);
202873a71a0fSBarry Smith   for (i=0; i<m*n; i++) {
202973a71a0fSBarry Smith     ierr = PetscRandomGetValue(rctx,a+i);CHKERRQ(ierr);
203073a71a0fSBarry Smith   }
20318c778c55SBarry Smith   ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr);
203273a71a0fSBarry Smith   PetscFunctionReturn(0);
203373a71a0fSBarry Smith }
203473a71a0fSBarry Smith 
203573a71a0fSBarry Smith 
2036289bc588SBarry Smith /* -------------------------------------------------------------------*/
2037a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense,
2038905e6a2fSBarry Smith                                         MatGetRow_SeqDense,
2039905e6a2fSBarry Smith                                         MatRestoreRow_SeqDense,
2040905e6a2fSBarry Smith                                         MatMult_SeqDense,
204197304618SKris Buschelman                                 /*  4*/ MatMultAdd_SeqDense,
20427c922b88SBarry Smith                                         MatMultTranspose_SeqDense,
20437c922b88SBarry Smith                                         MatMultTransposeAdd_SeqDense,
2044db4efbfdSBarry Smith                                         0,
2045db4efbfdSBarry Smith                                         0,
2046db4efbfdSBarry Smith                                         0,
2047db4efbfdSBarry Smith                                 /* 10*/ 0,
2048905e6a2fSBarry Smith                                         MatLUFactor_SeqDense,
2049905e6a2fSBarry Smith                                         MatCholeskyFactor_SeqDense,
205041f059aeSBarry Smith                                         MatSOR_SeqDense,
2051ec8511deSBarry Smith                                         MatTranspose_SeqDense,
205297304618SKris Buschelman                                 /* 15*/ MatGetInfo_SeqDense,
2053905e6a2fSBarry Smith                                         MatEqual_SeqDense,
2054905e6a2fSBarry Smith                                         MatGetDiagonal_SeqDense,
2055905e6a2fSBarry Smith                                         MatDiagonalScale_SeqDense,
2056905e6a2fSBarry Smith                                         MatNorm_SeqDense,
2057c0aa2d19SHong Zhang                                 /* 20*/ MatAssemblyBegin_SeqDense,
2058c0aa2d19SHong Zhang                                         MatAssemblyEnd_SeqDense,
2059905e6a2fSBarry Smith                                         MatSetOption_SeqDense,
2060905e6a2fSBarry Smith                                         MatZeroEntries_SeqDense,
2061d519adbfSMatthew Knepley                                 /* 24*/ MatZeroRows_SeqDense,
2062db4efbfdSBarry Smith                                         0,
2063db4efbfdSBarry Smith                                         0,
2064db4efbfdSBarry Smith                                         0,
2065db4efbfdSBarry Smith                                         0,
20664994cf47SJed Brown                                 /* 29*/ MatSetUp_SeqDense,
2067273d9f13SBarry Smith                                         0,
2068905e6a2fSBarry Smith                                         0,
206973a71a0fSBarry Smith                                         0,
207073a71a0fSBarry Smith                                         0,
2071d519adbfSMatthew Knepley                                 /* 34*/ MatDuplicate_SeqDense,
2072a5ae1ecdSBarry Smith                                         0,
2073a5ae1ecdSBarry Smith                                         0,
2074a5ae1ecdSBarry Smith                                         0,
2075a5ae1ecdSBarry Smith                                         0,
2076d519adbfSMatthew Knepley                                 /* 39*/ MatAXPY_SeqDense,
2077a5ae1ecdSBarry Smith                                         MatGetSubMatrices_SeqDense,
2078a5ae1ecdSBarry Smith                                         0,
20794b0e389bSBarry Smith                                         MatGetValues_SeqDense,
2080a5ae1ecdSBarry Smith                                         MatCopy_SeqDense,
2081d519adbfSMatthew Knepley                                 /* 44*/ MatGetRowMax_SeqDense,
2082a5ae1ecdSBarry Smith                                         MatScale_SeqDense,
20837d68702bSBarry Smith                                         MatShift_Basic,
2084a5ae1ecdSBarry Smith                                         0,
2085a5ae1ecdSBarry Smith                                         0,
208673a71a0fSBarry Smith                                 /* 49*/ MatSetRandom_SeqDense,
2087a5ae1ecdSBarry Smith                                         0,
2088a5ae1ecdSBarry Smith                                         0,
2089a5ae1ecdSBarry Smith                                         0,
2090a5ae1ecdSBarry Smith                                         0,
2091d519adbfSMatthew Knepley                                 /* 54*/ 0,
2092a5ae1ecdSBarry Smith                                         0,
2093a5ae1ecdSBarry Smith                                         0,
2094a5ae1ecdSBarry Smith                                         0,
2095a5ae1ecdSBarry Smith                                         0,
2096d519adbfSMatthew Knepley                                 /* 59*/ 0,
2097e03a110bSBarry Smith                                         MatDestroy_SeqDense,
2098e03a110bSBarry Smith                                         MatView_SeqDense,
2099357abbc8SBarry Smith                                         0,
210097304618SKris Buschelman                                         0,
2101d519adbfSMatthew Knepley                                 /* 64*/ 0,
210297304618SKris Buschelman                                         0,
210397304618SKris Buschelman                                         0,
210497304618SKris Buschelman                                         0,
210597304618SKris Buschelman                                         0,
2106d519adbfSMatthew Knepley                                 /* 69*/ MatGetRowMaxAbs_SeqDense,
210797304618SKris Buschelman                                         0,
210897304618SKris Buschelman                                         0,
210997304618SKris Buschelman                                         0,
211097304618SKris Buschelman                                         0,
2111d519adbfSMatthew Knepley                                 /* 74*/ 0,
211297304618SKris Buschelman                                         0,
211397304618SKris Buschelman                                         0,
211497304618SKris Buschelman                                         0,
211597304618SKris Buschelman                                         0,
2116d519adbfSMatthew Knepley                                 /* 79*/ 0,
211797304618SKris Buschelman                                         0,
211897304618SKris Buschelman                                         0,
211997304618SKris Buschelman                                         0,
21205bba2384SShri Abhyankar                                 /* 83*/ MatLoad_SeqDense,
2121865e5f61SKris Buschelman                                         0,
21221cbb95d3SBarry Smith                                         MatIsHermitian_SeqDense,
2123865e5f61SKris Buschelman                                         0,
2124865e5f61SKris Buschelman                                         0,
2125865e5f61SKris Buschelman                                         0,
2126d519adbfSMatthew Knepley                                 /* 89*/ MatMatMult_SeqDense_SeqDense,
2127a9fe9ddaSSatish Balay                                         MatMatMultSymbolic_SeqDense_SeqDense,
2128a9fe9ddaSSatish Balay                                         MatMatMultNumeric_SeqDense_SeqDense,
2129865e5f61SKris Buschelman                                         0,
2130865e5f61SKris Buschelman                                         0,
2131d519adbfSMatthew Knepley                                 /* 94*/ 0,
21325df89d91SHong Zhang                                         0,
21335df89d91SHong Zhang                                         0,
21345df89d91SHong Zhang                                         0,
2135284134d9SBarry Smith                                         0,
2136d519adbfSMatthew Knepley                                 /* 99*/ 0,
2137284134d9SBarry Smith                                         0,
2138284134d9SBarry Smith                                         0,
2139ba337c44SJed Brown                                         MatConjugate_SeqDense,
2140f73d5cc4SBarry Smith                                         0,
2141ba337c44SJed Brown                                 /*104*/ 0,
2142ba337c44SJed Brown                                         MatRealPart_SeqDense,
2143ba337c44SJed Brown                                         MatImaginaryPart_SeqDense,
2144985db425SBarry Smith                                         0,
2145985db425SBarry Smith                                         0,
214685e2c93fSHong Zhang                                 /*109*/ MatMatSolve_SeqDense,
2147985db425SBarry Smith                                         0,
21488d0534beSBarry Smith                                         MatGetRowMin_SeqDense,
2149aabbc4fbSShri Abhyankar                                         MatGetColumnVector_SeqDense,
2150aabbc4fbSShri Abhyankar                                         0,
2151aabbc4fbSShri Abhyankar                                 /*114*/ 0,
2152aabbc4fbSShri Abhyankar                                         0,
2153aabbc4fbSShri Abhyankar                                         0,
2154aabbc4fbSShri Abhyankar                                         0,
2155aabbc4fbSShri Abhyankar                                         0,
2156aabbc4fbSShri Abhyankar                                 /*119*/ 0,
2157aabbc4fbSShri Abhyankar                                         0,
2158aabbc4fbSShri Abhyankar                                         0,
21590716a85fSBarry Smith                                         0,
21600716a85fSBarry Smith                                         0,
21610716a85fSBarry Smith                                 /*124*/ 0,
21625df89d91SHong Zhang                                         MatGetColumnNorms_SeqDense,
21635df89d91SHong Zhang                                         0,
21645df89d91SHong Zhang                                         0,
21655df89d91SHong Zhang                                         0,
21665df89d91SHong Zhang                                 /*129*/ 0,
216775648e8dSHong Zhang                                         MatTransposeMatMult_SeqDense_SeqDense,
216875648e8dSHong Zhang                                         MatTransposeMatMultSymbolic_SeqDense_SeqDense,
216975648e8dSHong Zhang                                         MatTransposeMatMultNumeric_SeqDense_SeqDense,
21703964eb88SJed Brown                                         0,
21713964eb88SJed Brown                                 /*134*/ 0,
21723964eb88SJed Brown                                         0,
21733964eb88SJed Brown                                         0,
21743964eb88SJed Brown                                         0,
21753964eb88SJed Brown                                         0,
21763964eb88SJed Brown                                 /*139*/ 0,
2177f9426fe0SMark Adams                                         0,
21783964eb88SJed Brown                                         0
2179985db425SBarry Smith };
218090ace30eSBarry Smith 
21814a2ae208SSatish Balay #undef __FUNCT__
21824a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense"
21834b828684SBarry Smith /*@C
2184fafbff53SBarry Smith    MatCreateSeqDense - Creates a sequential dense matrix that
2185d65003e9SLois Curfman McInnes    is stored in column major order (the usual Fortran 77 manner). Many
2186d65003e9SLois Curfman McInnes    of the matrix operations use the BLAS and LAPACK routines.
2187289bc588SBarry Smith 
2188db81eaa0SLois Curfman McInnes    Collective on MPI_Comm
2189db81eaa0SLois Curfman McInnes 
219020563c6bSBarry Smith    Input Parameters:
2191db81eaa0SLois Curfman McInnes +  comm - MPI communicator, set to PETSC_COMM_SELF
21920c775827SLois Curfman McInnes .  m - number of rows
219318f449edSLois Curfman McInnes .  n - number of columns
21940298fd71SBarry Smith -  data - optional location of matrix data in column major order.  Set data=NULL for PETSc
2195dfc5480cSLois Curfman McInnes    to control all matrix memory allocation.
219620563c6bSBarry Smith 
219720563c6bSBarry Smith    Output Parameter:
219844cd7ae7SLois Curfman McInnes .  A - the matrix
219920563c6bSBarry Smith 
2200b259b22eSLois Curfman McInnes    Notes:
220118f449edSLois Curfman McInnes    The data input variable is intended primarily for Fortran programmers
220218f449edSLois Curfman McInnes    who wish to allocate their own matrix memory space.  Most users should
22030298fd71SBarry Smith    set data=NULL.
220418f449edSLois Curfman McInnes 
2205027ccd11SLois Curfman McInnes    Level: intermediate
2206027ccd11SLois Curfman McInnes 
2207dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS
2208d65003e9SLois Curfman McInnes 
220969b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues()
221020563c6bSBarry Smith @*/
22117087cfbeSBarry Smith PetscErrorCode  MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A)
2212289bc588SBarry Smith {
2213dfbe8321SBarry Smith   PetscErrorCode ierr;
22143b2fbd54SBarry Smith 
22153a40ed3dSBarry Smith   PetscFunctionBegin;
2216f69a0ea3SMatthew Knepley   ierr = MatCreate(comm,A);CHKERRQ(ierr);
2217f69a0ea3SMatthew Knepley   ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr);
2218273d9f13SBarry Smith   ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr);
2219273d9f13SBarry Smith   ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr);
2220273d9f13SBarry Smith   PetscFunctionReturn(0);
2221273d9f13SBarry Smith }
2222273d9f13SBarry Smith 
22234a2ae208SSatish Balay #undef __FUNCT__
2224afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation"
2225273d9f13SBarry Smith /*@C
2226273d9f13SBarry Smith    MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements
2227273d9f13SBarry Smith 
2228273d9f13SBarry Smith    Collective on MPI_Comm
2229273d9f13SBarry Smith 
2230273d9f13SBarry Smith    Input Parameters:
22311c4f3114SJed Brown +  B - the matrix
22320298fd71SBarry Smith -  data - the array (or NULL)
2233273d9f13SBarry Smith 
2234273d9f13SBarry Smith    Notes:
2235273d9f13SBarry Smith    The data input variable is intended primarily for Fortran programmers
2236273d9f13SBarry Smith    who wish to allocate their own matrix memory space.  Most users should
2237284134d9SBarry Smith    need not call this routine.
2238273d9f13SBarry Smith 
2239273d9f13SBarry Smith    Level: intermediate
2240273d9f13SBarry Smith 
2241273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS
2242273d9f13SBarry Smith 
224369b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA()
2244867c911aSBarry Smith 
2245273d9f13SBarry Smith @*/
22467087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation(Mat B,PetscScalar data[])
2247273d9f13SBarry Smith {
22484ac538c5SBarry Smith   PetscErrorCode ierr;
2249a23d5eceSKris Buschelman 
2250a23d5eceSKris Buschelman   PetscFunctionBegin;
22514ac538c5SBarry Smith   ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr);
2252a23d5eceSKris Buschelman   PetscFunctionReturn(0);
2253a23d5eceSKris Buschelman }
2254a23d5eceSKris Buschelman 
2255a23d5eceSKris Buschelman #undef __FUNCT__
2256afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense"
22577087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data)
2258a23d5eceSKris Buschelman {
2259273d9f13SBarry Smith   Mat_SeqDense   *b;
2260dfbe8321SBarry Smith   PetscErrorCode ierr;
2261273d9f13SBarry Smith 
2262273d9f13SBarry Smith   PetscFunctionBegin;
2263273d9f13SBarry Smith   B->preallocated = PETSC_TRUE;
2264a868139aSShri Abhyankar 
226534ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr);
226634ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr);
226734ef9618SShri Abhyankar 
2268273d9f13SBarry Smith   b       = (Mat_SeqDense*)B->data;
226986d161a7SShri Abhyankar   b->Mmax = B->rmap->n;
227086d161a7SShri Abhyankar   b->Nmax = B->cmap->n;
227186d161a7SShri Abhyankar   if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n;
227286d161a7SShri Abhyankar 
22739e8f95c4SLisandro Dalcin   if (!data) { /* petsc-allocated storage */
22749e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2275e92229d0SSatish Balay     ierr = PetscCalloc1((size_t)b->lda*b->Nmax,&b->v);CHKERRQ(ierr);
22763bb1ff40SBarry Smith     ierr = PetscLogObjectMemory((PetscObject)B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
22772205254eSKarl Rupp 
22789e8f95c4SLisandro Dalcin     b->user_alloc = PETSC_FALSE;
2279273d9f13SBarry Smith   } else { /* user-allocated storage */
22809e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2281273d9f13SBarry Smith     b->v          = data;
2282273d9f13SBarry Smith     b->user_alloc = PETSC_TRUE;
2283273d9f13SBarry Smith   }
22840450473dSBarry Smith   B->assembled = PETSC_TRUE;
2285273d9f13SBarry Smith   PetscFunctionReturn(0);
2286273d9f13SBarry Smith }
2287273d9f13SBarry Smith 
228865b80a83SHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
22891b807ce4Svictorle #undef __FUNCT__
22908baccfbdSHong Zhang #define __FUNCT__ "MatConvert_SeqDense_Elemental"
22918baccfbdSHong Zhang PETSC_EXTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat)
22928baccfbdSHong Zhang {
2293d77f618aSHong Zhang   Mat            mat_elemental;
2294d77f618aSHong Zhang   PetscErrorCode ierr;
2295d77f618aSHong Zhang   PetscScalar    *array,*v_colwise;
2296d77f618aSHong Zhang   PetscInt       M=A->rmap->N,N=A->cmap->N,i,j,k,*rows,*cols;
2297d77f618aSHong Zhang 
22988baccfbdSHong Zhang   PetscFunctionBegin;
2299d77f618aSHong Zhang   ierr = PetscMalloc3(M*N,&v_colwise,M,&rows,N,&cols);CHKERRQ(ierr);
2300d77f618aSHong Zhang   ierr = MatDenseGetArray(A,&array);CHKERRQ(ierr);
2301d77f618aSHong Zhang   /* convert column-wise array into row-wise v_colwise, see MatSetValues_Elemental() */
2302d77f618aSHong Zhang   k = 0;
2303d77f618aSHong Zhang   for (j=0; j<N; j++) {
2304d77f618aSHong Zhang     cols[j] = j;
2305d77f618aSHong Zhang     for (i=0; i<M; i++) {
2306d77f618aSHong Zhang       v_colwise[j*M+i] = array[k++];
2307d77f618aSHong Zhang     }
2308d77f618aSHong Zhang   }
2309d77f618aSHong Zhang   for (i=0; i<M; i++) {
2310d77f618aSHong Zhang     rows[i] = i;
2311d77f618aSHong Zhang   }
2312d77f618aSHong Zhang   ierr = MatDenseRestoreArray(A,&array);CHKERRQ(ierr);
2313d77f618aSHong Zhang 
2314d77f618aSHong Zhang   ierr = MatCreate(PetscObjectComm((PetscObject)A), &mat_elemental);CHKERRQ(ierr);
2315d77f618aSHong Zhang   ierr = MatSetSizes(mat_elemental,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr);
2316d77f618aSHong Zhang   ierr = MatSetType(mat_elemental,MATELEMENTAL);CHKERRQ(ierr);
2317d77f618aSHong Zhang   ierr = MatSetUp(mat_elemental);CHKERRQ(ierr);
2318d77f618aSHong Zhang 
2319d77f618aSHong Zhang   /* PETSc-Elemental interaface uses axpy for setting off-processor entries, only ADD_VALUES is allowed */
2320d77f618aSHong Zhang   ierr = MatSetValues(mat_elemental,M,rows,N,cols,v_colwise,ADD_VALUES);CHKERRQ(ierr);
2321d77f618aSHong Zhang   ierr = MatAssemblyBegin(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2322d77f618aSHong Zhang   ierr = MatAssemblyEnd(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2323d77f618aSHong Zhang   ierr = PetscFree3(v_colwise,rows,cols);CHKERRQ(ierr);
2324d77f618aSHong Zhang 
2325d77f618aSHong Zhang   if (reuse == MAT_REUSE_MATRIX) {
2326d77f618aSHong Zhang     ierr = MatHeaderReplace(A,mat_elemental);CHKERRQ(ierr);
2327d77f618aSHong Zhang   } else {
2328d77f618aSHong Zhang     *newmat = mat_elemental;
2329d77f618aSHong Zhang   }
23308baccfbdSHong Zhang   PetscFunctionReturn(0);
23318baccfbdSHong Zhang }
233265b80a83SHong Zhang #endif
23338baccfbdSHong Zhang 
23348baccfbdSHong Zhang #undef __FUNCT__
23351b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA"
23361b807ce4Svictorle /*@C
23371b807ce4Svictorle   MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array
23381b807ce4Svictorle 
23391b807ce4Svictorle   Input parameter:
23401b807ce4Svictorle + A - the matrix
23411b807ce4Svictorle - lda - the leading dimension
23421b807ce4Svictorle 
23431b807ce4Svictorle   Notes:
2344867c911aSBarry Smith   This routine is to be used in conjunction with MatSeqDenseSetPreallocation();
23451b807ce4Svictorle   it asserts that the preallocation has a leading dimension (the LDA parameter
23461b807ce4Svictorle   of Blas and Lapack fame) larger than M, the first dimension of the matrix.
23471b807ce4Svictorle 
23481b807ce4Svictorle   Level: intermediate
23491b807ce4Svictorle 
23501b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS
23511b807ce4Svictorle 
2352284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize()
2353867c911aSBarry Smith 
23541b807ce4Svictorle @*/
23557087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetLDA(Mat B,PetscInt lda)
23561b807ce4Svictorle {
23571b807ce4Svictorle   Mat_SeqDense *b = (Mat_SeqDense*)B->data;
235821a2c019SBarry Smith 
23591b807ce4Svictorle   PetscFunctionBegin;
2360e32f2f54SBarry Smith   if (lda < B->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"LDA %D must be at least matrix dimension %D",lda,B->rmap->n);
23611b807ce4Svictorle   b->lda       = lda;
236221a2c019SBarry Smith   b->changelda = PETSC_FALSE;
236321a2c019SBarry Smith   b->Mmax      = PetscMax(b->Mmax,lda);
23641b807ce4Svictorle   PetscFunctionReturn(0);
23651b807ce4Svictorle }
23661b807ce4Svictorle 
23670bad9183SKris Buschelman /*MC
2368fafad747SKris Buschelman    MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices.
23690bad9183SKris Buschelman 
23700bad9183SKris Buschelman    Options Database Keys:
23710bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions()
23720bad9183SKris Buschelman 
23730bad9183SKris Buschelman   Level: beginner
23740bad9183SKris Buschelman 
237589665df3SBarry Smith .seealso: MatCreateSeqDense()
237689665df3SBarry Smith 
23770bad9183SKris Buschelman M*/
23780bad9183SKris Buschelman 
23794a2ae208SSatish Balay #undef __FUNCT__
23804a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense"
23818cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatCreate_SeqDense(Mat B)
2382273d9f13SBarry Smith {
2383273d9f13SBarry Smith   Mat_SeqDense   *b;
2384dfbe8321SBarry Smith   PetscErrorCode ierr;
23857c334f02SBarry Smith   PetscMPIInt    size;
2386273d9f13SBarry Smith 
2387273d9f13SBarry Smith   PetscFunctionBegin;
2388ce94432eSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr);
2389e32f2f54SBarry Smith   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1");
239055659b69SBarry Smith 
2391b00a9115SJed Brown   ierr    = PetscNewLog(B,&b);CHKERRQ(ierr);
2392549d3d68SSatish Balay   ierr    = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr);
239344cd7ae7SLois Curfman McInnes   B->data = (void*)b;
239418f449edSLois Curfman McInnes 
239544cd7ae7SLois Curfman McInnes   b->pivots      = 0;
2396273d9f13SBarry Smith   b->roworiented = PETSC_TRUE;
2397273d9f13SBarry Smith   b->v           = 0;
239821a2c019SBarry Smith   b->changelda   = PETSC_FALSE;
23994e220ebcSLois Curfman McInnes 
2400bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr);
2401bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr);
2402bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr);
24038baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
24048baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr);
24058baccfbdSHong Zhang #endif
2406bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr);
2407bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaij_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
2408bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
2409bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
24103bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaij_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
24113bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
24123bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaij_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
241317667f90SBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr);
24143a40ed3dSBarry Smith   PetscFunctionReturn(0);
2415289bc588SBarry Smith }
2416