xref: /petsc/src/mat/impls/dense/seq/dense.c (revision 5ca1cc5d48b5a463b146d2214e138a1559c5ed3f)
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;
599c5df96a5SBarry Smith   ierr = PetscBLASIntCast(m,&bm);CHKERRQ(ierr);
600289bc588SBarry Smith   if (flag & SOR_ZERO_INITIAL_GUESS) {
60171044d3cSBarry Smith     /* this is a hack fix, should have another version without the second BLASdot */
6022dcb1b2aSMatthew Knepley     ierr = VecSet(xx,zero);CHKERRQ(ierr);
603289bc588SBarry Smith   }
6041ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
605d9ca1df4SBarry Smith   ierr = VecGetArrayRead(bb,&b);CHKERRQ(ierr);
606b965ef7fSBarry Smith   its  = its*lits;
607e32f2f54SBarry 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);
608289bc588SBarry Smith   while (its--) {
609fccaa45eSBarry Smith     if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) {
610289bc588SBarry Smith       for (i=0; i<m; i++) {
6118b83055fSJed Brown         PetscStackCallBLAS("BLASdot",xt   = b[i] - BLASdot_(&bm,v+i,&bm,x,&o));
61255a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
613289bc588SBarry Smith       }
614289bc588SBarry Smith     }
615fccaa45eSBarry Smith     if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) {
616289bc588SBarry Smith       for (i=m-1; i>=0; i--) {
6178b83055fSJed Brown         PetscStackCallBLAS("BLASdot",xt   = b[i] - BLASdot_(&bm,v+i,&bm,x,&o));
61855a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
619289bc588SBarry Smith       }
620289bc588SBarry Smith     }
621289bc588SBarry Smith   }
622d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(bb,&b);CHKERRQ(ierr);
6231ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6243a40ed3dSBarry Smith   PetscFunctionReturn(0);
625289bc588SBarry Smith }
626289bc588SBarry Smith 
627289bc588SBarry Smith /* -----------------------------------------------------------------*/
6284a2ae208SSatish Balay #undef __FUNCT__
6294a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense"
630dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy)
631289bc588SBarry Smith {
632c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
633d9ca1df4SBarry Smith   const PetscScalar *v   = mat->v,*x;
634d9ca1df4SBarry Smith   PetscScalar       *y;
635dfbe8321SBarry Smith   PetscErrorCode    ierr;
6360805154bSBarry Smith   PetscBLASInt      m, n,_One=1;
637ea709b57SSatish Balay   PetscScalar       _DOne=1.0,_DZero=0.0;
6383a40ed3dSBarry Smith 
6393a40ed3dSBarry Smith   PetscFunctionBegin;
640c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
641c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
642d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
643d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
6441ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
6458b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One));
646d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
6471ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
648dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
6493a40ed3dSBarry Smith   PetscFunctionReturn(0);
650289bc588SBarry Smith }
651800995b7SMatthew Knepley 
6524a2ae208SSatish Balay #undef __FUNCT__
6534a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense"
654dfbe8321SBarry Smith PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy)
655289bc588SBarry Smith {
656c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
657d9ca1df4SBarry Smith   PetscScalar       *y,_DOne=1.0,_DZero=0.0;
658dfbe8321SBarry Smith   PetscErrorCode    ierr;
6590805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
660d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
6613a40ed3dSBarry Smith 
6623a40ed3dSBarry Smith   PetscFunctionBegin;
663c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
664c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
665d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
666d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
6671ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
6688b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One));
669d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
6701ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
671dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr);
6723a40ed3dSBarry Smith   PetscFunctionReturn(0);
673289bc588SBarry Smith }
6746ee01492SSatish Balay 
6754a2ae208SSatish Balay #undef __FUNCT__
6764a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense"
677dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
678289bc588SBarry Smith {
679c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
680d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
681d9ca1df4SBarry Smith   PetscScalar       *y,_DOne=1.0;
682dfbe8321SBarry Smith   PetscErrorCode    ierr;
6830805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
6843a40ed3dSBarry Smith 
6853a40ed3dSBarry Smith   PetscFunctionBegin;
686c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
687c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
688d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
689600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
690d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
6911ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
6928b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
693d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
6941ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
695dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
6963a40ed3dSBarry Smith   PetscFunctionReturn(0);
697289bc588SBarry Smith }
6986ee01492SSatish Balay 
6994a2ae208SSatish Balay #undef __FUNCT__
7004a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense"
701dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
702289bc588SBarry Smith {
703c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
704d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
705d9ca1df4SBarry Smith   PetscScalar       *y;
706dfbe8321SBarry Smith   PetscErrorCode    ierr;
7070805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
70887828ca2SBarry Smith   PetscScalar       _DOne=1.0;
7093a40ed3dSBarry Smith 
7103a40ed3dSBarry Smith   PetscFunctionBegin;
711c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
712c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
713d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
714600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
715d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
7161ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
7178b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
718d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
7191ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
720dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
7213a40ed3dSBarry Smith   PetscFunctionReturn(0);
722289bc588SBarry Smith }
723289bc588SBarry Smith 
724289bc588SBarry Smith /* -----------------------------------------------------------------*/
7254a2ae208SSatish Balay #undef __FUNCT__
7264a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense"
72713f74950SBarry Smith PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
728289bc588SBarry Smith {
729c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
73087828ca2SBarry Smith   PetscScalar    *v;
7316849ba73SBarry Smith   PetscErrorCode ierr;
73213f74950SBarry Smith   PetscInt       i;
73367e560aaSBarry Smith 
7343a40ed3dSBarry Smith   PetscFunctionBegin;
735d0f46423SBarry Smith   *ncols = A->cmap->n;
736289bc588SBarry Smith   if (cols) {
737854ce69bSBarry Smith     ierr = PetscMalloc1(A->cmap->n+1,cols);CHKERRQ(ierr);
738d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) (*cols)[i] = i;
739289bc588SBarry Smith   }
740289bc588SBarry Smith   if (vals) {
741854ce69bSBarry Smith     ierr = PetscMalloc1(A->cmap->n+1,vals);CHKERRQ(ierr);
742289bc588SBarry Smith     v    = mat->v + row;
743d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;}
744289bc588SBarry Smith   }
7453a40ed3dSBarry Smith   PetscFunctionReturn(0);
746289bc588SBarry Smith }
7476ee01492SSatish Balay 
7484a2ae208SSatish Balay #undef __FUNCT__
7494a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense"
75013f74950SBarry Smith PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
751289bc588SBarry Smith {
752dfbe8321SBarry Smith   PetscErrorCode ierr;
7536e111a19SKarl Rupp 
754606d414cSSatish Balay   PetscFunctionBegin;
755606d414cSSatish Balay   if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);}
756606d414cSSatish Balay   if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); }
7573a40ed3dSBarry Smith   PetscFunctionReturn(0);
758289bc588SBarry Smith }
759289bc588SBarry Smith /* ----------------------------------------------------------------*/
7604a2ae208SSatish Balay #undef __FUNCT__
7614a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense"
76213f74950SBarry Smith PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv)
763289bc588SBarry Smith {
764c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
76513f74950SBarry Smith   PetscInt     i,j,idx=0;
766d6dfbf8fSBarry Smith 
7673a40ed3dSBarry Smith   PetscFunctionBegin;
768289bc588SBarry Smith   if (!mat->roworiented) {
769dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
770289bc588SBarry Smith       for (j=0; j<n; j++) {
771cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
7722515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
773e32f2f54SBarry 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);
77458804f6dSBarry Smith #endif
775289bc588SBarry Smith         for (i=0; i<m; i++) {
776cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
7772515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
778e32f2f54SBarry 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);
77958804f6dSBarry Smith #endif
780cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
781289bc588SBarry Smith         }
782289bc588SBarry Smith       }
7833a40ed3dSBarry Smith     } else {
784289bc588SBarry Smith       for (j=0; j<n; j++) {
785cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
7862515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
787e32f2f54SBarry 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);
78858804f6dSBarry Smith #endif
789289bc588SBarry Smith         for (i=0; i<m; i++) {
790cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
7912515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
792e32f2f54SBarry 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);
79358804f6dSBarry Smith #endif
794cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
795289bc588SBarry Smith         }
796289bc588SBarry Smith       }
797289bc588SBarry Smith     }
7983a40ed3dSBarry Smith   } else {
799dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
800e8d4e0b9SBarry Smith       for (i=0; i<m; i++) {
801cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
8022515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
803e32f2f54SBarry 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);
80458804f6dSBarry Smith #endif
805e8d4e0b9SBarry Smith         for (j=0; j<n; j++) {
806cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
8072515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
808e32f2f54SBarry 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);
80958804f6dSBarry Smith #endif
810cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
811e8d4e0b9SBarry Smith         }
812e8d4e0b9SBarry Smith       }
8133a40ed3dSBarry Smith     } else {
814289bc588SBarry Smith       for (i=0; i<m; i++) {
815cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
8162515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
817e32f2f54SBarry 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);
81858804f6dSBarry Smith #endif
819289bc588SBarry Smith         for (j=0; j<n; j++) {
820cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
8212515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
822e32f2f54SBarry 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);
82358804f6dSBarry Smith #endif
824cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
825289bc588SBarry Smith         }
826289bc588SBarry Smith       }
827289bc588SBarry Smith     }
828e8d4e0b9SBarry Smith   }
8293a40ed3dSBarry Smith   PetscFunctionReturn(0);
830289bc588SBarry Smith }
831e8d4e0b9SBarry Smith 
8324a2ae208SSatish Balay #undef __FUNCT__
8334a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense"
83413f74950SBarry Smith PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[])
835ae80bb75SLois Curfman McInnes {
836ae80bb75SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
83713f74950SBarry Smith   PetscInt     i,j;
838ae80bb75SLois Curfman McInnes 
8393a40ed3dSBarry Smith   PetscFunctionBegin;
840ae80bb75SLois Curfman McInnes   /* row-oriented output */
841ae80bb75SLois Curfman McInnes   for (i=0; i<m; i++) {
84297e567efSBarry Smith     if (indexm[i] < 0) {v += n;continue;}
843e32f2f54SBarry 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);
844ae80bb75SLois Curfman McInnes     for (j=0; j<n; j++) {
8456f31f424SBarry Smith       if (indexn[j] < 0) {v++; continue;}
846e32f2f54SBarry 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);
84797e567efSBarry Smith       *v++ = mat->v[indexn[j]*mat->lda + indexm[i]];
848ae80bb75SLois Curfman McInnes     }
849ae80bb75SLois Curfman McInnes   }
8503a40ed3dSBarry Smith   PetscFunctionReturn(0);
851ae80bb75SLois Curfman McInnes }
852ae80bb75SLois Curfman McInnes 
853289bc588SBarry Smith /* -----------------------------------------------------------------*/
854289bc588SBarry Smith 
8554a2ae208SSatish Balay #undef __FUNCT__
8565bba2384SShri Abhyankar #define __FUNCT__ "MatLoad_SeqDense"
857112444f4SShri Abhyankar PetscErrorCode MatLoad_SeqDense(Mat newmat,PetscViewer viewer)
858aabbc4fbSShri Abhyankar {
859aabbc4fbSShri Abhyankar   Mat_SeqDense   *a;
860aabbc4fbSShri Abhyankar   PetscErrorCode ierr;
861aabbc4fbSShri Abhyankar   PetscInt       *scols,i,j,nz,header[4];
862aabbc4fbSShri Abhyankar   int            fd;
863aabbc4fbSShri Abhyankar   PetscMPIInt    size;
864aabbc4fbSShri Abhyankar   PetscInt       *rowlengths = 0,M,N,*cols,grows,gcols;
865aabbc4fbSShri Abhyankar   PetscScalar    *vals,*svals,*v,*w;
866ce94432eSBarry Smith   MPI_Comm       comm;
867aabbc4fbSShri Abhyankar 
868aabbc4fbSShri Abhyankar   PetscFunctionBegin;
869c98fd787SBarry Smith   /* force binary viewer to load .info file if it has not yet done so */
870c98fd787SBarry Smith   ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr);
871ce94432eSBarry Smith   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
872aabbc4fbSShri Abhyankar   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
873aabbc4fbSShri Abhyankar   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor");
874aabbc4fbSShri Abhyankar   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
875aabbc4fbSShri Abhyankar   ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr);
876aabbc4fbSShri Abhyankar   if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object");
877aabbc4fbSShri Abhyankar   M = header[1]; N = header[2]; nz = header[3];
878aabbc4fbSShri Abhyankar 
879aabbc4fbSShri Abhyankar   /* set global size if not set already*/
880aabbc4fbSShri Abhyankar   if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) {
881aabbc4fbSShri Abhyankar     ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr);
882aabbc4fbSShri Abhyankar   } else {
883aabbc4fbSShri Abhyankar     /* if sizes and type are already set, check if the vector global sizes are correct */
884aabbc4fbSShri Abhyankar     ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr);
885aabbc4fbSShri 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);
886aabbc4fbSShri Abhyankar   }
887e6324fbbSBarry Smith   a = (Mat_SeqDense*)newmat->data;
888e6324fbbSBarry Smith   if (!a->user_alloc) {
8890298fd71SBarry Smith     ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr);
890e6324fbbSBarry Smith   }
891aabbc4fbSShri Abhyankar 
892aabbc4fbSShri Abhyankar   if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */
893aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
894aabbc4fbSShri Abhyankar     v = a->v;
895aabbc4fbSShri Abhyankar     /* Allocate some temp space to read in the values and then flip them
896aabbc4fbSShri Abhyankar        from row major to column major */
897854ce69bSBarry Smith     ierr = PetscMalloc1(M*N > 0 ? M*N : 1,&w);CHKERRQ(ierr);
898aabbc4fbSShri Abhyankar     /* read in nonzero values */
899aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr);
900aabbc4fbSShri Abhyankar     /* now flip the values and store them in the matrix*/
901aabbc4fbSShri Abhyankar     for (j=0; j<N; j++) {
902aabbc4fbSShri Abhyankar       for (i=0; i<M; i++) {
903aabbc4fbSShri Abhyankar         *v++ =w[i*N+j];
904aabbc4fbSShri Abhyankar       }
905aabbc4fbSShri Abhyankar     }
906aabbc4fbSShri Abhyankar     ierr = PetscFree(w);CHKERRQ(ierr);
907aabbc4fbSShri Abhyankar   } else {
908aabbc4fbSShri Abhyankar     /* read row lengths */
909854ce69bSBarry Smith     ierr = PetscMalloc1(M+1,&rowlengths);CHKERRQ(ierr);
910aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr);
911aabbc4fbSShri Abhyankar 
912aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
913aabbc4fbSShri Abhyankar     v = a->v;
914aabbc4fbSShri Abhyankar 
915aabbc4fbSShri Abhyankar     /* read column indices and nonzeros */
916854ce69bSBarry Smith     ierr = PetscMalloc1(nz+1,&scols);CHKERRQ(ierr);
917aabbc4fbSShri Abhyankar     cols = scols;
918aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr);
919854ce69bSBarry Smith     ierr = PetscMalloc1(nz+1,&svals);CHKERRQ(ierr);
920aabbc4fbSShri Abhyankar     vals = svals;
921aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr);
922aabbc4fbSShri Abhyankar 
923aabbc4fbSShri Abhyankar     /* insert into matrix */
924aabbc4fbSShri Abhyankar     for (i=0; i<M; i++) {
925aabbc4fbSShri Abhyankar       for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j];
926aabbc4fbSShri Abhyankar       svals += rowlengths[i]; scols += rowlengths[i];
927aabbc4fbSShri Abhyankar     }
928aabbc4fbSShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
929aabbc4fbSShri Abhyankar     ierr = PetscFree(cols);CHKERRQ(ierr);
930aabbc4fbSShri Abhyankar     ierr = PetscFree(rowlengths);CHKERRQ(ierr);
931aabbc4fbSShri Abhyankar   }
932aabbc4fbSShri Abhyankar   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
933aabbc4fbSShri Abhyankar   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
934aabbc4fbSShri Abhyankar   PetscFunctionReturn(0);
935aabbc4fbSShri Abhyankar }
936aabbc4fbSShri Abhyankar 
937aabbc4fbSShri Abhyankar #undef __FUNCT__
9384a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII"
9396849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer)
940289bc588SBarry Smith {
941932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
942dfbe8321SBarry Smith   PetscErrorCode    ierr;
94313f74950SBarry Smith   PetscInt          i,j;
9442dcb1b2aSMatthew Knepley   const char        *name;
94587828ca2SBarry Smith   PetscScalar       *v;
946f3ef73ceSBarry Smith   PetscViewerFormat format;
9475f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX)
948ace3abfcSBarry Smith   PetscBool         allreal = PETSC_TRUE;
9495f481a85SSatish Balay #endif
950932b0c3eSLois Curfman McInnes 
9513a40ed3dSBarry Smith   PetscFunctionBegin;
952b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
953456192e2SBarry Smith   if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
9543a40ed3dSBarry Smith     PetscFunctionReturn(0);  /* do nothing for now */
955fb9695e5SSatish Balay   } else if (format == PETSC_VIEWER_ASCII_COMMON) {
956d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
957d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
95844cd7ae7SLois Curfman McInnes       v    = a->v + i;
95977431f27SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr);
960d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
961aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
962329f5518SBarry Smith         if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) {
96357622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g + %g i) ",j,(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr);
964329f5518SBarry Smith         } else if (PetscRealPart(*v)) {
96557622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)PetscRealPart(*v));CHKERRQ(ierr);
9666831982aSBarry Smith         }
96780cd9d93SLois Curfman McInnes #else
9686831982aSBarry Smith         if (*v) {
96957622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)*v);CHKERRQ(ierr);
9706831982aSBarry Smith         }
97180cd9d93SLois Curfman McInnes #endif
9721b807ce4Svictorle         v += a->lda;
97380cd9d93SLois Curfman McInnes       }
974b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
97580cd9d93SLois Curfman McInnes     }
976d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
9773a40ed3dSBarry Smith   } else {
978d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
979aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
98047989497SBarry Smith     /* determine if matrix has all real values */
98147989497SBarry Smith     v = a->v;
982d0f46423SBarry Smith     for (i=0; i<A->rmap->n*A->cmap->n; i++) {
983ffac6cdbSBarry Smith       if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break;}
98447989497SBarry Smith     }
98547989497SBarry Smith #endif
986fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
9873a7fca6bSBarry Smith       ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr);
988d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr);
989d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
990fb9695e5SSatish Balay       ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr);
991ffac6cdbSBarry Smith     }
992ffac6cdbSBarry Smith 
993d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
994932b0c3eSLois Curfman McInnes       v = a->v + i;
995d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
996aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
99747989497SBarry Smith         if (allreal) {
998c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr);
99947989497SBarry Smith         } else {
1000c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr);
100147989497SBarry Smith         }
1002289bc588SBarry Smith #else
1003c61cd2faSJed Brown         ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr);
1004289bc588SBarry Smith #endif
10051b807ce4Svictorle         v += a->lda;
1006289bc588SBarry Smith       }
1007b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
1008289bc588SBarry Smith     }
1009fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
1010b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr);
1011ffac6cdbSBarry Smith     }
1012d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
1013da3a660dSBarry Smith   }
1014b0a32e0cSBarry Smith   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
10153a40ed3dSBarry Smith   PetscFunctionReturn(0);
1016289bc588SBarry Smith }
1017289bc588SBarry Smith 
10184a2ae208SSatish Balay #undef __FUNCT__
10194a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary"
10206849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer)
1021932b0c3eSLois Curfman McInnes {
1022932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
10236849ba73SBarry Smith   PetscErrorCode    ierr;
102413f74950SBarry Smith   int               fd;
1025d0f46423SBarry Smith   PetscInt          ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n;
1026f4403165SShri Abhyankar   PetscScalar       *v,*anonz,*vals;
1027f4403165SShri Abhyankar   PetscViewerFormat format;
1028932b0c3eSLois Curfman McInnes 
10293a40ed3dSBarry Smith   PetscFunctionBegin;
1030b0a32e0cSBarry Smith   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
103190ace30eSBarry Smith 
1032f4403165SShri Abhyankar   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1033f4403165SShri Abhyankar   if (format == PETSC_VIEWER_NATIVE) {
1034f4403165SShri Abhyankar     /* store the matrix as a dense matrix */
1035785e854fSJed Brown     ierr = PetscMalloc1(4,&col_lens);CHKERRQ(ierr);
10362205254eSKarl Rupp 
1037f4403165SShri Abhyankar     col_lens[0] = MAT_FILE_CLASSID;
1038f4403165SShri Abhyankar     col_lens[1] = m;
1039f4403165SShri Abhyankar     col_lens[2] = n;
1040f4403165SShri Abhyankar     col_lens[3] = MATRIX_BINARY_FORMAT_DENSE;
10412205254eSKarl Rupp 
1042f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
1043f4403165SShri Abhyankar     ierr = PetscFree(col_lens);CHKERRQ(ierr);
1044f4403165SShri Abhyankar 
1045f4403165SShri Abhyankar     /* write out matrix, by rows */
1046854ce69bSBarry Smith     ierr = PetscMalloc1(m*n+1,&vals);CHKERRQ(ierr);
1047f4403165SShri Abhyankar     v    = a->v;
1048f4403165SShri Abhyankar     for (j=0; j<n; j++) {
1049f4403165SShri Abhyankar       for (i=0; i<m; i++) {
1050f4403165SShri Abhyankar         vals[j + i*n] = *v++;
1051f4403165SShri Abhyankar       }
1052f4403165SShri Abhyankar     }
1053f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
1054f4403165SShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
1055f4403165SShri Abhyankar   } else {
1056854ce69bSBarry Smith     ierr = PetscMalloc1(4+nz,&col_lens);CHKERRQ(ierr);
10572205254eSKarl Rupp 
10580700a824SBarry Smith     col_lens[0] = MAT_FILE_CLASSID;
1059932b0c3eSLois Curfman McInnes     col_lens[1] = m;
1060932b0c3eSLois Curfman McInnes     col_lens[2] = n;
1061932b0c3eSLois Curfman McInnes     col_lens[3] = nz;
1062932b0c3eSLois Curfman McInnes 
1063932b0c3eSLois Curfman McInnes     /* store lengths of each row and write (including header) to file */
1064932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) col_lens[4+i] = n;
10656f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
1066932b0c3eSLois Curfman McInnes 
1067932b0c3eSLois Curfman McInnes     /* Possibly should write in smaller increments, not whole matrix at once? */
1068932b0c3eSLois Curfman McInnes     /* store column indices (zero start index) */
1069932b0c3eSLois Curfman McInnes     ict = 0;
1070932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1071932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) col_lens[ict++] = j;
1072932b0c3eSLois Curfman McInnes     }
10736f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
1074606d414cSSatish Balay     ierr = PetscFree(col_lens);CHKERRQ(ierr);
1075932b0c3eSLois Curfman McInnes 
1076932b0c3eSLois Curfman McInnes     /* store nonzero values */
1077854ce69bSBarry Smith     ierr = PetscMalloc1(nz+1,&anonz);CHKERRQ(ierr);
1078932b0c3eSLois Curfman McInnes     ict  = 0;
1079932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1080932b0c3eSLois Curfman McInnes       v = a->v + i;
1081932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) {
10821b807ce4Svictorle         anonz[ict++] = *v; v += a->lda;
1083932b0c3eSLois Curfman McInnes       }
1084932b0c3eSLois Curfman McInnes     }
10856f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
1086606d414cSSatish Balay     ierr = PetscFree(anonz);CHKERRQ(ierr);
1087f4403165SShri Abhyankar   }
10883a40ed3dSBarry Smith   PetscFunctionReturn(0);
1089932b0c3eSLois Curfman McInnes }
1090932b0c3eSLois Curfman McInnes 
10919804daf3SBarry Smith #include <petscdraw.h>
10924a2ae208SSatish Balay #undef __FUNCT__
10934a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom"
1094dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa)
1095f1af5d2fSBarry Smith {
1096f1af5d2fSBarry Smith   Mat               A  = (Mat) Aa;
1097f1af5d2fSBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
10986849ba73SBarry Smith   PetscErrorCode    ierr;
1099d0f46423SBarry Smith   PetscInt          m  = A->rmap->n,n = A->cmap->n,color,i,j;
110087828ca2SBarry Smith   PetscScalar       *v = a->v;
1101b0a32e0cSBarry Smith   PetscViewer       viewer;
1102b0a32e0cSBarry Smith   PetscDraw         popup;
1103329f5518SBarry Smith   PetscReal         xl,yl,xr,yr,x_l,x_r,y_l,y_r,scale,maxv = 0.0;
1104f3ef73ceSBarry Smith   PetscViewerFormat format;
1105f1af5d2fSBarry Smith 
1106f1af5d2fSBarry Smith   PetscFunctionBegin;
1107f1af5d2fSBarry Smith   ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr);
1108b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1109b0a32e0cSBarry Smith   ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr);
1110f1af5d2fSBarry Smith 
1111f1af5d2fSBarry Smith   /* Loop over matrix elements drawing boxes */
1112fb9695e5SSatish Balay   if (format != PETSC_VIEWER_DRAW_CONTOUR) {
1113f1af5d2fSBarry Smith     /* Blue for negative and Red for positive */
1114b0a32e0cSBarry Smith     color = PETSC_DRAW_BLUE;
1115f1af5d2fSBarry Smith     for (j = 0; j < n; j++) {
1116f1af5d2fSBarry Smith       x_l = j;
1117f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1118f1af5d2fSBarry Smith       for (i = 0; i < m; i++) {
1119f1af5d2fSBarry Smith         y_l = m - i - 1.0;
1120f1af5d2fSBarry Smith         y_r = y_l + 1.0;
1121329f5518SBarry Smith         if (PetscRealPart(v[j*m+i]) >  0.) {
1122b0a32e0cSBarry Smith           color = PETSC_DRAW_RED;
1123329f5518SBarry Smith         } else if (PetscRealPart(v[j*m+i]) <  0.) {
1124b0a32e0cSBarry Smith           color = PETSC_DRAW_BLUE;
1125f1af5d2fSBarry Smith         } else {
1126f1af5d2fSBarry Smith           continue;
1127f1af5d2fSBarry Smith         }
1128b0a32e0cSBarry Smith         ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1129f1af5d2fSBarry Smith       }
1130f1af5d2fSBarry Smith     }
1131f1af5d2fSBarry Smith   } else {
1132f1af5d2fSBarry Smith     /* use contour shading to indicate magnitude of values */
1133f1af5d2fSBarry Smith     /* first determine max of all nonzero values */
1134f1af5d2fSBarry Smith     for (i = 0; i < m*n; i++) {
1135f1af5d2fSBarry Smith       if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]);
1136f1af5d2fSBarry Smith     }
1137b0a32e0cSBarry Smith     scale = (245.0 - PETSC_DRAW_BASIC_COLORS)/maxv;
1138b0a32e0cSBarry Smith     ierr  = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr);
1139b0a32e0cSBarry Smith     if (popup) {ierr = PetscDrawScalePopup(popup,0.0,maxv);CHKERRQ(ierr);}
1140f1af5d2fSBarry Smith     for (j = 0; j < n; j++) {
1141f1af5d2fSBarry Smith       x_l = j;
1142f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1143f1af5d2fSBarry Smith       for (i = 0; i < m; i++) {
1144f1af5d2fSBarry Smith         y_l   = m - i - 1.0;
1145f1af5d2fSBarry Smith         y_r   = y_l + 1.0;
1146b0a32e0cSBarry Smith         color = PETSC_DRAW_BASIC_COLORS + (int)(scale*PetscAbsScalar(v[j*m+i]));
1147b0a32e0cSBarry Smith         ierr  = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1148f1af5d2fSBarry Smith       }
1149f1af5d2fSBarry Smith     }
1150f1af5d2fSBarry Smith   }
1151f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1152f1af5d2fSBarry Smith }
1153f1af5d2fSBarry Smith 
11544a2ae208SSatish Balay #undef __FUNCT__
11554a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw"
1156dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer)
1157f1af5d2fSBarry Smith {
1158b0a32e0cSBarry Smith   PetscDraw      draw;
1159ace3abfcSBarry Smith   PetscBool      isnull;
1160329f5518SBarry Smith   PetscReal      xr,yr,xl,yl,h,w;
1161dfbe8321SBarry Smith   PetscErrorCode ierr;
1162f1af5d2fSBarry Smith 
1163f1af5d2fSBarry Smith   PetscFunctionBegin;
1164b0a32e0cSBarry Smith   ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
1165b0a32e0cSBarry Smith   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
1166abc0a331SBarry Smith   if (isnull) PetscFunctionReturn(0);
1167f1af5d2fSBarry Smith 
1168f1af5d2fSBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr);
1169d0f46423SBarry Smith   xr   = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0;
1170f1af5d2fSBarry Smith   xr  += w;    yr += h;  xl = -w;     yl = -h;
1171b0a32e0cSBarry Smith   ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr);
1172b0a32e0cSBarry Smith   ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr);
11730298fd71SBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr);
1174f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1175f1af5d2fSBarry Smith }
1176f1af5d2fSBarry Smith 
11774a2ae208SSatish Balay #undef __FUNCT__
11784a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense"
1179dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer)
1180932b0c3eSLois Curfman McInnes {
1181dfbe8321SBarry Smith   PetscErrorCode ierr;
1182ace3abfcSBarry Smith   PetscBool      iascii,isbinary,isdraw;
1183932b0c3eSLois Curfman McInnes 
11843a40ed3dSBarry Smith   PetscFunctionBegin;
1185251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
1186251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
1187251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
11880f5bd95cSBarry Smith 
1189c45a1595SBarry Smith   if (iascii) {
1190c45a1595SBarry Smith     ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr);
11910f5bd95cSBarry Smith   } else if (isbinary) {
11923a40ed3dSBarry Smith     ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr);
1193f1af5d2fSBarry Smith   } else if (isdraw) {
1194f1af5d2fSBarry Smith     ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr);
1195932b0c3eSLois Curfman McInnes   }
11963a40ed3dSBarry Smith   PetscFunctionReturn(0);
1197932b0c3eSLois Curfman McInnes }
1198289bc588SBarry Smith 
11994a2ae208SSatish Balay #undef __FUNCT__
12004a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense"
1201dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqDense(Mat mat)
1202289bc588SBarry Smith {
1203ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)mat->data;
1204dfbe8321SBarry Smith   PetscErrorCode ierr;
120590f02eecSBarry Smith 
12063a40ed3dSBarry Smith   PetscFunctionBegin;
1207aa482453SBarry Smith #if defined(PETSC_USE_LOG)
1208d0f46423SBarry Smith   PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n);
1209a5a9c739SBarry Smith #endif
121005b42c5fSBarry Smith   ierr = PetscFree(l->pivots);CHKERRQ(ierr);
12116857c123SSatish Balay   if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);}
1212bf0cc555SLisandro Dalcin   ierr = PetscFree(mat->data);CHKERRQ(ierr);
1213dbd8c25aSHong Zhang 
1214dbd8c25aSHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr);
1215bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL);CHKERRQ(ierr);
1216bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL);CHKERRQ(ierr);
12178baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL);CHKERRQ(ierr);
12188baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
12198baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL);CHKERRQ(ierr);
12208baccfbdSHong Zhang #endif
1221bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL);CHKERRQ(ierr);
1222bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1223bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1224bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
12253bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
12263bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
12273bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
12283a40ed3dSBarry Smith   PetscFunctionReturn(0);
1229289bc588SBarry Smith }
1230289bc588SBarry Smith 
12314a2ae208SSatish Balay #undef __FUNCT__
12324a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense"
1233fc4dec0aSBarry Smith PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout)
1234289bc588SBarry Smith {
1235c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
12366849ba73SBarry Smith   PetscErrorCode ierr;
123713f74950SBarry Smith   PetscInt       k,j,m,n,M;
123887828ca2SBarry Smith   PetscScalar    *v,tmp;
123948b35521SBarry Smith 
12403a40ed3dSBarry Smith   PetscFunctionBegin;
1241d0f46423SBarry Smith   v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n;
1242e9695a30SBarry Smith   if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */
1243e7e72b3dSBarry Smith     if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place");
1244e7e72b3dSBarry Smith     else {
1245d3e5ee88SLois Curfman McInnes       for (j=0; j<m; j++) {
1246289bc588SBarry Smith         for (k=0; k<j; k++) {
12471b807ce4Svictorle           tmp        = v[j + k*M];
12481b807ce4Svictorle           v[j + k*M] = v[k + j*M];
12491b807ce4Svictorle           v[k + j*M] = tmp;
1250289bc588SBarry Smith         }
1251289bc588SBarry Smith       }
1252d64ed03dSBarry Smith     }
12533a40ed3dSBarry Smith   } else { /* out-of-place transpose */
1254d3e5ee88SLois Curfman McInnes     Mat          tmat;
1255ec8511deSBarry Smith     Mat_SeqDense *tmatd;
125687828ca2SBarry Smith     PetscScalar  *v2;
1257ea709b57SSatish Balay 
1258fc4dec0aSBarry Smith     if (reuse == MAT_INITIAL_MATRIX) {
1259ce94432eSBarry Smith       ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr);
1260d0f46423SBarry Smith       ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr);
12617adad957SLisandro Dalcin       ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
12620298fd71SBarry Smith       ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr);
1263fc4dec0aSBarry Smith     } else {
1264fc4dec0aSBarry Smith       tmat = *matout;
1265fc4dec0aSBarry Smith     }
1266ec8511deSBarry Smith     tmatd = (Mat_SeqDense*)tmat->data;
12670de55854SLois Curfman McInnes     v = mat->v; v2 = tmatd->v;
1268d3e5ee88SLois Curfman McInnes     for (j=0; j<n; j++) {
12691b807ce4Svictorle       for (k=0; k<m; k++) v2[j + k*n] = v[k + j*M];
1270d3e5ee88SLois Curfman McInnes     }
12716d4a8577SBarry Smith     ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
12726d4a8577SBarry Smith     ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1273d3e5ee88SLois Curfman McInnes     *matout = tmat;
127448b35521SBarry Smith   }
12753a40ed3dSBarry Smith   PetscFunctionReturn(0);
1276289bc588SBarry Smith }
1277289bc588SBarry Smith 
12784a2ae208SSatish Balay #undef __FUNCT__
12794a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense"
1280ace3abfcSBarry Smith PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool  *flg)
1281289bc588SBarry Smith {
1282c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data;
1283c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data;
128413f74950SBarry Smith   PetscInt     i,j;
1285a2ea699eSBarry Smith   PetscScalar  *v1,*v2;
12869ea5d5aeSSatish Balay 
12873a40ed3dSBarry Smith   PetscFunctionBegin;
1288d0f46423SBarry Smith   if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1289d0f46423SBarry Smith   if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1290d0f46423SBarry Smith   for (i=0; i<A1->rmap->n; i++) {
12911b807ce4Svictorle     v1 = mat1->v+i; v2 = mat2->v+i;
1292d0f46423SBarry Smith     for (j=0; j<A1->cmap->n; j++) {
12933a40ed3dSBarry Smith       if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
12941b807ce4Svictorle       v1 += mat1->lda; v2 += mat2->lda;
12951b807ce4Svictorle     }
1296289bc588SBarry Smith   }
129777c4ece6SBarry Smith   *flg = PETSC_TRUE;
12983a40ed3dSBarry Smith   PetscFunctionReturn(0);
1299289bc588SBarry Smith }
1300289bc588SBarry Smith 
13014a2ae208SSatish Balay #undef __FUNCT__
13024a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense"
1303dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v)
1304289bc588SBarry Smith {
1305c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
1306dfbe8321SBarry Smith   PetscErrorCode ierr;
130713f74950SBarry Smith   PetscInt       i,n,len;
130887828ca2SBarry Smith   PetscScalar    *x,zero = 0.0;
130944cd7ae7SLois Curfman McInnes 
13103a40ed3dSBarry Smith   PetscFunctionBegin;
13112dcb1b2aSMatthew Knepley   ierr = VecSet(v,zero);CHKERRQ(ierr);
13127a97a34bSBarry Smith   ierr = VecGetSize(v,&n);CHKERRQ(ierr);
13131ebc52fbSHong Zhang   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1314d0f46423SBarry Smith   len  = PetscMin(A->rmap->n,A->cmap->n);
1315e32f2f54SBarry Smith   if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec");
131644cd7ae7SLois Curfman McInnes   for (i=0; i<len; i++) {
13171b807ce4Svictorle     x[i] = mat->v[i*mat->lda + i];
1318289bc588SBarry Smith   }
13191ebc52fbSHong Zhang   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
13203a40ed3dSBarry Smith   PetscFunctionReturn(0);
1321289bc588SBarry Smith }
1322289bc588SBarry Smith 
13234a2ae208SSatish Balay #undef __FUNCT__
13244a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense"
1325dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr)
1326289bc588SBarry Smith {
1327c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
1328f1ceaac6SMatthew G. Knepley   const PetscScalar *l,*r;
1329f1ceaac6SMatthew G. Knepley   PetscScalar       x,*v;
1330dfbe8321SBarry Smith   PetscErrorCode    ierr;
1331d0f46423SBarry Smith   PetscInt          i,j,m = A->rmap->n,n = A->cmap->n;
133255659b69SBarry Smith 
13333a40ed3dSBarry Smith   PetscFunctionBegin;
133428988994SBarry Smith   if (ll) {
13357a97a34bSBarry Smith     ierr = VecGetSize(ll,&m);CHKERRQ(ierr);
1336f1ceaac6SMatthew G. Knepley     ierr = VecGetArrayRead(ll,&l);CHKERRQ(ierr);
1337e32f2f54SBarry Smith     if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size");
1338da3a660dSBarry Smith     for (i=0; i<m; i++) {
1339da3a660dSBarry Smith       x = l[i];
1340da3a660dSBarry Smith       v = mat->v + i;
1341da3a660dSBarry Smith       for (j=0; j<n; j++) { (*v) *= x; v+= m;}
1342da3a660dSBarry Smith     }
1343f1ceaac6SMatthew G. Knepley     ierr = VecRestoreArrayRead(ll,&l);CHKERRQ(ierr);
1344eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr);
1345da3a660dSBarry Smith   }
134628988994SBarry Smith   if (rr) {
13477a97a34bSBarry Smith     ierr = VecGetSize(rr,&n);CHKERRQ(ierr);
1348f1ceaac6SMatthew G. Knepley     ierr = VecGetArrayRead(rr,&r);CHKERRQ(ierr);
1349e32f2f54SBarry Smith     if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size");
1350da3a660dSBarry Smith     for (i=0; i<n; i++) {
1351da3a660dSBarry Smith       x = r[i];
1352da3a660dSBarry Smith       v = mat->v + i*m;
13532205254eSKarl Rupp       for (j=0; j<m; j++) (*v++) *= x;
1354da3a660dSBarry Smith     }
1355f1ceaac6SMatthew G. Knepley     ierr = VecRestoreArrayRead(rr,&r);CHKERRQ(ierr);
1356eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr);
1357da3a660dSBarry Smith   }
13583a40ed3dSBarry Smith   PetscFunctionReturn(0);
1359289bc588SBarry Smith }
1360289bc588SBarry Smith 
13614a2ae208SSatish Balay #undef __FUNCT__
13624a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense"
1363dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm)
1364289bc588SBarry Smith {
1365c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
136687828ca2SBarry Smith   PetscScalar    *v   = mat->v;
1367329f5518SBarry Smith   PetscReal      sum  = 0.0;
1368d0f46423SBarry Smith   PetscInt       lda  =mat->lda,m=A->rmap->n,i,j;
1369efee365bSSatish Balay   PetscErrorCode ierr;
137055659b69SBarry Smith 
13713a40ed3dSBarry Smith   PetscFunctionBegin;
1372289bc588SBarry Smith   if (type == NORM_FROBENIUS) {
1373a5ce6ee0Svictorle     if (lda>m) {
1374d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1375a5ce6ee0Svictorle         v = mat->v+j*lda;
1376a5ce6ee0Svictorle         for (i=0; i<m; i++) {
1377a5ce6ee0Svictorle           sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1378a5ce6ee0Svictorle         }
1379a5ce6ee0Svictorle       }
1380a5ce6ee0Svictorle     } else {
1381d0f46423SBarry Smith       for (i=0; i<A->cmap->n*A->rmap->n; i++) {
1382329f5518SBarry Smith         sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1383289bc588SBarry Smith       }
1384a5ce6ee0Svictorle     }
13858f1a2a5eSBarry Smith     *nrm = PetscSqrtReal(sum);
1386dc0b31edSSatish Balay     ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
13873a40ed3dSBarry Smith   } else if (type == NORM_1) {
1388064f8208SBarry Smith     *nrm = 0.0;
1389d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
13901b807ce4Svictorle       v   = mat->v + j*mat->lda;
1391289bc588SBarry Smith       sum = 0.0;
1392d0f46423SBarry Smith       for (i=0; i<A->rmap->n; i++) {
139333a8263dSBarry Smith         sum += PetscAbsScalar(*v);  v++;
1394289bc588SBarry Smith       }
1395064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1396289bc588SBarry Smith     }
1397eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
13983a40ed3dSBarry Smith   } else if (type == NORM_INFINITY) {
1399064f8208SBarry Smith     *nrm = 0.0;
1400d0f46423SBarry Smith     for (j=0; j<A->rmap->n; j++) {
1401289bc588SBarry Smith       v   = mat->v + j;
1402289bc588SBarry Smith       sum = 0.0;
1403d0f46423SBarry Smith       for (i=0; i<A->cmap->n; i++) {
14041b807ce4Svictorle         sum += PetscAbsScalar(*v); v += mat->lda;
1405289bc588SBarry Smith       }
1406064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1407289bc588SBarry Smith     }
1408eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
1409e7e72b3dSBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm");
14103a40ed3dSBarry Smith   PetscFunctionReturn(0);
1411289bc588SBarry Smith }
1412289bc588SBarry Smith 
14134a2ae208SSatish Balay #undef __FUNCT__
14144a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense"
1415ace3abfcSBarry Smith PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg)
1416289bc588SBarry Smith {
1417c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *aij = (Mat_SeqDense*)A->data;
141863ba0a88SBarry Smith   PetscErrorCode ierr;
141967e560aaSBarry Smith 
14203a40ed3dSBarry Smith   PetscFunctionBegin;
1421b5a2b587SKris Buschelman   switch (op) {
1422b5a2b587SKris Buschelman   case MAT_ROW_ORIENTED:
14234e0d8c25SBarry Smith     aij->roworiented = flg;
1424b5a2b587SKris Buschelman     break;
1425512a5fc5SBarry Smith   case MAT_NEW_NONZERO_LOCATIONS:
1426b5a2b587SKris Buschelman   case MAT_NEW_NONZERO_LOCATION_ERR:
14273971808eSMatthew Knepley   case MAT_NEW_NONZERO_ALLOCATION_ERR:
14284e0d8c25SBarry Smith   case MAT_NEW_DIAGONALS:
142913fa8e87SLisandro Dalcin   case MAT_KEEP_NONZERO_PATTERN:
1430b5a2b587SKris Buschelman   case MAT_IGNORE_OFF_PROC_ENTRIES:
1431b5a2b587SKris Buschelman   case MAT_USE_HASH_TABLE:
14325021d80fSJed Brown   case MAT_IGNORE_LOWER_TRIANGULAR:
14335021d80fSJed Brown     ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr);
14345021d80fSJed Brown     break;
14355021d80fSJed Brown   case MAT_SPD:
143677e54ba9SKris Buschelman   case MAT_SYMMETRIC:
143777e54ba9SKris Buschelman   case MAT_STRUCTURALLY_SYMMETRIC:
14389a4540c5SBarry Smith   case MAT_HERMITIAN:
14399a4540c5SBarry Smith   case MAT_SYMMETRY_ETERNAL:
14405021d80fSJed Brown     /* These options are handled directly by MatSetOption() */
144177e54ba9SKris Buschelman     break;
1442b5a2b587SKris Buschelman   default:
1443e32f2f54SBarry Smith     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]);
14443a40ed3dSBarry Smith   }
14453a40ed3dSBarry Smith   PetscFunctionReturn(0);
1446289bc588SBarry Smith }
1447289bc588SBarry Smith 
14484a2ae208SSatish Balay #undef __FUNCT__
14494a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense"
1450dfbe8321SBarry Smith PetscErrorCode MatZeroEntries_SeqDense(Mat A)
14516f0a148fSBarry Smith {
1452ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)A->data;
14536849ba73SBarry Smith   PetscErrorCode ierr;
1454d0f46423SBarry Smith   PetscInt       lda=l->lda,m=A->rmap->n,j;
14553a40ed3dSBarry Smith 
14563a40ed3dSBarry Smith   PetscFunctionBegin;
1457a5ce6ee0Svictorle   if (lda>m) {
1458d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1459a5ce6ee0Svictorle       ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
1460a5ce6ee0Svictorle     }
1461a5ce6ee0Svictorle   } else {
1462d0f46423SBarry Smith     ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1463a5ce6ee0Svictorle   }
14643a40ed3dSBarry Smith   PetscFunctionReturn(0);
14656f0a148fSBarry Smith }
14666f0a148fSBarry Smith 
14674a2ae208SSatish Balay #undef __FUNCT__
14684a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense"
14692b40b63fSBarry Smith PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b)
14706f0a148fSBarry Smith {
147197b48c8fSBarry Smith   PetscErrorCode    ierr;
1472ec8511deSBarry Smith   Mat_SeqDense      *l = (Mat_SeqDense*)A->data;
1473b9679d65SBarry Smith   PetscInt          m  = l->lda, n = A->cmap->n, i,j;
147497b48c8fSBarry Smith   PetscScalar       *slot,*bb;
147597b48c8fSBarry Smith   const PetscScalar *xx;
147655659b69SBarry Smith 
14773a40ed3dSBarry Smith   PetscFunctionBegin;
1478b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG)
1479b9679d65SBarry Smith   for (i=0; i<N; i++) {
1480b9679d65SBarry Smith     if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed");
1481b9679d65SBarry 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);
1482b9679d65SBarry Smith   }
1483b9679d65SBarry Smith #endif
1484b9679d65SBarry Smith 
148597b48c8fSBarry Smith   /* fix right hand side if needed */
148697b48c8fSBarry Smith   if (x && b) {
148797b48c8fSBarry Smith     ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr);
148897b48c8fSBarry Smith     ierr = VecGetArray(b,&bb);CHKERRQ(ierr);
14892205254eSKarl Rupp     for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]];
149097b48c8fSBarry Smith     ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr);
149197b48c8fSBarry Smith     ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr);
149297b48c8fSBarry Smith   }
149397b48c8fSBarry Smith 
14946f0a148fSBarry Smith   for (i=0; i<N; i++) {
14956f0a148fSBarry Smith     slot = l->v + rows[i];
1496b9679d65SBarry Smith     for (j=0; j<n; j++) { *slot = 0.0; slot += m;}
14976f0a148fSBarry Smith   }
1498f4df32b1SMatthew Knepley   if (diag != 0.0) {
1499b9679d65SBarry Smith     if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices");
15006f0a148fSBarry Smith     for (i=0; i<N; i++) {
1501b9679d65SBarry Smith       slot  = l->v + (m+1)*rows[i];
1502f4df32b1SMatthew Knepley       *slot = diag;
15036f0a148fSBarry Smith     }
15046f0a148fSBarry Smith   }
15053a40ed3dSBarry Smith   PetscFunctionReturn(0);
15066f0a148fSBarry Smith }
1507557bce09SLois Curfman McInnes 
15084a2ae208SSatish Balay #undef __FUNCT__
15098c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray_SeqDense"
15108c778c55SBarry Smith PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar *array[])
151164e87e97SBarry Smith {
1512c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
15133a40ed3dSBarry Smith 
15143a40ed3dSBarry Smith   PetscFunctionBegin;
1515e32f2f54SBarry 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");
151664e87e97SBarry Smith   *array = mat->v;
15173a40ed3dSBarry Smith   PetscFunctionReturn(0);
151864e87e97SBarry Smith }
15190754003eSLois Curfman McInnes 
15204a2ae208SSatish Balay #undef __FUNCT__
15218c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray_SeqDense"
15228c778c55SBarry Smith PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar *array[])
1523ff14e315SSatish Balay {
15243a40ed3dSBarry Smith   PetscFunctionBegin;
152509b544d4SBarry Smith   *array = 0; /* user cannot accidently use the array later */
15263a40ed3dSBarry Smith   PetscFunctionReturn(0);
1527ff14e315SSatish Balay }
15280754003eSLois Curfman McInnes 
15294a2ae208SSatish Balay #undef __FUNCT__
15308c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray"
1531dec5eb66SMatthew G Knepley /*@C
15328c778c55SBarry Smith    MatDenseGetArray - gives access to the array where the data for a SeqDense matrix is stored
153373a71a0fSBarry Smith 
153473a71a0fSBarry Smith    Not Collective
153573a71a0fSBarry Smith 
153673a71a0fSBarry Smith    Input Parameter:
1537579dbff0SBarry Smith .  mat - a MATSEQDENSE or MATMPIDENSE matrix
153873a71a0fSBarry Smith 
153973a71a0fSBarry Smith    Output Parameter:
154073a71a0fSBarry Smith .   array - pointer to the data
154173a71a0fSBarry Smith 
154273a71a0fSBarry Smith    Level: intermediate
154373a71a0fSBarry Smith 
15448c778c55SBarry Smith .seealso: MatDenseRestoreArray()
154573a71a0fSBarry Smith @*/
15468c778c55SBarry Smith PetscErrorCode  MatDenseGetArray(Mat A,PetscScalar **array)
154773a71a0fSBarry Smith {
154873a71a0fSBarry Smith   PetscErrorCode ierr;
154973a71a0fSBarry Smith 
155073a71a0fSBarry Smith   PetscFunctionBegin;
15518c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
155273a71a0fSBarry Smith   PetscFunctionReturn(0);
155373a71a0fSBarry Smith }
155473a71a0fSBarry Smith 
155573a71a0fSBarry Smith #undef __FUNCT__
15568c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray"
1557dec5eb66SMatthew G Knepley /*@C
1558579dbff0SBarry Smith    MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray()
155973a71a0fSBarry Smith 
156073a71a0fSBarry Smith    Not Collective
156173a71a0fSBarry Smith 
156273a71a0fSBarry Smith    Input Parameters:
1563579dbff0SBarry Smith .  mat - a MATSEQDENSE or MATMPIDENSE matrix
156473a71a0fSBarry Smith .  array - pointer to the data
156573a71a0fSBarry Smith 
156673a71a0fSBarry Smith    Level: intermediate
156773a71a0fSBarry Smith 
15688c778c55SBarry Smith .seealso: MatDenseGetArray()
156973a71a0fSBarry Smith @*/
15708c778c55SBarry Smith PetscErrorCode  MatDenseRestoreArray(Mat A,PetscScalar **array)
157173a71a0fSBarry Smith {
157273a71a0fSBarry Smith   PetscErrorCode ierr;
157373a71a0fSBarry Smith 
157473a71a0fSBarry Smith   PetscFunctionBegin;
15758c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
157673a71a0fSBarry Smith   PetscFunctionReturn(0);
157773a71a0fSBarry Smith }
157873a71a0fSBarry Smith 
157973a71a0fSBarry Smith #undef __FUNCT__
15804a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense"
158113f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B)
15820754003eSLois Curfman McInnes {
1583c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
15846849ba73SBarry Smith   PetscErrorCode ierr;
15855d0c19d7SBarry Smith   PetscInt       i,j,nrows,ncols;
15865d0c19d7SBarry Smith   const PetscInt *irow,*icol;
158787828ca2SBarry Smith   PetscScalar    *av,*bv,*v = mat->v;
15880754003eSLois Curfman McInnes   Mat            newmat;
15890754003eSLois Curfman McInnes 
15903a40ed3dSBarry Smith   PetscFunctionBegin;
159178b31e54SBarry Smith   ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr);
159278b31e54SBarry Smith   ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr);
1593e03a110bSBarry Smith   ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr);
1594e03a110bSBarry Smith   ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr);
15950754003eSLois Curfman McInnes 
1596182d2002SSatish Balay   /* Check submatrixcall */
1597182d2002SSatish Balay   if (scall == MAT_REUSE_MATRIX) {
159813f74950SBarry Smith     PetscInt n_cols,n_rows;
1599182d2002SSatish Balay     ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr);
160021a2c019SBarry Smith     if (n_rows != nrows || n_cols != ncols) {
1601f746d493SDmitry Karpeev       /* resize the result matrix to match number of requested rows/columns */
1602c61587bbSBarry Smith       ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
160321a2c019SBarry Smith     }
1604182d2002SSatish Balay     newmat = *B;
1605182d2002SSatish Balay   } else {
16060754003eSLois Curfman McInnes     /* Create and fill new matrix */
1607ce94432eSBarry Smith     ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr);
1608f69a0ea3SMatthew Knepley     ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
16097adad957SLisandro Dalcin     ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
16100298fd71SBarry Smith     ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr);
1611182d2002SSatish Balay   }
1612182d2002SSatish Balay 
1613182d2002SSatish Balay   /* Now extract the data pointers and do the copy,column at a time */
1614182d2002SSatish Balay   bv = ((Mat_SeqDense*)newmat->data)->v;
1615182d2002SSatish Balay 
1616182d2002SSatish Balay   for (i=0; i<ncols; i++) {
16176de62eeeSBarry Smith     av = v + mat->lda*icol[i];
16182205254eSKarl Rupp     for (j=0; j<nrows; j++) *bv++ = av[irow[j]];
16190754003eSLois Curfman McInnes   }
1620182d2002SSatish Balay 
1621182d2002SSatish Balay   /* Assemble the matrices so that the correct flags are set */
16226d4a8577SBarry Smith   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
16236d4a8577SBarry Smith   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
16240754003eSLois Curfman McInnes 
16250754003eSLois Curfman McInnes   /* Free work space */
162678b31e54SBarry Smith   ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr);
162778b31e54SBarry Smith   ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr);
1628182d2002SSatish Balay   *B   = newmat;
16293a40ed3dSBarry Smith   PetscFunctionReturn(0);
16300754003eSLois Curfman McInnes }
16310754003eSLois Curfman McInnes 
16324a2ae208SSatish Balay #undef __FUNCT__
16334a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense"
163413f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[])
1635905e6a2fSBarry Smith {
16366849ba73SBarry Smith   PetscErrorCode ierr;
163713f74950SBarry Smith   PetscInt       i;
1638905e6a2fSBarry Smith 
16393a40ed3dSBarry Smith   PetscFunctionBegin;
1640905e6a2fSBarry Smith   if (scall == MAT_INITIAL_MATRIX) {
1641854ce69bSBarry Smith     ierr = PetscMalloc1(n+1,B);CHKERRQ(ierr);
1642905e6a2fSBarry Smith   }
1643905e6a2fSBarry Smith 
1644905e6a2fSBarry Smith   for (i=0; i<n; i++) {
16456a6a5d1dSBarry Smith     ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr);
1646905e6a2fSBarry Smith   }
16473a40ed3dSBarry Smith   PetscFunctionReturn(0);
1648905e6a2fSBarry Smith }
1649905e6a2fSBarry Smith 
16504a2ae208SSatish Balay #undef __FUNCT__
1651c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense"
1652c0aa2d19SHong Zhang PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode)
1653c0aa2d19SHong Zhang {
1654c0aa2d19SHong Zhang   PetscFunctionBegin;
1655c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1656c0aa2d19SHong Zhang }
1657c0aa2d19SHong Zhang 
1658c0aa2d19SHong Zhang #undef __FUNCT__
1659c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense"
1660c0aa2d19SHong Zhang PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode)
1661c0aa2d19SHong Zhang {
1662c0aa2d19SHong Zhang   PetscFunctionBegin;
1663c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1664c0aa2d19SHong Zhang }
1665c0aa2d19SHong Zhang 
1666c0aa2d19SHong Zhang #undef __FUNCT__
16674a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense"
1668dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str)
16694b0e389bSBarry Smith {
16704b0e389bSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data;
16716849ba73SBarry Smith   PetscErrorCode ierr;
1672d0f46423SBarry Smith   PetscInt       lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j;
16733a40ed3dSBarry Smith 
16743a40ed3dSBarry Smith   PetscFunctionBegin;
167533f4a19fSKris Buschelman   /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */
167633f4a19fSKris Buschelman   if (A->ops->copy != B->ops->copy) {
1677cb5b572fSBarry Smith     ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr);
16783a40ed3dSBarry Smith     PetscFunctionReturn(0);
16793a40ed3dSBarry Smith   }
1680e32f2f54SBarry Smith   if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)");
1681a5ce6ee0Svictorle   if (lda1>m || lda2>m) {
16820dbb7854Svictorle     for (j=0; j<n; j++) {
1683a5ce6ee0Svictorle       ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr);
1684a5ce6ee0Svictorle     }
1685a5ce6ee0Svictorle   } else {
1686d0f46423SBarry Smith     ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1687a5ce6ee0Svictorle   }
1688273d9f13SBarry Smith   PetscFunctionReturn(0);
1689273d9f13SBarry Smith }
1690273d9f13SBarry Smith 
16914a2ae208SSatish Balay #undef __FUNCT__
16924994cf47SJed Brown #define __FUNCT__ "MatSetUp_SeqDense"
16934994cf47SJed Brown PetscErrorCode MatSetUp_SeqDense(Mat A)
1694273d9f13SBarry Smith {
1695dfbe8321SBarry Smith   PetscErrorCode ierr;
1696273d9f13SBarry Smith 
1697273d9f13SBarry Smith   PetscFunctionBegin;
1698273d9f13SBarry Smith   ierr =  MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr);
16993a40ed3dSBarry Smith   PetscFunctionReturn(0);
17004b0e389bSBarry Smith }
17014b0e389bSBarry Smith 
1702284134d9SBarry Smith #undef __FUNCT__
1703ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense"
1704ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A)
1705ba337c44SJed Brown {
1706ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1707ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1708ba337c44SJed Brown   PetscScalar  *aa = a->v;
1709ba337c44SJed Brown 
1710ba337c44SJed Brown   PetscFunctionBegin;
1711ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]);
1712ba337c44SJed Brown   PetscFunctionReturn(0);
1713ba337c44SJed Brown }
1714ba337c44SJed Brown 
1715ba337c44SJed Brown #undef __FUNCT__
1716ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense"
1717ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A)
1718ba337c44SJed Brown {
1719ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1720ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1721ba337c44SJed Brown   PetscScalar  *aa = a->v;
1722ba337c44SJed Brown 
1723ba337c44SJed Brown   PetscFunctionBegin;
1724ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]);
1725ba337c44SJed Brown   PetscFunctionReturn(0);
1726ba337c44SJed Brown }
1727ba337c44SJed Brown 
1728ba337c44SJed Brown #undef __FUNCT__
1729ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense"
1730ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A)
1731ba337c44SJed Brown {
1732ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1733ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1734ba337c44SJed Brown   PetscScalar  *aa = a->v;
1735ba337c44SJed Brown 
1736ba337c44SJed Brown   PetscFunctionBegin;
1737ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]);
1738ba337c44SJed Brown   PetscFunctionReturn(0);
1739ba337c44SJed Brown }
1740284134d9SBarry Smith 
1741a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/
1742a9fe9ddaSSatish Balay #undef __FUNCT__
1743a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense"
1744a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1745a9fe9ddaSSatish Balay {
1746a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1747a9fe9ddaSSatish Balay 
1748a9fe9ddaSSatish Balay   PetscFunctionBegin;
1749a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
17503ff4c91cSHong Zhang     ierr = PetscLogEventBegin(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1751a9fe9ddaSSatish Balay     ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
17523ff4c91cSHong Zhang     ierr = PetscLogEventEnd(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1753a9fe9ddaSSatish Balay   }
17543ff4c91cSHong Zhang   ierr = PetscLogEventBegin(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1755a9fe9ddaSSatish Balay   ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
17563ff4c91cSHong Zhang   ierr = PetscLogEventEnd(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1757a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1758a9fe9ddaSSatish Balay }
1759a9fe9ddaSSatish Balay 
1760a9fe9ddaSSatish Balay #undef __FUNCT__
1761a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense"
1762a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1763a9fe9ddaSSatish Balay {
1764ee16a9a1SHong Zhang   PetscErrorCode ierr;
1765d0f46423SBarry Smith   PetscInt       m=A->rmap->n,n=B->cmap->n;
1766ee16a9a1SHong Zhang   Mat            Cmat;
1767a9fe9ddaSSatish Balay 
1768ee16a9a1SHong Zhang   PetscFunctionBegin;
1769e32f2f54SBarry 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);
1770ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1771ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1772ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
17730298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr);
1774d73949e8SHong Zhang 
1775ee16a9a1SHong Zhang   *C = Cmat;
1776ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1777ee16a9a1SHong Zhang }
1778a9fe9ddaSSatish Balay 
177998a3b096SSatish Balay #undef __FUNCT__
1780a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense"
1781a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1782a9fe9ddaSSatish Balay {
1783a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1784a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1785a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
17860805154bSBarry Smith   PetscBLASInt   m,n,k;
1787a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1788c5df96a5SBarry Smith   PetscErrorCode ierr;
1789a9fe9ddaSSatish Balay 
1790a9fe9ddaSSatish Balay   PetscFunctionBegin;
1791c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
1792c5df96a5SBarry Smith   ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr);
1793c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr);
1794*5ca1cc5dSStefano Zampini   PetscStackCallBLAS("BLASgemm",BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
1795a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1796a9fe9ddaSSatish Balay }
1797a9fe9ddaSSatish Balay 
1798a9fe9ddaSSatish Balay #undef __FUNCT__
179975648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqDense_SeqDense"
180075648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1801a9fe9ddaSSatish Balay {
1802a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1803a9fe9ddaSSatish Balay 
1804a9fe9ddaSSatish Balay   PetscFunctionBegin;
1805a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
18063ff4c91cSHong Zhang     ierr = PetscLogEventBegin(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
180775648e8dSHong Zhang     ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
18083ff4c91cSHong Zhang     ierr = PetscLogEventEnd(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1809a9fe9ddaSSatish Balay   }
18103ff4c91cSHong Zhang   ierr = PetscLogEventBegin(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr);
181175648e8dSHong Zhang   ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
18123ff4c91cSHong Zhang   ierr = PetscLogEventEnd(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1813a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1814a9fe9ddaSSatish Balay }
1815a9fe9ddaSSatish Balay 
1816a9fe9ddaSSatish Balay #undef __FUNCT__
181775648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqDense_SeqDense"
181875648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1819a9fe9ddaSSatish Balay {
1820ee16a9a1SHong Zhang   PetscErrorCode ierr;
1821d0f46423SBarry Smith   PetscInt       m=A->cmap->n,n=B->cmap->n;
1822ee16a9a1SHong Zhang   Mat            Cmat;
1823a9fe9ddaSSatish Balay 
1824ee16a9a1SHong Zhang   PetscFunctionBegin;
1825e32f2f54SBarry 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);
1826ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1827ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1828ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
18290298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr);
18302205254eSKarl Rupp 
1831ee16a9a1SHong Zhang   Cmat->assembled = PETSC_TRUE;
18322205254eSKarl Rupp 
1833ee16a9a1SHong Zhang   *C = Cmat;
1834ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1835ee16a9a1SHong Zhang }
1836a9fe9ddaSSatish Balay 
1837a9fe9ddaSSatish Balay #undef __FUNCT__
183875648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqDense_SeqDense"
183975648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1840a9fe9ddaSSatish Balay {
1841a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1842a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1843a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
18440805154bSBarry Smith   PetscBLASInt   m,n,k;
1845a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1846c5df96a5SBarry Smith   PetscErrorCode ierr;
1847a9fe9ddaSSatish Balay 
1848a9fe9ddaSSatish Balay   PetscFunctionBegin;
1849c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&m);CHKERRQ(ierr);
1850c5df96a5SBarry Smith   ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr);
1851c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr);
18522fbe02b9SBarry Smith   /*
18532fbe02b9SBarry Smith      Note the m and n arguments below are the number rows and columns of A', not A!
18542fbe02b9SBarry Smith   */
1855*5ca1cc5dSStefano Zampini   PetscStackCallBLAS("BLASgemm",BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
1856a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1857a9fe9ddaSSatish Balay }
1858985db425SBarry Smith 
1859985db425SBarry Smith #undef __FUNCT__
1860985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense"
1861985db425SBarry Smith PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[])
1862985db425SBarry Smith {
1863985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1864985db425SBarry Smith   PetscErrorCode ierr;
1865d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1866985db425SBarry Smith   PetscScalar    *x;
1867985db425SBarry Smith   MatScalar      *aa = a->v;
1868985db425SBarry Smith 
1869985db425SBarry Smith   PetscFunctionBegin;
1870e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1871985db425SBarry Smith 
1872985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1873985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1874985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1875e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1876985db425SBarry Smith   for (i=0; i<m; i++) {
1877985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1878985db425SBarry Smith     for (j=1; j<n; j++) {
1879985db425SBarry Smith       if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1880985db425SBarry Smith     }
1881985db425SBarry Smith   }
1882985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1883985db425SBarry Smith   PetscFunctionReturn(0);
1884985db425SBarry Smith }
1885985db425SBarry Smith 
1886985db425SBarry Smith #undef __FUNCT__
1887985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense"
1888985db425SBarry Smith PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[])
1889985db425SBarry Smith {
1890985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1891985db425SBarry Smith   PetscErrorCode ierr;
1892d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1893985db425SBarry Smith   PetscScalar    *x;
1894985db425SBarry Smith   PetscReal      atmp;
1895985db425SBarry Smith   MatScalar      *aa = a->v;
1896985db425SBarry Smith 
1897985db425SBarry Smith   PetscFunctionBegin;
1898e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1899985db425SBarry Smith 
1900985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1901985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1902985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1903e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1904985db425SBarry Smith   for (i=0; i<m; i++) {
19059189402eSHong Zhang     x[i] = PetscAbsScalar(aa[i]);
1906985db425SBarry Smith     for (j=1; j<n; j++) {
1907985db425SBarry Smith       atmp = PetscAbsScalar(aa[i+m*j]);
1908985db425SBarry Smith       if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;}
1909985db425SBarry Smith     }
1910985db425SBarry Smith   }
1911985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1912985db425SBarry Smith   PetscFunctionReturn(0);
1913985db425SBarry Smith }
1914985db425SBarry Smith 
1915985db425SBarry Smith #undef __FUNCT__
1916985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense"
1917985db425SBarry Smith PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[])
1918985db425SBarry Smith {
1919985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1920985db425SBarry Smith   PetscErrorCode ierr;
1921d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1922985db425SBarry Smith   PetscScalar    *x;
1923985db425SBarry Smith   MatScalar      *aa = a->v;
1924985db425SBarry Smith 
1925985db425SBarry Smith   PetscFunctionBegin;
1926e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1927985db425SBarry Smith 
1928985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1929985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1930985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1931e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1932985db425SBarry Smith   for (i=0; i<m; i++) {
1933985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1934985db425SBarry Smith     for (j=1; j<n; j++) {
1935985db425SBarry Smith       if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1936985db425SBarry Smith     }
1937985db425SBarry Smith   }
1938985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1939985db425SBarry Smith   PetscFunctionReturn(0);
1940985db425SBarry Smith }
1941985db425SBarry Smith 
19428d0534beSBarry Smith #undef __FUNCT__
19438d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense"
19448d0534beSBarry Smith PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col)
19458d0534beSBarry Smith {
19468d0534beSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
19478d0534beSBarry Smith   PetscErrorCode ierr;
19488d0534beSBarry Smith   PetscScalar    *x;
19498d0534beSBarry Smith 
19508d0534beSBarry Smith   PetscFunctionBegin;
1951e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
19528d0534beSBarry Smith 
19538d0534beSBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1954d0f46423SBarry Smith   ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
19558d0534beSBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
19568d0534beSBarry Smith   PetscFunctionReturn(0);
19578d0534beSBarry Smith }
19588d0534beSBarry Smith 
19590716a85fSBarry Smith 
19600716a85fSBarry Smith #undef __FUNCT__
19610716a85fSBarry Smith #define __FUNCT__ "MatGetColumnNorms_SeqDense"
19620716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms)
19630716a85fSBarry Smith {
19640716a85fSBarry Smith   PetscErrorCode ierr;
19650716a85fSBarry Smith   PetscInt       i,j,m,n;
19660716a85fSBarry Smith   PetscScalar    *a;
19670716a85fSBarry Smith 
19680716a85fSBarry Smith   PetscFunctionBegin;
19690716a85fSBarry Smith   ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr);
19700716a85fSBarry Smith   ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr);
19718c778c55SBarry Smith   ierr = MatDenseGetArray(A,&a);CHKERRQ(ierr);
19720716a85fSBarry Smith   if (type == NORM_2) {
19730716a85fSBarry Smith     for (i=0; i<n; i++) {
19740716a85fSBarry Smith       for (j=0; j<m; j++) {
19750716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]*a[j]);
19760716a85fSBarry Smith       }
19770716a85fSBarry Smith       a += m;
19780716a85fSBarry Smith     }
19790716a85fSBarry Smith   } else if (type == NORM_1) {
19800716a85fSBarry Smith     for (i=0; i<n; i++) {
19810716a85fSBarry Smith       for (j=0; j<m; j++) {
19820716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]);
19830716a85fSBarry Smith       }
19840716a85fSBarry Smith       a += m;
19850716a85fSBarry Smith     }
19860716a85fSBarry Smith   } else if (type == NORM_INFINITY) {
19870716a85fSBarry Smith     for (i=0; i<n; i++) {
19880716a85fSBarry Smith       for (j=0; j<m; j++) {
19890716a85fSBarry Smith         norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]);
19900716a85fSBarry Smith       }
19910716a85fSBarry Smith       a += m;
19920716a85fSBarry Smith     }
1993ce94432eSBarry Smith   } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType");
19948c778c55SBarry Smith   ierr = MatDenseRestoreArray(A,&a);CHKERRQ(ierr);
19950716a85fSBarry Smith   if (type == NORM_2) {
19968f1a2a5eSBarry Smith     for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]);
19970716a85fSBarry Smith   }
19980716a85fSBarry Smith   PetscFunctionReturn(0);
19990716a85fSBarry Smith }
20000716a85fSBarry Smith 
200173a71a0fSBarry Smith #undef __FUNCT__
200273a71a0fSBarry Smith #define __FUNCT__ "MatSetRandom_SeqDense"
200373a71a0fSBarry Smith static PetscErrorCode  MatSetRandom_SeqDense(Mat x,PetscRandom rctx)
200473a71a0fSBarry Smith {
200573a71a0fSBarry Smith   PetscErrorCode ierr;
200673a71a0fSBarry Smith   PetscScalar    *a;
200773a71a0fSBarry Smith   PetscInt       m,n,i;
200873a71a0fSBarry Smith 
200973a71a0fSBarry Smith   PetscFunctionBegin;
201073a71a0fSBarry Smith   ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr);
20118c778c55SBarry Smith   ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr);
201273a71a0fSBarry Smith   for (i=0; i<m*n; i++) {
201373a71a0fSBarry Smith     ierr = PetscRandomGetValue(rctx,a+i);CHKERRQ(ierr);
201473a71a0fSBarry Smith   }
20158c778c55SBarry Smith   ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr);
201673a71a0fSBarry Smith   PetscFunctionReturn(0);
201773a71a0fSBarry Smith }
201873a71a0fSBarry Smith 
201973a71a0fSBarry Smith 
2020289bc588SBarry Smith /* -------------------------------------------------------------------*/
2021a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense,
2022905e6a2fSBarry Smith                                         MatGetRow_SeqDense,
2023905e6a2fSBarry Smith                                         MatRestoreRow_SeqDense,
2024905e6a2fSBarry Smith                                         MatMult_SeqDense,
202597304618SKris Buschelman                                 /*  4*/ MatMultAdd_SeqDense,
20267c922b88SBarry Smith                                         MatMultTranspose_SeqDense,
20277c922b88SBarry Smith                                         MatMultTransposeAdd_SeqDense,
2028db4efbfdSBarry Smith                                         0,
2029db4efbfdSBarry Smith                                         0,
2030db4efbfdSBarry Smith                                         0,
2031db4efbfdSBarry Smith                                 /* 10*/ 0,
2032905e6a2fSBarry Smith                                         MatLUFactor_SeqDense,
2033905e6a2fSBarry Smith                                         MatCholeskyFactor_SeqDense,
203441f059aeSBarry Smith                                         MatSOR_SeqDense,
2035ec8511deSBarry Smith                                         MatTranspose_SeqDense,
203697304618SKris Buschelman                                 /* 15*/ MatGetInfo_SeqDense,
2037905e6a2fSBarry Smith                                         MatEqual_SeqDense,
2038905e6a2fSBarry Smith                                         MatGetDiagonal_SeqDense,
2039905e6a2fSBarry Smith                                         MatDiagonalScale_SeqDense,
2040905e6a2fSBarry Smith                                         MatNorm_SeqDense,
2041c0aa2d19SHong Zhang                                 /* 20*/ MatAssemblyBegin_SeqDense,
2042c0aa2d19SHong Zhang                                         MatAssemblyEnd_SeqDense,
2043905e6a2fSBarry Smith                                         MatSetOption_SeqDense,
2044905e6a2fSBarry Smith                                         MatZeroEntries_SeqDense,
2045d519adbfSMatthew Knepley                                 /* 24*/ MatZeroRows_SeqDense,
2046db4efbfdSBarry Smith                                         0,
2047db4efbfdSBarry Smith                                         0,
2048db4efbfdSBarry Smith                                         0,
2049db4efbfdSBarry Smith                                         0,
20504994cf47SJed Brown                                 /* 29*/ MatSetUp_SeqDense,
2051273d9f13SBarry Smith                                         0,
2052905e6a2fSBarry Smith                                         0,
205373a71a0fSBarry Smith                                         0,
205473a71a0fSBarry Smith                                         0,
2055d519adbfSMatthew Knepley                                 /* 34*/ MatDuplicate_SeqDense,
2056a5ae1ecdSBarry Smith                                         0,
2057a5ae1ecdSBarry Smith                                         0,
2058a5ae1ecdSBarry Smith                                         0,
2059a5ae1ecdSBarry Smith                                         0,
2060d519adbfSMatthew Knepley                                 /* 39*/ MatAXPY_SeqDense,
2061a5ae1ecdSBarry Smith                                         MatGetSubMatrices_SeqDense,
2062a5ae1ecdSBarry Smith                                         0,
20634b0e389bSBarry Smith                                         MatGetValues_SeqDense,
2064a5ae1ecdSBarry Smith                                         MatCopy_SeqDense,
2065d519adbfSMatthew Knepley                                 /* 44*/ MatGetRowMax_SeqDense,
2066a5ae1ecdSBarry Smith                                         MatScale_SeqDense,
20677d68702bSBarry Smith                                         MatShift_Basic,
2068a5ae1ecdSBarry Smith                                         0,
2069a5ae1ecdSBarry Smith                                         0,
207073a71a0fSBarry Smith                                 /* 49*/ MatSetRandom_SeqDense,
2071a5ae1ecdSBarry Smith                                         0,
2072a5ae1ecdSBarry Smith                                         0,
2073a5ae1ecdSBarry Smith                                         0,
2074a5ae1ecdSBarry Smith                                         0,
2075d519adbfSMatthew Knepley                                 /* 54*/ 0,
2076a5ae1ecdSBarry Smith                                         0,
2077a5ae1ecdSBarry Smith                                         0,
2078a5ae1ecdSBarry Smith                                         0,
2079a5ae1ecdSBarry Smith                                         0,
2080d519adbfSMatthew Knepley                                 /* 59*/ 0,
2081e03a110bSBarry Smith                                         MatDestroy_SeqDense,
2082e03a110bSBarry Smith                                         MatView_SeqDense,
2083357abbc8SBarry Smith                                         0,
208497304618SKris Buschelman                                         0,
2085d519adbfSMatthew Knepley                                 /* 64*/ 0,
208697304618SKris Buschelman                                         0,
208797304618SKris Buschelman                                         0,
208897304618SKris Buschelman                                         0,
208997304618SKris Buschelman                                         0,
2090d519adbfSMatthew Knepley                                 /* 69*/ MatGetRowMaxAbs_SeqDense,
209197304618SKris Buschelman                                         0,
209297304618SKris Buschelman                                         0,
209397304618SKris Buschelman                                         0,
209497304618SKris Buschelman                                         0,
2095d519adbfSMatthew Knepley                                 /* 74*/ 0,
209697304618SKris Buschelman                                         0,
209797304618SKris Buschelman                                         0,
209897304618SKris Buschelman                                         0,
209997304618SKris Buschelman                                         0,
2100d519adbfSMatthew Knepley                                 /* 79*/ 0,
210197304618SKris Buschelman                                         0,
210297304618SKris Buschelman                                         0,
210397304618SKris Buschelman                                         0,
21045bba2384SShri Abhyankar                                 /* 83*/ MatLoad_SeqDense,
2105865e5f61SKris Buschelman                                         0,
21061cbb95d3SBarry Smith                                         MatIsHermitian_SeqDense,
2107865e5f61SKris Buschelman                                         0,
2108865e5f61SKris Buschelman                                         0,
2109865e5f61SKris Buschelman                                         0,
2110d519adbfSMatthew Knepley                                 /* 89*/ MatMatMult_SeqDense_SeqDense,
2111a9fe9ddaSSatish Balay                                         MatMatMultSymbolic_SeqDense_SeqDense,
2112a9fe9ddaSSatish Balay                                         MatMatMultNumeric_SeqDense_SeqDense,
2113865e5f61SKris Buschelman                                         0,
2114865e5f61SKris Buschelman                                         0,
2115d519adbfSMatthew Knepley                                 /* 94*/ 0,
21165df89d91SHong Zhang                                         0,
21175df89d91SHong Zhang                                         0,
21185df89d91SHong Zhang                                         0,
2119284134d9SBarry Smith                                         0,
2120d519adbfSMatthew Knepley                                 /* 99*/ 0,
2121284134d9SBarry Smith                                         0,
2122284134d9SBarry Smith                                         0,
2123ba337c44SJed Brown                                         MatConjugate_SeqDense,
2124f73d5cc4SBarry Smith                                         0,
2125ba337c44SJed Brown                                 /*104*/ 0,
2126ba337c44SJed Brown                                         MatRealPart_SeqDense,
2127ba337c44SJed Brown                                         MatImaginaryPart_SeqDense,
2128985db425SBarry Smith                                         0,
2129985db425SBarry Smith                                         0,
213085e2c93fSHong Zhang                                 /*109*/ MatMatSolve_SeqDense,
2131985db425SBarry Smith                                         0,
21328d0534beSBarry Smith                                         MatGetRowMin_SeqDense,
2133aabbc4fbSShri Abhyankar                                         MatGetColumnVector_SeqDense,
2134aabbc4fbSShri Abhyankar                                         0,
2135aabbc4fbSShri Abhyankar                                 /*114*/ 0,
2136aabbc4fbSShri Abhyankar                                         0,
2137aabbc4fbSShri Abhyankar                                         0,
2138aabbc4fbSShri Abhyankar                                         0,
2139aabbc4fbSShri Abhyankar                                         0,
2140aabbc4fbSShri Abhyankar                                 /*119*/ 0,
2141aabbc4fbSShri Abhyankar                                         0,
2142aabbc4fbSShri Abhyankar                                         0,
21430716a85fSBarry Smith                                         0,
21440716a85fSBarry Smith                                         0,
21450716a85fSBarry Smith                                 /*124*/ 0,
21465df89d91SHong Zhang                                         MatGetColumnNorms_SeqDense,
21475df89d91SHong Zhang                                         0,
21485df89d91SHong Zhang                                         0,
21495df89d91SHong Zhang                                         0,
21505df89d91SHong Zhang                                 /*129*/ 0,
215175648e8dSHong Zhang                                         MatTransposeMatMult_SeqDense_SeqDense,
215275648e8dSHong Zhang                                         MatTransposeMatMultSymbolic_SeqDense_SeqDense,
215375648e8dSHong Zhang                                         MatTransposeMatMultNumeric_SeqDense_SeqDense,
21543964eb88SJed Brown                                         0,
21553964eb88SJed Brown                                 /*134*/ 0,
21563964eb88SJed Brown                                         0,
21573964eb88SJed Brown                                         0,
21583964eb88SJed Brown                                         0,
21593964eb88SJed Brown                                         0,
21603964eb88SJed Brown                                 /*139*/ 0,
2161f9426fe0SMark Adams                                         0,
21623964eb88SJed Brown                                         0
2163985db425SBarry Smith };
216490ace30eSBarry Smith 
21654a2ae208SSatish Balay #undef __FUNCT__
21664a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense"
21674b828684SBarry Smith /*@C
2168fafbff53SBarry Smith    MatCreateSeqDense - Creates a sequential dense matrix that
2169d65003e9SLois Curfman McInnes    is stored in column major order (the usual Fortran 77 manner). Many
2170d65003e9SLois Curfman McInnes    of the matrix operations use the BLAS and LAPACK routines.
2171289bc588SBarry Smith 
2172db81eaa0SLois Curfman McInnes    Collective on MPI_Comm
2173db81eaa0SLois Curfman McInnes 
217420563c6bSBarry Smith    Input Parameters:
2175db81eaa0SLois Curfman McInnes +  comm - MPI communicator, set to PETSC_COMM_SELF
21760c775827SLois Curfman McInnes .  m - number of rows
217718f449edSLois Curfman McInnes .  n - number of columns
21780298fd71SBarry Smith -  data - optional location of matrix data in column major order.  Set data=NULL for PETSc
2179dfc5480cSLois Curfman McInnes    to control all matrix memory allocation.
218020563c6bSBarry Smith 
218120563c6bSBarry Smith    Output Parameter:
218244cd7ae7SLois Curfman McInnes .  A - the matrix
218320563c6bSBarry Smith 
2184b259b22eSLois Curfman McInnes    Notes:
218518f449edSLois Curfman McInnes    The data input variable is intended primarily for Fortran programmers
218618f449edSLois Curfman McInnes    who wish to allocate their own matrix memory space.  Most users should
21870298fd71SBarry Smith    set data=NULL.
218818f449edSLois Curfman McInnes 
2189027ccd11SLois Curfman McInnes    Level: intermediate
2190027ccd11SLois Curfman McInnes 
2191dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS
2192d65003e9SLois Curfman McInnes 
219369b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues()
219420563c6bSBarry Smith @*/
21957087cfbeSBarry Smith PetscErrorCode  MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A)
2196289bc588SBarry Smith {
2197dfbe8321SBarry Smith   PetscErrorCode ierr;
21983b2fbd54SBarry Smith 
21993a40ed3dSBarry Smith   PetscFunctionBegin;
2200f69a0ea3SMatthew Knepley   ierr = MatCreate(comm,A);CHKERRQ(ierr);
2201f69a0ea3SMatthew Knepley   ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr);
2202273d9f13SBarry Smith   ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr);
2203273d9f13SBarry Smith   ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr);
2204273d9f13SBarry Smith   PetscFunctionReturn(0);
2205273d9f13SBarry Smith }
2206273d9f13SBarry Smith 
22074a2ae208SSatish Balay #undef __FUNCT__
2208afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation"
2209273d9f13SBarry Smith /*@C
2210273d9f13SBarry Smith    MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements
2211273d9f13SBarry Smith 
2212273d9f13SBarry Smith    Collective on MPI_Comm
2213273d9f13SBarry Smith 
2214273d9f13SBarry Smith    Input Parameters:
22151c4f3114SJed Brown +  B - the matrix
22160298fd71SBarry Smith -  data - the array (or NULL)
2217273d9f13SBarry Smith 
2218273d9f13SBarry Smith    Notes:
2219273d9f13SBarry Smith    The data input variable is intended primarily for Fortran programmers
2220273d9f13SBarry Smith    who wish to allocate their own matrix memory space.  Most users should
2221284134d9SBarry Smith    need not call this routine.
2222273d9f13SBarry Smith 
2223273d9f13SBarry Smith    Level: intermediate
2224273d9f13SBarry Smith 
2225273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS
2226273d9f13SBarry Smith 
222769b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA()
2228867c911aSBarry Smith 
2229273d9f13SBarry Smith @*/
22307087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation(Mat B,PetscScalar data[])
2231273d9f13SBarry Smith {
22324ac538c5SBarry Smith   PetscErrorCode ierr;
2233a23d5eceSKris Buschelman 
2234a23d5eceSKris Buschelman   PetscFunctionBegin;
22354ac538c5SBarry Smith   ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr);
2236a23d5eceSKris Buschelman   PetscFunctionReturn(0);
2237a23d5eceSKris Buschelman }
2238a23d5eceSKris Buschelman 
2239a23d5eceSKris Buschelman #undef __FUNCT__
2240afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense"
22417087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data)
2242a23d5eceSKris Buschelman {
2243273d9f13SBarry Smith   Mat_SeqDense   *b;
2244dfbe8321SBarry Smith   PetscErrorCode ierr;
2245273d9f13SBarry Smith 
2246273d9f13SBarry Smith   PetscFunctionBegin;
2247273d9f13SBarry Smith   B->preallocated = PETSC_TRUE;
2248a868139aSShri Abhyankar 
224934ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr);
225034ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr);
225134ef9618SShri Abhyankar 
2252273d9f13SBarry Smith   b       = (Mat_SeqDense*)B->data;
225386d161a7SShri Abhyankar   b->Mmax = B->rmap->n;
225486d161a7SShri Abhyankar   b->Nmax = B->cmap->n;
225586d161a7SShri Abhyankar   if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n;
225686d161a7SShri Abhyankar 
22579e8f95c4SLisandro Dalcin   if (!data) { /* petsc-allocated storage */
22589e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2259e92229d0SSatish Balay     ierr = PetscCalloc1((size_t)b->lda*b->Nmax,&b->v);CHKERRQ(ierr);
22603bb1ff40SBarry Smith     ierr = PetscLogObjectMemory((PetscObject)B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
22612205254eSKarl Rupp 
22629e8f95c4SLisandro Dalcin     b->user_alloc = PETSC_FALSE;
2263273d9f13SBarry Smith   } else { /* user-allocated storage */
22649e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2265273d9f13SBarry Smith     b->v          = data;
2266273d9f13SBarry Smith     b->user_alloc = PETSC_TRUE;
2267273d9f13SBarry Smith   }
22680450473dSBarry Smith   B->assembled = PETSC_TRUE;
2269273d9f13SBarry Smith   PetscFunctionReturn(0);
2270273d9f13SBarry Smith }
2271273d9f13SBarry Smith 
227265b80a83SHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
22731b807ce4Svictorle #undef __FUNCT__
22748baccfbdSHong Zhang #define __FUNCT__ "MatConvert_SeqDense_Elemental"
22758baccfbdSHong Zhang PETSC_EXTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat)
22768baccfbdSHong Zhang {
2277d77f618aSHong Zhang   Mat            mat_elemental;
2278d77f618aSHong Zhang   PetscErrorCode ierr;
2279d77f618aSHong Zhang   PetscScalar    *array,*v_colwise;
2280d77f618aSHong Zhang   PetscInt       M=A->rmap->N,N=A->cmap->N,i,j,k,*rows,*cols;
2281d77f618aSHong Zhang 
22828baccfbdSHong Zhang   PetscFunctionBegin;
2283d77f618aSHong Zhang   ierr = PetscMalloc3(M*N,&v_colwise,M,&rows,N,&cols);CHKERRQ(ierr);
2284d77f618aSHong Zhang   ierr = MatDenseGetArray(A,&array);CHKERRQ(ierr);
2285d77f618aSHong Zhang   /* convert column-wise array into row-wise v_colwise, see MatSetValues_Elemental() */
2286d77f618aSHong Zhang   k = 0;
2287d77f618aSHong Zhang   for (j=0; j<N; j++) {
2288d77f618aSHong Zhang     cols[j] = j;
2289d77f618aSHong Zhang     for (i=0; i<M; i++) {
2290d77f618aSHong Zhang       v_colwise[j*M+i] = array[k++];
2291d77f618aSHong Zhang     }
2292d77f618aSHong Zhang   }
2293d77f618aSHong Zhang   for (i=0; i<M; i++) {
2294d77f618aSHong Zhang     rows[i] = i;
2295d77f618aSHong Zhang   }
2296d77f618aSHong Zhang   ierr = MatDenseRestoreArray(A,&array);CHKERRQ(ierr);
2297d77f618aSHong Zhang 
2298d77f618aSHong Zhang   ierr = MatCreate(PetscObjectComm((PetscObject)A), &mat_elemental);CHKERRQ(ierr);
2299d77f618aSHong Zhang   ierr = MatSetSizes(mat_elemental,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr);
2300d77f618aSHong Zhang   ierr = MatSetType(mat_elemental,MATELEMENTAL);CHKERRQ(ierr);
2301d77f618aSHong Zhang   ierr = MatSetUp(mat_elemental);CHKERRQ(ierr);
2302d77f618aSHong Zhang 
2303d77f618aSHong Zhang   /* PETSc-Elemental interaface uses axpy for setting off-processor entries, only ADD_VALUES is allowed */
2304d77f618aSHong Zhang   ierr = MatSetValues(mat_elemental,M,rows,N,cols,v_colwise,ADD_VALUES);CHKERRQ(ierr);
2305d77f618aSHong Zhang   ierr = MatAssemblyBegin(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2306d77f618aSHong Zhang   ierr = MatAssemblyEnd(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2307d77f618aSHong Zhang   ierr = PetscFree3(v_colwise,rows,cols);CHKERRQ(ierr);
2308d77f618aSHong Zhang 
2309d77f618aSHong Zhang   if (reuse == MAT_REUSE_MATRIX) {
2310d77f618aSHong Zhang     ierr = MatHeaderReplace(A,mat_elemental);CHKERRQ(ierr);
2311d77f618aSHong Zhang   } else {
2312d77f618aSHong Zhang     *newmat = mat_elemental;
2313d77f618aSHong Zhang   }
23148baccfbdSHong Zhang   PetscFunctionReturn(0);
23158baccfbdSHong Zhang }
231665b80a83SHong Zhang #endif
23178baccfbdSHong Zhang 
23188baccfbdSHong Zhang #undef __FUNCT__
23191b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA"
23201b807ce4Svictorle /*@C
23211b807ce4Svictorle   MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array
23221b807ce4Svictorle 
23231b807ce4Svictorle   Input parameter:
23241b807ce4Svictorle + A - the matrix
23251b807ce4Svictorle - lda - the leading dimension
23261b807ce4Svictorle 
23271b807ce4Svictorle   Notes:
2328867c911aSBarry Smith   This routine is to be used in conjunction with MatSeqDenseSetPreallocation();
23291b807ce4Svictorle   it asserts that the preallocation has a leading dimension (the LDA parameter
23301b807ce4Svictorle   of Blas and Lapack fame) larger than M, the first dimension of the matrix.
23311b807ce4Svictorle 
23321b807ce4Svictorle   Level: intermediate
23331b807ce4Svictorle 
23341b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS
23351b807ce4Svictorle 
2336284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize()
2337867c911aSBarry Smith 
23381b807ce4Svictorle @*/
23397087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetLDA(Mat B,PetscInt lda)
23401b807ce4Svictorle {
23411b807ce4Svictorle   Mat_SeqDense *b = (Mat_SeqDense*)B->data;
234221a2c019SBarry Smith 
23431b807ce4Svictorle   PetscFunctionBegin;
2344e32f2f54SBarry 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);
23451b807ce4Svictorle   b->lda       = lda;
234621a2c019SBarry Smith   b->changelda = PETSC_FALSE;
234721a2c019SBarry Smith   b->Mmax      = PetscMax(b->Mmax,lda);
23481b807ce4Svictorle   PetscFunctionReturn(0);
23491b807ce4Svictorle }
23501b807ce4Svictorle 
23510bad9183SKris Buschelman /*MC
2352fafad747SKris Buschelman    MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices.
23530bad9183SKris Buschelman 
23540bad9183SKris Buschelman    Options Database Keys:
23550bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions()
23560bad9183SKris Buschelman 
23570bad9183SKris Buschelman   Level: beginner
23580bad9183SKris Buschelman 
235989665df3SBarry Smith .seealso: MatCreateSeqDense()
236089665df3SBarry Smith 
23610bad9183SKris Buschelman M*/
23620bad9183SKris Buschelman 
23634a2ae208SSatish Balay #undef __FUNCT__
23644a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense"
23658cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatCreate_SeqDense(Mat B)
2366273d9f13SBarry Smith {
2367273d9f13SBarry Smith   Mat_SeqDense   *b;
2368dfbe8321SBarry Smith   PetscErrorCode ierr;
23697c334f02SBarry Smith   PetscMPIInt    size;
2370273d9f13SBarry Smith 
2371273d9f13SBarry Smith   PetscFunctionBegin;
2372ce94432eSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr);
2373e32f2f54SBarry Smith   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1");
237455659b69SBarry Smith 
2375b00a9115SJed Brown   ierr    = PetscNewLog(B,&b);CHKERRQ(ierr);
2376549d3d68SSatish Balay   ierr    = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr);
237744cd7ae7SLois Curfman McInnes   B->data = (void*)b;
237818f449edSLois Curfman McInnes 
237944cd7ae7SLois Curfman McInnes   b->pivots      = 0;
2380273d9f13SBarry Smith   b->roworiented = PETSC_TRUE;
2381273d9f13SBarry Smith   b->v           = 0;
238221a2c019SBarry Smith   b->changelda   = PETSC_FALSE;
23834e220ebcSLois Curfman McInnes 
2384bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr);
2385bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr);
2386bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr);
23878baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
23888baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr);
23898baccfbdSHong Zhang #endif
2390bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr);
2391bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaij_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
2392bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
2393bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
23943bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaij_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
23953bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
23963bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaij_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
239717667f90SBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr);
23983a40ed3dSBarry Smith   PetscFunctionReturn(0);
2399289bc588SBarry Smith }
2400