xref: /petsc/src/mat/impls/dense/seq/dense.c (revision e6324fbbad239cb8450c5997ac938dec88e9a90f)
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__
126a63e612SBarry Smith #define __FUNCT__ "MatConvert_SeqDense_SeqAIJ"
138cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatConvert_SeqDense_SeqAIJ(Mat A, MatType newtype,MatReuse reuse,Mat *newmat)
146a63e612SBarry Smith {
156a63e612SBarry Smith   Mat            B;
166a63e612SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
176a63e612SBarry Smith   PetscErrorCode ierr;
189399e1b8SMatthew G. Knepley   PetscInt       i, j;
199399e1b8SMatthew G. Knepley   PetscInt       *rows, *nnz;
209399e1b8SMatthew G. Knepley   MatScalar      *aa = a->v, *vals;
216a63e612SBarry Smith 
226a63e612SBarry Smith   PetscFunctionBegin;
23ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr);
246a63e612SBarry Smith   ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr);
256a63e612SBarry Smith   ierr = MatSetType(B,MATSEQAIJ);CHKERRQ(ierr);
269399e1b8SMatthew G. Knepley   ierr = PetscCalloc3(A->rmap->n,&rows,A->rmap->n,&nnz,A->rmap->n,&vals);CHKERRQ(ierr);
279399e1b8SMatthew G. Knepley   for (j=0; j<A->cmap->n; j++) {
289399e1b8SMatthew G. Knepley     for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) ++nnz[i];
296a63e612SBarry Smith     aa += a->lda;
306a63e612SBarry Smith   }
319399e1b8SMatthew G. Knepley   ierr = MatSeqAIJSetPreallocation(B,PETSC_DETERMINE,nnz);CHKERRQ(ierr);
329399e1b8SMatthew G. Knepley   aa = a->v;
339399e1b8SMatthew G. Knepley   for (j=0; j<A->cmap->n; j++) {
349399e1b8SMatthew G. Knepley     PetscInt numRows = 0;
359399e1b8SMatthew G. Knepley     for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) {rows[numRows] = i; vals[numRows++] = aa[i];}
369399e1b8SMatthew G. Knepley     ierr = MatSetValues(B,numRows,rows,1,&j,vals,INSERT_VALUES);CHKERRQ(ierr);
379399e1b8SMatthew G. Knepley     aa  += a->lda;
389399e1b8SMatthew G. Knepley   }
399399e1b8SMatthew G. Knepley   ierr = PetscFree3(rows,nnz,vals);CHKERRQ(ierr);
406a63e612SBarry Smith   ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
416a63e612SBarry Smith   ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
426a63e612SBarry Smith 
436a63e612SBarry Smith   if (reuse == MAT_REUSE_MATRIX) {
446a63e612SBarry Smith     ierr = MatHeaderReplace(A,B);CHKERRQ(ierr);
456a63e612SBarry Smith   } else {
466a63e612SBarry Smith     *newmat = B;
476a63e612SBarry Smith   }
486a63e612SBarry Smith   PetscFunctionReturn(0);
496a63e612SBarry Smith }
506a63e612SBarry Smith 
514a2ae208SSatish Balay #undef __FUNCT__
524a2ae208SSatish Balay #define __FUNCT__ "MatAXPY_SeqDense"
53f4df32b1SMatthew Knepley PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str)
541987afe7SBarry Smith {
551987afe7SBarry Smith   Mat_SeqDense   *x     = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data;
56f4df32b1SMatthew Knepley   PetscScalar    oalpha = alpha;
5713f74950SBarry Smith   PetscInt       j;
580805154bSBarry Smith   PetscBLASInt   N,m,ldax,lday,one = 1;
59efee365bSSatish Balay   PetscErrorCode ierr;
603a40ed3dSBarry Smith 
613a40ed3dSBarry Smith   PetscFunctionBegin;
62c5df96a5SBarry Smith   ierr = PetscBLASIntCast(X->rmap->n*X->cmap->n,&N);CHKERRQ(ierr);
63c5df96a5SBarry Smith   ierr = PetscBLASIntCast(X->rmap->n,&m);CHKERRQ(ierr);
64c5df96a5SBarry Smith   ierr = PetscBLASIntCast(x->lda,&ldax);CHKERRQ(ierr);
65c5df96a5SBarry Smith   ierr = PetscBLASIntCast(y->lda,&lday);CHKERRQ(ierr);
66a5ce6ee0Svictorle   if (ldax>m || lday>m) {
67d0f46423SBarry Smith     for (j=0; j<X->cmap->n; j++) {
688b83055fSJed Brown       PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&m,&oalpha,x->v+j*ldax,&one,y->v+j*lday,&one));
69a5ce6ee0Svictorle     }
70a5ce6ee0Svictorle   } else {
718b83055fSJed Brown     PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&N,&oalpha,x->v,&one,y->v,&one));
72a5ce6ee0Svictorle   }
73a3fa217bSJose E. Roman   ierr = PetscObjectStateIncrease((PetscObject)Y);CHKERRQ(ierr);
740450473dSBarry Smith   ierr = PetscLogFlops(PetscMax(2*N-1,0));CHKERRQ(ierr);
753a40ed3dSBarry Smith   PetscFunctionReturn(0);
761987afe7SBarry Smith }
771987afe7SBarry Smith 
784a2ae208SSatish Balay #undef __FUNCT__
794a2ae208SSatish Balay #define __FUNCT__ "MatGetInfo_SeqDense"
80dfbe8321SBarry Smith PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info)
81289bc588SBarry Smith {
82d0f46423SBarry Smith   PetscInt N = A->rmap->n*A->cmap->n;
833a40ed3dSBarry Smith 
843a40ed3dSBarry Smith   PetscFunctionBegin;
854e220ebcSLois Curfman McInnes   info->block_size        = 1.0;
864e220ebcSLois Curfman McInnes   info->nz_allocated      = (double)N;
876de62eeeSBarry Smith   info->nz_used           = (double)N;
886de62eeeSBarry Smith   info->nz_unneeded       = (double)0;
894e220ebcSLois Curfman McInnes   info->assemblies        = (double)A->num_ass;
904e220ebcSLois Curfman McInnes   info->mallocs           = 0;
917adad957SLisandro Dalcin   info->memory            = ((PetscObject)A)->mem;
924e220ebcSLois Curfman McInnes   info->fill_ratio_given  = 0;
934e220ebcSLois Curfman McInnes   info->fill_ratio_needed = 0;
944e220ebcSLois Curfman McInnes   info->factor_mallocs    = 0;
953a40ed3dSBarry Smith   PetscFunctionReturn(0);
96289bc588SBarry Smith }
97289bc588SBarry Smith 
984a2ae208SSatish Balay #undef __FUNCT__
994a2ae208SSatish Balay #define __FUNCT__ "MatScale_SeqDense"
100f4df32b1SMatthew Knepley PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha)
10180cd9d93SLois Curfman McInnes {
102273d9f13SBarry Smith   Mat_SeqDense   *a     = (Mat_SeqDense*)A->data;
103f4df32b1SMatthew Knepley   PetscScalar    oalpha = alpha;
104efee365bSSatish Balay   PetscErrorCode ierr;
105c5df96a5SBarry Smith   PetscBLASInt   one = 1,j,nz,lda;
10680cd9d93SLois Curfman McInnes 
1073a40ed3dSBarry Smith   PetscFunctionBegin;
108c5df96a5SBarry Smith   ierr = PetscBLASIntCast(a->lda,&lda);CHKERRQ(ierr);
109d0f46423SBarry Smith   if (lda>A->rmap->n) {
110c5df96a5SBarry Smith     ierr = PetscBLASIntCast(A->rmap->n,&nz);CHKERRQ(ierr);
111d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1128b83055fSJed Brown       PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v+j*lda,&one));
113a5ce6ee0Svictorle     }
114a5ce6ee0Svictorle   } else {
115c5df96a5SBarry Smith     ierr = PetscBLASIntCast(A->rmap->n*A->cmap->n,&nz);CHKERRQ(ierr);
1168b83055fSJed Brown     PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v,&one));
117a5ce6ee0Svictorle   }
118efee365bSSatish Balay   ierr = PetscLogFlops(nz);CHKERRQ(ierr);
1193a40ed3dSBarry Smith   PetscFunctionReturn(0);
12080cd9d93SLois Curfman McInnes }
12180cd9d93SLois Curfman McInnes 
1221cbb95d3SBarry Smith #undef __FUNCT__
1231cbb95d3SBarry Smith #define __FUNCT__ "MatIsHermitian_SeqDense"
124ace3abfcSBarry Smith PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscBool  *fl)
1251cbb95d3SBarry Smith {
1261cbb95d3SBarry Smith   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
127d0f46423SBarry Smith   PetscInt     i,j,m = A->rmap->n,N;
1281cbb95d3SBarry Smith   PetscScalar  *v = a->v;
1291cbb95d3SBarry Smith 
1301cbb95d3SBarry Smith   PetscFunctionBegin;
1311cbb95d3SBarry Smith   *fl = PETSC_FALSE;
132d0f46423SBarry Smith   if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0);
1331cbb95d3SBarry Smith   N = a->lda;
1341cbb95d3SBarry Smith 
1351cbb95d3SBarry Smith   for (i=0; i<m; i++) {
1361cbb95d3SBarry Smith     for (j=i+1; j<m; j++) {
1371cbb95d3SBarry Smith       if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) PetscFunctionReturn(0);
1381cbb95d3SBarry Smith     }
1391cbb95d3SBarry Smith   }
1401cbb95d3SBarry Smith   *fl = PETSC_TRUE;
1411cbb95d3SBarry Smith   PetscFunctionReturn(0);
1421cbb95d3SBarry Smith }
1431cbb95d3SBarry Smith 
144b24902e0SBarry Smith #undef __FUNCT__
145b24902e0SBarry Smith #define __FUNCT__ "MatDuplicateNoCreate_SeqDense"
146719d5645SBarry Smith PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat newi,Mat A,MatDuplicateOption cpvalues)
147b24902e0SBarry Smith {
148b24902e0SBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data,*l;
149b24902e0SBarry Smith   PetscErrorCode ierr;
150b24902e0SBarry Smith   PetscInt       lda = (PetscInt)mat->lda,j,m;
151b24902e0SBarry Smith 
152b24902e0SBarry Smith   PetscFunctionBegin;
153aa5ea44dSBarry Smith   ierr = PetscLayoutReference(A->rmap,&newi->rmap);CHKERRQ(ierr);
154aa5ea44dSBarry Smith   ierr = PetscLayoutReference(A->cmap,&newi->cmap);CHKERRQ(ierr);
1550298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(newi,NULL);CHKERRQ(ierr);
156b24902e0SBarry Smith   if (cpvalues == MAT_COPY_VALUES) {
157b24902e0SBarry Smith     l = (Mat_SeqDense*)newi->data;
158d0f46423SBarry Smith     if (lda>A->rmap->n) {
159d0f46423SBarry Smith       m = A->rmap->n;
160d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
161b24902e0SBarry Smith         ierr = PetscMemcpy(l->v+j*m,mat->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
162b24902e0SBarry Smith       }
163b24902e0SBarry Smith     } else {
164d0f46423SBarry Smith       ierr = PetscMemcpy(l->v,mat->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
165b24902e0SBarry Smith     }
166b24902e0SBarry Smith   }
167b24902e0SBarry Smith   newi->assembled = PETSC_TRUE;
168b24902e0SBarry Smith   PetscFunctionReturn(0);
169b24902e0SBarry Smith }
170b24902e0SBarry Smith 
1714a2ae208SSatish Balay #undef __FUNCT__
1724a2ae208SSatish Balay #define __FUNCT__ "MatDuplicate_SeqDense"
173dfbe8321SBarry Smith PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat)
17402cad45dSBarry Smith {
1756849ba73SBarry Smith   PetscErrorCode ierr;
17602cad45dSBarry Smith 
1773a40ed3dSBarry Smith   PetscFunctionBegin;
178ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),newmat);CHKERRQ(ierr);
179d0f46423SBarry Smith   ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
1805c9eb25fSBarry Smith   ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
181719d5645SBarry Smith   ierr = MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues);CHKERRQ(ierr);
182b24902e0SBarry Smith   PetscFunctionReturn(0);
183b24902e0SBarry Smith }
184b24902e0SBarry Smith 
1856ee01492SSatish Balay 
1860481f469SBarry Smith extern PetscErrorCode MatLUFactor_SeqDense(Mat,IS,IS,const MatFactorInfo*);
187719d5645SBarry Smith 
1884a2ae208SSatish Balay #undef __FUNCT__
1894a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorNumeric_SeqDense"
1900481f469SBarry Smith PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
191289bc588SBarry Smith {
1924482741eSBarry Smith   MatFactorInfo  info;
193a093e273SMatthew Knepley   PetscErrorCode ierr;
1943a40ed3dSBarry Smith 
1953a40ed3dSBarry Smith   PetscFunctionBegin;
196c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
197719d5645SBarry Smith   ierr = MatLUFactor_SeqDense(fact,0,0,&info);CHKERRQ(ierr);
1983a40ed3dSBarry Smith   PetscFunctionReturn(0);
199289bc588SBarry Smith }
2006ee01492SSatish Balay 
2010b4b3355SBarry Smith #undef __FUNCT__
2024a2ae208SSatish Balay #define __FUNCT__ "MatSolve_SeqDense"
203dfbe8321SBarry Smith PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy)
204289bc588SBarry Smith {
205c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
2066849ba73SBarry Smith   PetscErrorCode ierr;
20787828ca2SBarry Smith   PetscScalar    *x,*y;
208c5df96a5SBarry Smith   PetscBLASInt   one = 1,info,m;
20967e560aaSBarry Smith 
2103a40ed3dSBarry Smith   PetscFunctionBegin;
211c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
2121ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
2131ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
214d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
215d5f3da31SBarry Smith   if (A->factortype == MAT_FACTOR_LU) {
216ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
217e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
218ae7cfcebSSatish Balay #else
2198b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
220e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
221ae7cfcebSSatish Balay #endif
222d5f3da31SBarry Smith   } else if (A->factortype == MAT_FACTOR_CHOLESKY) {
223ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
224e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
225ae7cfcebSSatish Balay #else
2268b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
227e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
228ae7cfcebSSatish Balay #endif
2292205254eSKarl Rupp   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
2301ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
2311ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
232dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
2333a40ed3dSBarry Smith   PetscFunctionReturn(0);
234289bc588SBarry Smith }
2356ee01492SSatish Balay 
2364a2ae208SSatish Balay #undef __FUNCT__
23785e2c93fSHong Zhang #define __FUNCT__ "MatMatSolve_SeqDense"
23885e2c93fSHong Zhang PetscErrorCode MatMatSolve_SeqDense(Mat A,Mat B,Mat X)
23985e2c93fSHong Zhang {
24085e2c93fSHong Zhang   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
24185e2c93fSHong Zhang   PetscErrorCode ierr;
24285e2c93fSHong Zhang   PetscScalar    *b,*x;
243efb80c78SLisandro Dalcin   PetscInt       n;
244783b601eSJed Brown   PetscBLASInt   nrhs,info,m;
245bda8bf91SBarry Smith   PetscBool      flg;
24685e2c93fSHong Zhang 
24785e2c93fSHong Zhang   PetscFunctionBegin;
248c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
2490298fd71SBarry Smith   ierr = PetscObjectTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr);
250ce94432eSBarry Smith   if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix B must be MATDENSE matrix");
2510298fd71SBarry Smith   ierr = PetscObjectTypeCompareAny((PetscObject)X,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr);
252ce94432eSBarry Smith   if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix X must be MATDENSE matrix");
253bda8bf91SBarry Smith 
2540298fd71SBarry Smith   ierr = MatGetSize(B,NULL,&n);CHKERRQ(ierr);
255c5df96a5SBarry Smith   ierr = PetscBLASIntCast(n,&nrhs);CHKERRQ(ierr);
2568c778c55SBarry Smith   ierr = MatDenseGetArray(B,&b);CHKERRQ(ierr);
2578c778c55SBarry Smith   ierr = MatDenseGetArray(X,&x);CHKERRQ(ierr);
25885e2c93fSHong Zhang 
259f272c775SHong Zhang   ierr = PetscMemcpy(x,b,m*nrhs*sizeof(PetscScalar));CHKERRQ(ierr);
26085e2c93fSHong Zhang 
26185e2c93fSHong Zhang   if (A->factortype == MAT_FACTOR_LU) {
26285e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_GETRS)
26385e2c93fSHong Zhang     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
26485e2c93fSHong Zhang #else
2658b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info));
26685e2c93fSHong Zhang     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
26785e2c93fSHong Zhang #endif
26885e2c93fSHong Zhang   } else if (A->factortype == MAT_FACTOR_CHOLESKY) {
26985e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_POTRS)
27085e2c93fSHong Zhang     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
27185e2c93fSHong Zhang #else
2728b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info));
27385e2c93fSHong Zhang     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
27485e2c93fSHong Zhang #endif
2752205254eSKarl Rupp   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
27685e2c93fSHong Zhang 
2778c778c55SBarry Smith   ierr = MatDenseRestoreArray(B,&b);CHKERRQ(ierr);
2788c778c55SBarry Smith   ierr = MatDenseRestoreArray(X,&x);CHKERRQ(ierr);
27985e2c93fSHong Zhang   ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr);
28085e2c93fSHong Zhang   PetscFunctionReturn(0);
28185e2c93fSHong Zhang }
28285e2c93fSHong Zhang 
28385e2c93fSHong Zhang #undef __FUNCT__
2844a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense"
285dfbe8321SBarry Smith PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy)
286da3a660dSBarry Smith {
287c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
288dfbe8321SBarry Smith   PetscErrorCode ierr;
28987828ca2SBarry Smith   PetscScalar    *x,*y;
290c5df96a5SBarry Smith   PetscBLASInt   one = 1,info,m;
29167e560aaSBarry Smith 
2923a40ed3dSBarry Smith   PetscFunctionBegin;
293c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
2941ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
2951ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
296d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
297752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
298da3a660dSBarry Smith   if (mat->pivots) {
299ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
300e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
301ae7cfcebSSatish Balay #else
3028b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
303e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve");
304ae7cfcebSSatish Balay #endif
3057a97a34bSBarry Smith   } else {
306ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
307e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
308ae7cfcebSSatish Balay #else
3098b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
310e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve");
311ae7cfcebSSatish Balay #endif
312da3a660dSBarry Smith   }
3131ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
3141ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
315dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
3163a40ed3dSBarry Smith   PetscFunctionReturn(0);
317da3a660dSBarry Smith }
3186ee01492SSatish Balay 
3194a2ae208SSatish Balay #undef __FUNCT__
3204a2ae208SSatish Balay #define __FUNCT__ "MatSolveAdd_SeqDense"
321dfbe8321SBarry Smith PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
322da3a660dSBarry Smith {
323c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
324dfbe8321SBarry Smith   PetscErrorCode ierr;
32587828ca2SBarry Smith   PetscScalar    *x,*y,sone = 1.0;
326da3a660dSBarry Smith   Vec            tmp = 0;
327c5df96a5SBarry Smith   PetscBLASInt   one = 1,info,m;
32867e560aaSBarry Smith 
3293a40ed3dSBarry Smith   PetscFunctionBegin;
330c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
3311ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
3321ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
333d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
334da3a660dSBarry Smith   if (yy == zz) {
33578b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
3363bb1ff40SBarry Smith     ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr);
33778b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
338da3a660dSBarry Smith   }
339d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
340752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
341da3a660dSBarry Smith   if (mat->pivots) {
342ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
343e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
344ae7cfcebSSatish Balay #else
3458b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
346e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
347ae7cfcebSSatish Balay #endif
348a8c6a408SBarry Smith   } else {
349ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
350e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
351ae7cfcebSSatish Balay #else
3528b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
353e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
354ae7cfcebSSatish Balay #endif
355da3a660dSBarry Smith   }
3566bf464f9SBarry Smith   if (tmp) {
3576bf464f9SBarry Smith     ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr);
3586bf464f9SBarry Smith     ierr = VecDestroy(&tmp);CHKERRQ(ierr);
3596bf464f9SBarry Smith   } else {
3606bf464f9SBarry Smith     ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);
3616bf464f9SBarry Smith   }
3621ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
3631ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
364dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
3653a40ed3dSBarry Smith   PetscFunctionReturn(0);
366da3a660dSBarry Smith }
36767e560aaSBarry Smith 
3684a2ae208SSatish Balay #undef __FUNCT__
3694a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense"
370dfbe8321SBarry Smith PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
371da3a660dSBarry Smith {
372c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
3736849ba73SBarry Smith   PetscErrorCode ierr;
37487828ca2SBarry Smith   PetscScalar    *x,*y,sone = 1.0;
375da3a660dSBarry Smith   Vec            tmp;
376c5df96a5SBarry Smith   PetscBLASInt   one = 1,info,m;
37767e560aaSBarry Smith 
3783a40ed3dSBarry Smith   PetscFunctionBegin;
379c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
380d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
3811ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
3821ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
383da3a660dSBarry Smith   if (yy == zz) {
38478b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
3853bb1ff40SBarry Smith     ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr);
38678b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
387da3a660dSBarry Smith   }
388d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
389752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
390da3a660dSBarry Smith   if (mat->pivots) {
391ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
392e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
393ae7cfcebSSatish Balay #else
3948b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
395e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
396ae7cfcebSSatish Balay #endif
3973a40ed3dSBarry Smith   } else {
398ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
399e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
400ae7cfcebSSatish Balay #else
4018b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
402e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
403ae7cfcebSSatish Balay #endif
404da3a660dSBarry Smith   }
40590f02eecSBarry Smith   if (tmp) {
4062dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr);
4076bf464f9SBarry Smith     ierr = VecDestroy(&tmp);CHKERRQ(ierr);
4083a40ed3dSBarry Smith   } else {
4092dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);
41090f02eecSBarry Smith   }
4111ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
4121ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
413dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
4143a40ed3dSBarry Smith   PetscFunctionReturn(0);
415da3a660dSBarry Smith }
416db4efbfdSBarry Smith 
417db4efbfdSBarry Smith /* ---------------------------------------------------------------*/
418db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots,
419db4efbfdSBarry Smith    rather than put it in the Mat->row slot.*/
420db4efbfdSBarry Smith #undef __FUNCT__
421db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactor_SeqDense"
4220481f469SBarry Smith PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo)
423db4efbfdSBarry Smith {
424db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF)
425db4efbfdSBarry Smith   PetscFunctionBegin;
426e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable.");
427db4efbfdSBarry Smith #else
428db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
429db4efbfdSBarry Smith   PetscErrorCode ierr;
430db4efbfdSBarry Smith   PetscBLASInt   n,m,info;
431db4efbfdSBarry Smith 
432db4efbfdSBarry Smith   PetscFunctionBegin;
433c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
434c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
435db4efbfdSBarry Smith   if (!mat->pivots) {
436785e854fSJed Brown     ierr = PetscMalloc1((A->rmap->n+1),&mat->pivots);CHKERRQ(ierr);
4373bb1ff40SBarry Smith     ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr);
438db4efbfdSBarry Smith   }
439db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
4408e57ea43SSatish Balay   ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
4418b83055fSJed Brown   PetscStackCallBLAS("LAPACKgetrf",LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info));
4428e57ea43SSatish Balay   ierr = PetscFPTrapPop();CHKERRQ(ierr);
4438e57ea43SSatish Balay 
444e32f2f54SBarry Smith   if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization");
445e32f2f54SBarry Smith   if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization");
446db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
447db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
448db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
449db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
450d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_LU;
451db4efbfdSBarry Smith 
452dc0b31edSSatish Balay   ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr);
453db4efbfdSBarry Smith #endif
454db4efbfdSBarry Smith   PetscFunctionReturn(0);
455db4efbfdSBarry Smith }
456db4efbfdSBarry Smith 
457db4efbfdSBarry Smith #undef __FUNCT__
458db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactor_SeqDense"
4590481f469SBarry Smith PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo)
460db4efbfdSBarry Smith {
461db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF)
462db4efbfdSBarry Smith   PetscFunctionBegin;
463e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable.");
464db4efbfdSBarry Smith #else
465db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
466db4efbfdSBarry Smith   PetscErrorCode ierr;
467c5df96a5SBarry Smith   PetscBLASInt   info,n;
468db4efbfdSBarry Smith 
469db4efbfdSBarry Smith   PetscFunctionBegin;
470c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
471db4efbfdSBarry Smith   ierr = PetscFree(mat->pivots);CHKERRQ(ierr);
472db4efbfdSBarry Smith 
473db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
4748b83055fSJed Brown   PetscStackCallBLAS("LAPACKpotrf",LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info));
475e32f2f54SBarry Smith   if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1);
476db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
477db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
478db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
479db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
480d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_CHOLESKY;
4812205254eSKarl Rupp 
482dc0b31edSSatish Balay   ierr = PetscLogFlops((A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr);
483db4efbfdSBarry Smith #endif
484db4efbfdSBarry Smith   PetscFunctionReturn(0);
485db4efbfdSBarry Smith }
486db4efbfdSBarry Smith 
487db4efbfdSBarry Smith 
488db4efbfdSBarry Smith #undef __FUNCT__
489db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense"
4900481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
491db4efbfdSBarry Smith {
492db4efbfdSBarry Smith   PetscErrorCode ierr;
493db4efbfdSBarry Smith   MatFactorInfo  info;
494db4efbfdSBarry Smith 
495db4efbfdSBarry Smith   PetscFunctionBegin;
496db4efbfdSBarry Smith   info.fill = 1.0;
4972205254eSKarl Rupp 
498c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
499719d5645SBarry Smith   ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr);
500db4efbfdSBarry Smith   PetscFunctionReturn(0);
501db4efbfdSBarry Smith }
502db4efbfdSBarry Smith 
503db4efbfdSBarry Smith #undef __FUNCT__
504db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense"
5050481f469SBarry Smith PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info)
506db4efbfdSBarry Smith {
507db4efbfdSBarry Smith   PetscFunctionBegin;
508c3ef05f6SHong Zhang   fact->assembled                  = PETSC_TRUE;
5091bbcc794SSatish Balay   fact->preallocated               = PETSC_TRUE;
510719d5645SBarry Smith   fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense;
511db4efbfdSBarry Smith   PetscFunctionReturn(0);
512db4efbfdSBarry Smith }
513db4efbfdSBarry Smith 
514db4efbfdSBarry Smith #undef __FUNCT__
515db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactorSymbolic_SeqDense"
5160481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info)
517db4efbfdSBarry Smith {
518db4efbfdSBarry Smith   PetscFunctionBegin;
519b66fe19dSMatthew G Knepley   fact->preallocated         = PETSC_TRUE;
520c3ef05f6SHong Zhang   fact->assembled            = PETSC_TRUE;
521719d5645SBarry Smith   fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense;
522db4efbfdSBarry Smith   PetscFunctionReturn(0);
523db4efbfdSBarry Smith }
524db4efbfdSBarry Smith 
525db4efbfdSBarry Smith #undef __FUNCT__
526db4efbfdSBarry Smith #define __FUNCT__ "MatGetFactor_seqdense_petsc"
5278cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact)
528db4efbfdSBarry Smith {
529db4efbfdSBarry Smith   PetscErrorCode ierr;
530db4efbfdSBarry Smith 
531db4efbfdSBarry Smith   PetscFunctionBegin;
532ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),fact);CHKERRQ(ierr);
533db4efbfdSBarry Smith   ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
534db4efbfdSBarry Smith   ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr);
535db4efbfdSBarry Smith   if (ftype == MAT_FACTOR_LU) {
536db4efbfdSBarry Smith     (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense;
537db4efbfdSBarry Smith   } else {
538db4efbfdSBarry Smith     (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense;
539db4efbfdSBarry Smith   }
540d5f3da31SBarry Smith   (*fact)->factortype = ftype;
541db4efbfdSBarry Smith   PetscFunctionReturn(0);
542db4efbfdSBarry Smith }
543db4efbfdSBarry Smith 
544289bc588SBarry Smith /* ------------------------------------------------------------------*/
5454a2ae208SSatish Balay #undef __FUNCT__
54641f059aeSBarry Smith #define __FUNCT__ "MatSOR_SeqDense"
54741f059aeSBarry Smith PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx)
548289bc588SBarry Smith {
549c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
55087828ca2SBarry Smith   PetscScalar    *x,*b,*v = mat->v,zero = 0.0,xt;
551dfbe8321SBarry Smith   PetscErrorCode ierr;
552d0f46423SBarry Smith   PetscInt       m = A->rmap->n,i;
553c5df96a5SBarry Smith   PetscBLASInt   o = 1,bm;
554289bc588SBarry Smith 
5553a40ed3dSBarry Smith   PetscFunctionBegin;
556c5df96a5SBarry Smith   ierr = PetscBLASIntCast(m,&bm);CHKERRQ(ierr);
557289bc588SBarry Smith   if (flag & SOR_ZERO_INITIAL_GUESS) {
55871044d3cSBarry Smith     /* this is a hack fix, should have another version without the second BLASdot */
5592dcb1b2aSMatthew Knepley     ierr = VecSet(xx,zero);CHKERRQ(ierr);
560289bc588SBarry Smith   }
5611ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
5621ebc52fbSHong Zhang   ierr = VecGetArray(bb,&b);CHKERRQ(ierr);
563b965ef7fSBarry Smith   its  = its*lits;
564e32f2f54SBarry 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);
565289bc588SBarry Smith   while (its--) {
566fccaa45eSBarry Smith     if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) {
567289bc588SBarry Smith       for (i=0; i<m; i++) {
5688b83055fSJed Brown         PetscStackCallBLAS("BLASdot",xt   = b[i] - BLASdot_(&bm,v+i,&bm,x,&o));
56955a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
570289bc588SBarry Smith       }
571289bc588SBarry Smith     }
572fccaa45eSBarry Smith     if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) {
573289bc588SBarry Smith       for (i=m-1; i>=0; i--) {
5748b83055fSJed Brown         PetscStackCallBLAS("BLASdot",xt   = b[i] - BLASdot_(&bm,v+i,&bm,x,&o));
57555a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
576289bc588SBarry Smith       }
577289bc588SBarry Smith     }
578289bc588SBarry Smith   }
5791ebc52fbSHong Zhang   ierr = VecRestoreArray(bb,&b);CHKERRQ(ierr);
5801ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
5813a40ed3dSBarry Smith   PetscFunctionReturn(0);
582289bc588SBarry Smith }
583289bc588SBarry Smith 
584289bc588SBarry Smith /* -----------------------------------------------------------------*/
5854a2ae208SSatish Balay #undef __FUNCT__
5864a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense"
587dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy)
588289bc588SBarry Smith {
589c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
59087828ca2SBarry Smith   PetscScalar    *v   = mat->v,*x,*y;
591dfbe8321SBarry Smith   PetscErrorCode ierr;
5920805154bSBarry Smith   PetscBLASInt   m, n,_One=1;
593ea709b57SSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
5943a40ed3dSBarry Smith 
5953a40ed3dSBarry Smith   PetscFunctionBegin;
596c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
597c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
598d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
5991ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
6001ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
6018b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One));
6021ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6031ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
604dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
6053a40ed3dSBarry Smith   PetscFunctionReturn(0);
606289bc588SBarry Smith }
607800995b7SMatthew Knepley 
6084a2ae208SSatish Balay #undef __FUNCT__
6094a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense"
610dfbe8321SBarry Smith PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy)
611289bc588SBarry Smith {
612c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
61387828ca2SBarry Smith   PetscScalar    *v   = mat->v,*x,*y,_DOne=1.0,_DZero=0.0;
614dfbe8321SBarry Smith   PetscErrorCode ierr;
6150805154bSBarry Smith   PetscBLASInt   m, n, _One=1;
6163a40ed3dSBarry Smith 
6173a40ed3dSBarry Smith   PetscFunctionBegin;
618c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
619c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
620d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
6211ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
6221ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
6238b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One));
6241ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6251ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
626dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr);
6273a40ed3dSBarry Smith   PetscFunctionReturn(0);
628289bc588SBarry Smith }
6296ee01492SSatish Balay 
6304a2ae208SSatish Balay #undef __FUNCT__
6314a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense"
632dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
633289bc588SBarry Smith {
634c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
63587828ca2SBarry Smith   PetscScalar    *v   = mat->v,*x,*y,_DOne=1.0;
636dfbe8321SBarry Smith   PetscErrorCode ierr;
6370805154bSBarry Smith   PetscBLASInt   m, n, _One=1;
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);
643600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
6441ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
6451ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
6468b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
6471ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6481ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
649dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
6503a40ed3dSBarry Smith   PetscFunctionReturn(0);
651289bc588SBarry Smith }
6526ee01492SSatish Balay 
6534a2ae208SSatish Balay #undef __FUNCT__
6544a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense"
655dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
656289bc588SBarry Smith {
657c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
65887828ca2SBarry Smith   PetscScalar    *v   = mat->v,*x,*y;
659dfbe8321SBarry Smith   PetscErrorCode ierr;
6600805154bSBarry Smith   PetscBLASInt   m, n, _One=1;
66187828ca2SBarry Smith   PetscScalar    _DOne=1.0;
6623a40ed3dSBarry Smith 
6633a40ed3dSBarry Smith   PetscFunctionBegin;
664c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
665c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
666d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
667600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
6681ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
6691ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
6708b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
6711ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6721ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
673dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
6743a40ed3dSBarry Smith   PetscFunctionReturn(0);
675289bc588SBarry Smith }
676289bc588SBarry Smith 
677289bc588SBarry Smith /* -----------------------------------------------------------------*/
6784a2ae208SSatish Balay #undef __FUNCT__
6794a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense"
68013f74950SBarry Smith PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
681289bc588SBarry Smith {
682c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
68387828ca2SBarry Smith   PetscScalar    *v;
6846849ba73SBarry Smith   PetscErrorCode ierr;
68513f74950SBarry Smith   PetscInt       i;
68667e560aaSBarry Smith 
6873a40ed3dSBarry Smith   PetscFunctionBegin;
688d0f46423SBarry Smith   *ncols = A->cmap->n;
689289bc588SBarry Smith   if (cols) {
690785e854fSJed Brown     ierr = PetscMalloc1((A->cmap->n+1),cols);CHKERRQ(ierr);
691d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) (*cols)[i] = i;
692289bc588SBarry Smith   }
693289bc588SBarry Smith   if (vals) {
694785e854fSJed Brown     ierr = PetscMalloc1((A->cmap->n+1),vals);CHKERRQ(ierr);
695289bc588SBarry Smith     v    = mat->v + row;
696d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;}
697289bc588SBarry Smith   }
6983a40ed3dSBarry Smith   PetscFunctionReturn(0);
699289bc588SBarry Smith }
7006ee01492SSatish Balay 
7014a2ae208SSatish Balay #undef __FUNCT__
7024a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense"
70313f74950SBarry Smith PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
704289bc588SBarry Smith {
705dfbe8321SBarry Smith   PetscErrorCode ierr;
7066e111a19SKarl Rupp 
707606d414cSSatish Balay   PetscFunctionBegin;
708606d414cSSatish Balay   if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);}
709606d414cSSatish Balay   if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); }
7103a40ed3dSBarry Smith   PetscFunctionReturn(0);
711289bc588SBarry Smith }
712289bc588SBarry Smith /* ----------------------------------------------------------------*/
7134a2ae208SSatish Balay #undef __FUNCT__
7144a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense"
71513f74950SBarry Smith PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv)
716289bc588SBarry Smith {
717c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
71813f74950SBarry Smith   PetscInt     i,j,idx=0;
719d6dfbf8fSBarry Smith 
7203a40ed3dSBarry Smith   PetscFunctionBegin;
721289bc588SBarry Smith   if (!mat->roworiented) {
722dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
723289bc588SBarry Smith       for (j=0; j<n; j++) {
724cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
7252515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
726e32f2f54SBarry 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);
72758804f6dSBarry Smith #endif
728289bc588SBarry Smith         for (i=0; i<m; i++) {
729cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
7302515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
731e32f2f54SBarry 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);
73258804f6dSBarry Smith #endif
733cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
734289bc588SBarry Smith         }
735289bc588SBarry Smith       }
7363a40ed3dSBarry Smith     } else {
737289bc588SBarry Smith       for (j=0; j<n; j++) {
738cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
7392515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
740e32f2f54SBarry 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);
74158804f6dSBarry Smith #endif
742289bc588SBarry Smith         for (i=0; i<m; i++) {
743cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
7442515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
745e32f2f54SBarry 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);
74658804f6dSBarry Smith #endif
747cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
748289bc588SBarry Smith         }
749289bc588SBarry Smith       }
750289bc588SBarry Smith     }
7513a40ed3dSBarry Smith   } else {
752dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
753e8d4e0b9SBarry Smith       for (i=0; i<m; i++) {
754cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
7552515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
756e32f2f54SBarry 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);
75758804f6dSBarry Smith #endif
758e8d4e0b9SBarry Smith         for (j=0; j<n; j++) {
759cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
7602515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
761e32f2f54SBarry 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);
76258804f6dSBarry Smith #endif
763cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
764e8d4e0b9SBarry Smith         }
765e8d4e0b9SBarry Smith       }
7663a40ed3dSBarry Smith     } else {
767289bc588SBarry Smith       for (i=0; i<m; i++) {
768cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
7692515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
770e32f2f54SBarry 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);
77158804f6dSBarry Smith #endif
772289bc588SBarry Smith         for (j=0; j<n; j++) {
773cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
7742515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
775e32f2f54SBarry 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);
77658804f6dSBarry Smith #endif
777cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
778289bc588SBarry Smith         }
779289bc588SBarry Smith       }
780289bc588SBarry Smith     }
781e8d4e0b9SBarry Smith   }
7823a40ed3dSBarry Smith   PetscFunctionReturn(0);
783289bc588SBarry Smith }
784e8d4e0b9SBarry Smith 
7854a2ae208SSatish Balay #undef __FUNCT__
7864a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense"
78713f74950SBarry Smith PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[])
788ae80bb75SLois Curfman McInnes {
789ae80bb75SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
79013f74950SBarry Smith   PetscInt     i,j;
791ae80bb75SLois Curfman McInnes 
7923a40ed3dSBarry Smith   PetscFunctionBegin;
793ae80bb75SLois Curfman McInnes   /* row-oriented output */
794ae80bb75SLois Curfman McInnes   for (i=0; i<m; i++) {
79597e567efSBarry Smith     if (indexm[i] < 0) {v += n;continue;}
796e32f2f54SBarry 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);
797ae80bb75SLois Curfman McInnes     for (j=0; j<n; j++) {
7986f31f424SBarry Smith       if (indexn[j] < 0) {v++; continue;}
799e32f2f54SBarry 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);
80097e567efSBarry Smith       *v++ = mat->v[indexn[j]*mat->lda + indexm[i]];
801ae80bb75SLois Curfman McInnes     }
802ae80bb75SLois Curfman McInnes   }
8033a40ed3dSBarry Smith   PetscFunctionReturn(0);
804ae80bb75SLois Curfman McInnes }
805ae80bb75SLois Curfman McInnes 
806289bc588SBarry Smith /* -----------------------------------------------------------------*/
807289bc588SBarry Smith 
8084a2ae208SSatish Balay #undef __FUNCT__
8095bba2384SShri Abhyankar #define __FUNCT__ "MatLoad_SeqDense"
810112444f4SShri Abhyankar PetscErrorCode MatLoad_SeqDense(Mat newmat,PetscViewer viewer)
811aabbc4fbSShri Abhyankar {
812aabbc4fbSShri Abhyankar   Mat_SeqDense   *a;
813aabbc4fbSShri Abhyankar   PetscErrorCode ierr;
814aabbc4fbSShri Abhyankar   PetscInt       *scols,i,j,nz,header[4];
815aabbc4fbSShri Abhyankar   int            fd;
816aabbc4fbSShri Abhyankar   PetscMPIInt    size;
817aabbc4fbSShri Abhyankar   PetscInt       *rowlengths = 0,M,N,*cols,grows,gcols;
818aabbc4fbSShri Abhyankar   PetscScalar    *vals,*svals,*v,*w;
819ce94432eSBarry Smith   MPI_Comm       comm;
820aabbc4fbSShri Abhyankar 
821aabbc4fbSShri Abhyankar   PetscFunctionBegin;
822ce94432eSBarry Smith   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
823aabbc4fbSShri Abhyankar   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
824aabbc4fbSShri Abhyankar   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor");
825aabbc4fbSShri Abhyankar   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
826aabbc4fbSShri Abhyankar   ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr);
827aabbc4fbSShri Abhyankar   if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object");
828aabbc4fbSShri Abhyankar   M = header[1]; N = header[2]; nz = header[3];
829aabbc4fbSShri Abhyankar 
830aabbc4fbSShri Abhyankar   /* set global size if not set already*/
831aabbc4fbSShri Abhyankar   if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) {
832aabbc4fbSShri Abhyankar     ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr);
833aabbc4fbSShri Abhyankar   } else {
834aabbc4fbSShri Abhyankar     /* if sizes and type are already set, check if the vector global sizes are correct */
835aabbc4fbSShri Abhyankar     ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr);
836aabbc4fbSShri 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);
837aabbc4fbSShri Abhyankar   }
838*e6324fbbSBarry Smith   a = (Mat_SeqDense*)newmat->data;
839*e6324fbbSBarry Smith   if (!a->user_alloc) {
8400298fd71SBarry Smith     ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr);
841*e6324fbbSBarry Smith   }
842aabbc4fbSShri Abhyankar 
843aabbc4fbSShri Abhyankar   if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */
844aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
845aabbc4fbSShri Abhyankar     v = a->v;
846aabbc4fbSShri Abhyankar     /* Allocate some temp space to read in the values and then flip them
847aabbc4fbSShri Abhyankar        from row major to column major */
848785e854fSJed Brown     ierr = PetscMalloc1((M*N > 0 ? M*N : 1),&w);CHKERRQ(ierr);
849aabbc4fbSShri Abhyankar     /* read in nonzero values */
850aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr);
851aabbc4fbSShri Abhyankar     /* now flip the values and store them in the matrix*/
852aabbc4fbSShri Abhyankar     for (j=0; j<N; j++) {
853aabbc4fbSShri Abhyankar       for (i=0; i<M; i++) {
854aabbc4fbSShri Abhyankar         *v++ =w[i*N+j];
855aabbc4fbSShri Abhyankar       }
856aabbc4fbSShri Abhyankar     }
857aabbc4fbSShri Abhyankar     ierr = PetscFree(w);CHKERRQ(ierr);
858aabbc4fbSShri Abhyankar   } else {
859aabbc4fbSShri Abhyankar     /* read row lengths */
860785e854fSJed Brown     ierr = PetscMalloc1((M+1),&rowlengths);CHKERRQ(ierr);
861aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr);
862aabbc4fbSShri Abhyankar 
863aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
864aabbc4fbSShri Abhyankar     v = a->v;
865aabbc4fbSShri Abhyankar 
866aabbc4fbSShri Abhyankar     /* read column indices and nonzeros */
867785e854fSJed Brown     ierr = PetscMalloc1((nz+1),&scols);CHKERRQ(ierr);
868aabbc4fbSShri Abhyankar     cols = scols;
869aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr);
870785e854fSJed Brown     ierr = PetscMalloc1((nz+1),&svals);CHKERRQ(ierr);
871aabbc4fbSShri Abhyankar     vals = svals;
872aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr);
873aabbc4fbSShri Abhyankar 
874aabbc4fbSShri Abhyankar     /* insert into matrix */
875aabbc4fbSShri Abhyankar     for (i=0; i<M; i++) {
876aabbc4fbSShri Abhyankar       for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j];
877aabbc4fbSShri Abhyankar       svals += rowlengths[i]; scols += rowlengths[i];
878aabbc4fbSShri Abhyankar     }
879aabbc4fbSShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
880aabbc4fbSShri Abhyankar     ierr = PetscFree(cols);CHKERRQ(ierr);
881aabbc4fbSShri Abhyankar     ierr = PetscFree(rowlengths);CHKERRQ(ierr);
882aabbc4fbSShri Abhyankar   }
883aabbc4fbSShri Abhyankar   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
884aabbc4fbSShri Abhyankar   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
885aabbc4fbSShri Abhyankar   PetscFunctionReturn(0);
886aabbc4fbSShri Abhyankar }
887aabbc4fbSShri Abhyankar 
888aabbc4fbSShri Abhyankar #undef __FUNCT__
8894a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII"
8906849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer)
891289bc588SBarry Smith {
892932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
893dfbe8321SBarry Smith   PetscErrorCode    ierr;
89413f74950SBarry Smith   PetscInt          i,j;
8952dcb1b2aSMatthew Knepley   const char        *name;
89687828ca2SBarry Smith   PetscScalar       *v;
897f3ef73ceSBarry Smith   PetscViewerFormat format;
8985f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX)
899ace3abfcSBarry Smith   PetscBool         allreal = PETSC_TRUE;
9005f481a85SSatish Balay #endif
901932b0c3eSLois Curfman McInnes 
9023a40ed3dSBarry Smith   PetscFunctionBegin;
903b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
904456192e2SBarry Smith   if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
9053a40ed3dSBarry Smith     PetscFunctionReturn(0);  /* do nothing for now */
906fb9695e5SSatish Balay   } else if (format == PETSC_VIEWER_ASCII_COMMON) {
907d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
908d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
90944cd7ae7SLois Curfman McInnes       v    = a->v + i;
91077431f27SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr);
911d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
912aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
913329f5518SBarry Smith         if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) {
91457622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g + %g i) ",j,(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr);
915329f5518SBarry Smith         } else if (PetscRealPart(*v)) {
91657622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)PetscRealPart(*v));CHKERRQ(ierr);
9176831982aSBarry Smith         }
91880cd9d93SLois Curfman McInnes #else
9196831982aSBarry Smith         if (*v) {
92057622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)*v);CHKERRQ(ierr);
9216831982aSBarry Smith         }
92280cd9d93SLois Curfman McInnes #endif
9231b807ce4Svictorle         v += a->lda;
92480cd9d93SLois Curfman McInnes       }
925b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
92680cd9d93SLois Curfman McInnes     }
927d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
9283a40ed3dSBarry Smith   } else {
929d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
930aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
93147989497SBarry Smith     /* determine if matrix has all real values */
93247989497SBarry Smith     v = a->v;
933d0f46423SBarry Smith     for (i=0; i<A->rmap->n*A->cmap->n; i++) {
934ffac6cdbSBarry Smith       if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break;}
93547989497SBarry Smith     }
93647989497SBarry Smith #endif
937fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
9383a7fca6bSBarry Smith       ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr);
939d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr);
940d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
941fb9695e5SSatish Balay       ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr);
942ffac6cdbSBarry Smith     }
943ffac6cdbSBarry Smith 
944d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
945932b0c3eSLois Curfman McInnes       v = a->v + i;
946d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
947aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
94847989497SBarry Smith         if (allreal) {
949c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr);
95047989497SBarry Smith         } else {
951c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr);
95247989497SBarry Smith         }
953289bc588SBarry Smith #else
954c61cd2faSJed Brown         ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr);
955289bc588SBarry Smith #endif
9561b807ce4Svictorle         v += a->lda;
957289bc588SBarry Smith       }
958b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
959289bc588SBarry Smith     }
960fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
961b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr);
962ffac6cdbSBarry Smith     }
963d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
964da3a660dSBarry Smith   }
965b0a32e0cSBarry Smith   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
9663a40ed3dSBarry Smith   PetscFunctionReturn(0);
967289bc588SBarry Smith }
968289bc588SBarry Smith 
9694a2ae208SSatish Balay #undef __FUNCT__
9704a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary"
9716849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer)
972932b0c3eSLois Curfman McInnes {
973932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
9746849ba73SBarry Smith   PetscErrorCode    ierr;
97513f74950SBarry Smith   int               fd;
976d0f46423SBarry Smith   PetscInt          ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n;
977f4403165SShri Abhyankar   PetscScalar       *v,*anonz,*vals;
978f4403165SShri Abhyankar   PetscViewerFormat format;
979932b0c3eSLois Curfman McInnes 
9803a40ed3dSBarry Smith   PetscFunctionBegin;
981b0a32e0cSBarry Smith   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
98290ace30eSBarry Smith 
983f4403165SShri Abhyankar   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
984f4403165SShri Abhyankar   if (format == PETSC_VIEWER_NATIVE) {
985f4403165SShri Abhyankar     /* store the matrix as a dense matrix */
986785e854fSJed Brown     ierr = PetscMalloc1(4,&col_lens);CHKERRQ(ierr);
9872205254eSKarl Rupp 
988f4403165SShri Abhyankar     col_lens[0] = MAT_FILE_CLASSID;
989f4403165SShri Abhyankar     col_lens[1] = m;
990f4403165SShri Abhyankar     col_lens[2] = n;
991f4403165SShri Abhyankar     col_lens[3] = MATRIX_BINARY_FORMAT_DENSE;
9922205254eSKarl Rupp 
993f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
994f4403165SShri Abhyankar     ierr = PetscFree(col_lens);CHKERRQ(ierr);
995f4403165SShri Abhyankar 
996f4403165SShri Abhyankar     /* write out matrix, by rows */
997785e854fSJed Brown     ierr = PetscMalloc1((m*n+1),&vals);CHKERRQ(ierr);
998f4403165SShri Abhyankar     v    = a->v;
999f4403165SShri Abhyankar     for (j=0; j<n; j++) {
1000f4403165SShri Abhyankar       for (i=0; i<m; i++) {
1001f4403165SShri Abhyankar         vals[j + i*n] = *v++;
1002f4403165SShri Abhyankar       }
1003f4403165SShri Abhyankar     }
1004f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
1005f4403165SShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
1006f4403165SShri Abhyankar   } else {
1007785e854fSJed Brown     ierr = PetscMalloc1((4+nz),&col_lens);CHKERRQ(ierr);
10082205254eSKarl Rupp 
10090700a824SBarry Smith     col_lens[0] = MAT_FILE_CLASSID;
1010932b0c3eSLois Curfman McInnes     col_lens[1] = m;
1011932b0c3eSLois Curfman McInnes     col_lens[2] = n;
1012932b0c3eSLois Curfman McInnes     col_lens[3] = nz;
1013932b0c3eSLois Curfman McInnes 
1014932b0c3eSLois Curfman McInnes     /* store lengths of each row and write (including header) to file */
1015932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) col_lens[4+i] = n;
10166f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
1017932b0c3eSLois Curfman McInnes 
1018932b0c3eSLois Curfman McInnes     /* Possibly should write in smaller increments, not whole matrix at once? */
1019932b0c3eSLois Curfman McInnes     /* store column indices (zero start index) */
1020932b0c3eSLois Curfman McInnes     ict = 0;
1021932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1022932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) col_lens[ict++] = j;
1023932b0c3eSLois Curfman McInnes     }
10246f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
1025606d414cSSatish Balay     ierr = PetscFree(col_lens);CHKERRQ(ierr);
1026932b0c3eSLois Curfman McInnes 
1027932b0c3eSLois Curfman McInnes     /* store nonzero values */
1028785e854fSJed Brown     ierr = PetscMalloc1((nz+1),&anonz);CHKERRQ(ierr);
1029932b0c3eSLois Curfman McInnes     ict  = 0;
1030932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1031932b0c3eSLois Curfman McInnes       v = a->v + i;
1032932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) {
10331b807ce4Svictorle         anonz[ict++] = *v; v += a->lda;
1034932b0c3eSLois Curfman McInnes       }
1035932b0c3eSLois Curfman McInnes     }
10366f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
1037606d414cSSatish Balay     ierr = PetscFree(anonz);CHKERRQ(ierr);
1038f4403165SShri Abhyankar   }
10393a40ed3dSBarry Smith   PetscFunctionReturn(0);
1040932b0c3eSLois Curfman McInnes }
1041932b0c3eSLois Curfman McInnes 
10429804daf3SBarry Smith #include <petscdraw.h>
10434a2ae208SSatish Balay #undef __FUNCT__
10444a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom"
1045dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa)
1046f1af5d2fSBarry Smith {
1047f1af5d2fSBarry Smith   Mat               A  = (Mat) Aa;
1048f1af5d2fSBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
10496849ba73SBarry Smith   PetscErrorCode    ierr;
1050d0f46423SBarry Smith   PetscInt          m  = A->rmap->n,n = A->cmap->n,color,i,j;
105187828ca2SBarry Smith   PetscScalar       *v = a->v;
1052b0a32e0cSBarry Smith   PetscViewer       viewer;
1053b0a32e0cSBarry Smith   PetscDraw         popup;
1054329f5518SBarry Smith   PetscReal         xl,yl,xr,yr,x_l,x_r,y_l,y_r,scale,maxv = 0.0;
1055f3ef73ceSBarry Smith   PetscViewerFormat format;
1056f1af5d2fSBarry Smith 
1057f1af5d2fSBarry Smith   PetscFunctionBegin;
1058f1af5d2fSBarry Smith   ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr);
1059b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1060b0a32e0cSBarry Smith   ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr);
1061f1af5d2fSBarry Smith 
1062f1af5d2fSBarry Smith   /* Loop over matrix elements drawing boxes */
1063fb9695e5SSatish Balay   if (format != PETSC_VIEWER_DRAW_CONTOUR) {
1064f1af5d2fSBarry Smith     /* Blue for negative and Red for positive */
1065b0a32e0cSBarry Smith     color = PETSC_DRAW_BLUE;
1066f1af5d2fSBarry Smith     for (j = 0; j < n; j++) {
1067f1af5d2fSBarry Smith       x_l = j;
1068f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1069f1af5d2fSBarry Smith       for (i = 0; i < m; i++) {
1070f1af5d2fSBarry Smith         y_l = m - i - 1.0;
1071f1af5d2fSBarry Smith         y_r = y_l + 1.0;
1072329f5518SBarry Smith         if (PetscRealPart(v[j*m+i]) >  0.) {
1073b0a32e0cSBarry Smith           color = PETSC_DRAW_RED;
1074329f5518SBarry Smith         } else if (PetscRealPart(v[j*m+i]) <  0.) {
1075b0a32e0cSBarry Smith           color = PETSC_DRAW_BLUE;
1076f1af5d2fSBarry Smith         } else {
1077f1af5d2fSBarry Smith           continue;
1078f1af5d2fSBarry Smith         }
1079b0a32e0cSBarry Smith         ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1080f1af5d2fSBarry Smith       }
1081f1af5d2fSBarry Smith     }
1082f1af5d2fSBarry Smith   } else {
1083f1af5d2fSBarry Smith     /* use contour shading to indicate magnitude of values */
1084f1af5d2fSBarry Smith     /* first determine max of all nonzero values */
1085f1af5d2fSBarry Smith     for (i = 0; i < m*n; i++) {
1086f1af5d2fSBarry Smith       if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]);
1087f1af5d2fSBarry Smith     }
1088b0a32e0cSBarry Smith     scale = (245.0 - PETSC_DRAW_BASIC_COLORS)/maxv;
1089b0a32e0cSBarry Smith     ierr  = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr);
1090b0a32e0cSBarry Smith     if (popup) {ierr = PetscDrawScalePopup(popup,0.0,maxv);CHKERRQ(ierr);}
1091f1af5d2fSBarry Smith     for (j = 0; j < n; j++) {
1092f1af5d2fSBarry Smith       x_l = j;
1093f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1094f1af5d2fSBarry Smith       for (i = 0; i < m; i++) {
1095f1af5d2fSBarry Smith         y_l   = m - i - 1.0;
1096f1af5d2fSBarry Smith         y_r   = y_l + 1.0;
1097b0a32e0cSBarry Smith         color = PETSC_DRAW_BASIC_COLORS + (int)(scale*PetscAbsScalar(v[j*m+i]));
1098b0a32e0cSBarry Smith         ierr  = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1099f1af5d2fSBarry Smith       }
1100f1af5d2fSBarry Smith     }
1101f1af5d2fSBarry Smith   }
1102f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1103f1af5d2fSBarry Smith }
1104f1af5d2fSBarry Smith 
11054a2ae208SSatish Balay #undef __FUNCT__
11064a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw"
1107dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer)
1108f1af5d2fSBarry Smith {
1109b0a32e0cSBarry Smith   PetscDraw      draw;
1110ace3abfcSBarry Smith   PetscBool      isnull;
1111329f5518SBarry Smith   PetscReal      xr,yr,xl,yl,h,w;
1112dfbe8321SBarry Smith   PetscErrorCode ierr;
1113f1af5d2fSBarry Smith 
1114f1af5d2fSBarry Smith   PetscFunctionBegin;
1115b0a32e0cSBarry Smith   ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
1116b0a32e0cSBarry Smith   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
1117abc0a331SBarry Smith   if (isnull) PetscFunctionReturn(0);
1118f1af5d2fSBarry Smith 
1119f1af5d2fSBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr);
1120d0f46423SBarry Smith   xr   = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0;
1121f1af5d2fSBarry Smith   xr  += w;    yr += h;  xl = -w;     yl = -h;
1122b0a32e0cSBarry Smith   ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr);
1123b0a32e0cSBarry Smith   ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr);
11240298fd71SBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr);
1125f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1126f1af5d2fSBarry Smith }
1127f1af5d2fSBarry Smith 
11284a2ae208SSatish Balay #undef __FUNCT__
11294a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense"
1130dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer)
1131932b0c3eSLois Curfman McInnes {
1132dfbe8321SBarry Smith   PetscErrorCode ierr;
1133ace3abfcSBarry Smith   PetscBool      iascii,isbinary,isdraw;
1134932b0c3eSLois Curfman McInnes 
11353a40ed3dSBarry Smith   PetscFunctionBegin;
1136251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
1137251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
1138251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
11390f5bd95cSBarry Smith 
1140c45a1595SBarry Smith   if (iascii) {
1141c45a1595SBarry Smith     ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr);
11420f5bd95cSBarry Smith   } else if (isbinary) {
11433a40ed3dSBarry Smith     ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr);
1144f1af5d2fSBarry Smith   } else if (isdraw) {
1145f1af5d2fSBarry Smith     ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr);
1146932b0c3eSLois Curfman McInnes   }
11473a40ed3dSBarry Smith   PetscFunctionReturn(0);
1148932b0c3eSLois Curfman McInnes }
1149289bc588SBarry Smith 
11504a2ae208SSatish Balay #undef __FUNCT__
11514a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense"
1152dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqDense(Mat mat)
1153289bc588SBarry Smith {
1154ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)mat->data;
1155dfbe8321SBarry Smith   PetscErrorCode ierr;
115690f02eecSBarry Smith 
11573a40ed3dSBarry Smith   PetscFunctionBegin;
1158aa482453SBarry Smith #if defined(PETSC_USE_LOG)
1159d0f46423SBarry Smith   PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n);
1160a5a9c739SBarry Smith #endif
116105b42c5fSBarry Smith   ierr = PetscFree(l->pivots);CHKERRQ(ierr);
11626857c123SSatish Balay   if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);}
1163bf0cc555SLisandro Dalcin   ierr = PetscFree(mat->data);CHKERRQ(ierr);
1164dbd8c25aSHong Zhang 
1165dbd8c25aSHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr);
1166bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL);CHKERRQ(ierr);
1167bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL);CHKERRQ(ierr);
11688baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL);CHKERRQ(ierr);
11698baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
11708baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL);CHKERRQ(ierr);
11718baccfbdSHong Zhang #endif
11728baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatGetFactor_petsc_C",NULL);CHKERRQ(ierr);
1173bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL);CHKERRQ(ierr);
1174bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1175bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1176bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
11773bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
11783bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
11793bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
11803a40ed3dSBarry Smith   PetscFunctionReturn(0);
1181289bc588SBarry Smith }
1182289bc588SBarry Smith 
11834a2ae208SSatish Balay #undef __FUNCT__
11844a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense"
1185fc4dec0aSBarry Smith PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout)
1186289bc588SBarry Smith {
1187c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
11886849ba73SBarry Smith   PetscErrorCode ierr;
118913f74950SBarry Smith   PetscInt       k,j,m,n,M;
119087828ca2SBarry Smith   PetscScalar    *v,tmp;
119148b35521SBarry Smith 
11923a40ed3dSBarry Smith   PetscFunctionBegin;
1193d0f46423SBarry Smith   v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n;
1194e9695a30SBarry Smith   if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */
1195e7e72b3dSBarry Smith     if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place");
1196e7e72b3dSBarry Smith     else {
1197d3e5ee88SLois Curfman McInnes       for (j=0; j<m; j++) {
1198289bc588SBarry Smith         for (k=0; k<j; k++) {
11991b807ce4Svictorle           tmp        = v[j + k*M];
12001b807ce4Svictorle           v[j + k*M] = v[k + j*M];
12011b807ce4Svictorle           v[k + j*M] = tmp;
1202289bc588SBarry Smith         }
1203289bc588SBarry Smith       }
1204d64ed03dSBarry Smith     }
12053a40ed3dSBarry Smith   } else { /* out-of-place transpose */
1206d3e5ee88SLois Curfman McInnes     Mat          tmat;
1207ec8511deSBarry Smith     Mat_SeqDense *tmatd;
120887828ca2SBarry Smith     PetscScalar  *v2;
1209ea709b57SSatish Balay 
1210fc4dec0aSBarry Smith     if (reuse == MAT_INITIAL_MATRIX) {
1211ce94432eSBarry Smith       ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr);
1212d0f46423SBarry Smith       ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr);
12137adad957SLisandro Dalcin       ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
12140298fd71SBarry Smith       ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr);
1215fc4dec0aSBarry Smith     } else {
1216fc4dec0aSBarry Smith       tmat = *matout;
1217fc4dec0aSBarry Smith     }
1218ec8511deSBarry Smith     tmatd = (Mat_SeqDense*)tmat->data;
12190de55854SLois Curfman McInnes     v = mat->v; v2 = tmatd->v;
1220d3e5ee88SLois Curfman McInnes     for (j=0; j<n; j++) {
12211b807ce4Svictorle       for (k=0; k<m; k++) v2[j + k*n] = v[k + j*M];
1222d3e5ee88SLois Curfman McInnes     }
12236d4a8577SBarry Smith     ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
12246d4a8577SBarry Smith     ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1225d3e5ee88SLois Curfman McInnes     *matout = tmat;
122648b35521SBarry Smith   }
12273a40ed3dSBarry Smith   PetscFunctionReturn(0);
1228289bc588SBarry Smith }
1229289bc588SBarry Smith 
12304a2ae208SSatish Balay #undef __FUNCT__
12314a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense"
1232ace3abfcSBarry Smith PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool  *flg)
1233289bc588SBarry Smith {
1234c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data;
1235c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data;
123613f74950SBarry Smith   PetscInt     i,j;
1237a2ea699eSBarry Smith   PetscScalar  *v1,*v2;
12389ea5d5aeSSatish Balay 
12393a40ed3dSBarry Smith   PetscFunctionBegin;
1240d0f46423SBarry Smith   if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1241d0f46423SBarry Smith   if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1242d0f46423SBarry Smith   for (i=0; i<A1->rmap->n; i++) {
12431b807ce4Svictorle     v1 = mat1->v+i; v2 = mat2->v+i;
1244d0f46423SBarry Smith     for (j=0; j<A1->cmap->n; j++) {
12453a40ed3dSBarry Smith       if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
12461b807ce4Svictorle       v1 += mat1->lda; v2 += mat2->lda;
12471b807ce4Svictorle     }
1248289bc588SBarry Smith   }
124977c4ece6SBarry Smith   *flg = PETSC_TRUE;
12503a40ed3dSBarry Smith   PetscFunctionReturn(0);
1251289bc588SBarry Smith }
1252289bc588SBarry Smith 
12534a2ae208SSatish Balay #undef __FUNCT__
12544a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense"
1255dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v)
1256289bc588SBarry Smith {
1257c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
1258dfbe8321SBarry Smith   PetscErrorCode ierr;
125913f74950SBarry Smith   PetscInt       i,n,len;
126087828ca2SBarry Smith   PetscScalar    *x,zero = 0.0;
126144cd7ae7SLois Curfman McInnes 
12623a40ed3dSBarry Smith   PetscFunctionBegin;
12632dcb1b2aSMatthew Knepley   ierr = VecSet(v,zero);CHKERRQ(ierr);
12647a97a34bSBarry Smith   ierr = VecGetSize(v,&n);CHKERRQ(ierr);
12651ebc52fbSHong Zhang   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1266d0f46423SBarry Smith   len  = PetscMin(A->rmap->n,A->cmap->n);
1267e32f2f54SBarry Smith   if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec");
126844cd7ae7SLois Curfman McInnes   for (i=0; i<len; i++) {
12691b807ce4Svictorle     x[i] = mat->v[i*mat->lda + i];
1270289bc588SBarry Smith   }
12711ebc52fbSHong Zhang   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
12723a40ed3dSBarry Smith   PetscFunctionReturn(0);
1273289bc588SBarry Smith }
1274289bc588SBarry Smith 
12754a2ae208SSatish Balay #undef __FUNCT__
12764a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense"
1277dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr)
1278289bc588SBarry Smith {
1279c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
128087828ca2SBarry Smith   PetscScalar    *l,*r,x,*v;
1281dfbe8321SBarry Smith   PetscErrorCode ierr;
1282d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n;
128355659b69SBarry Smith 
12843a40ed3dSBarry Smith   PetscFunctionBegin;
128528988994SBarry Smith   if (ll) {
12867a97a34bSBarry Smith     ierr = VecGetSize(ll,&m);CHKERRQ(ierr);
12871ebc52fbSHong Zhang     ierr = VecGetArray(ll,&l);CHKERRQ(ierr);
1288e32f2f54SBarry Smith     if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size");
1289da3a660dSBarry Smith     for (i=0; i<m; i++) {
1290da3a660dSBarry Smith       x = l[i];
1291da3a660dSBarry Smith       v = mat->v + i;
1292da3a660dSBarry Smith       for (j=0; j<n; j++) { (*v) *= x; v+= m;}
1293da3a660dSBarry Smith     }
12941ebc52fbSHong Zhang     ierr = VecRestoreArray(ll,&l);CHKERRQ(ierr);
1295efee365bSSatish Balay     ierr = PetscLogFlops(n*m);CHKERRQ(ierr);
1296da3a660dSBarry Smith   }
129728988994SBarry Smith   if (rr) {
12987a97a34bSBarry Smith     ierr = VecGetSize(rr,&n);CHKERRQ(ierr);
12991ebc52fbSHong Zhang     ierr = VecGetArray(rr,&r);CHKERRQ(ierr);
1300e32f2f54SBarry Smith     if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size");
1301da3a660dSBarry Smith     for (i=0; i<n; i++) {
1302da3a660dSBarry Smith       x = r[i];
1303da3a660dSBarry Smith       v = mat->v + i*m;
13042205254eSKarl Rupp       for (j=0; j<m; j++) (*v++) *= x;
1305da3a660dSBarry Smith     }
13061ebc52fbSHong Zhang     ierr = VecRestoreArray(rr,&r);CHKERRQ(ierr);
1307efee365bSSatish Balay     ierr = PetscLogFlops(n*m);CHKERRQ(ierr);
1308da3a660dSBarry Smith   }
13093a40ed3dSBarry Smith   PetscFunctionReturn(0);
1310289bc588SBarry Smith }
1311289bc588SBarry Smith 
13124a2ae208SSatish Balay #undef __FUNCT__
13134a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense"
1314dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm)
1315289bc588SBarry Smith {
1316c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
131787828ca2SBarry Smith   PetscScalar    *v   = mat->v;
1318329f5518SBarry Smith   PetscReal      sum  = 0.0;
1319d0f46423SBarry Smith   PetscInt       lda  =mat->lda,m=A->rmap->n,i,j;
1320efee365bSSatish Balay   PetscErrorCode ierr;
132155659b69SBarry Smith 
13223a40ed3dSBarry Smith   PetscFunctionBegin;
1323289bc588SBarry Smith   if (type == NORM_FROBENIUS) {
1324a5ce6ee0Svictorle     if (lda>m) {
1325d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1326a5ce6ee0Svictorle         v = mat->v+j*lda;
1327a5ce6ee0Svictorle         for (i=0; i<m; i++) {
1328a5ce6ee0Svictorle           sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1329a5ce6ee0Svictorle         }
1330a5ce6ee0Svictorle       }
1331a5ce6ee0Svictorle     } else {
1332d0f46423SBarry Smith       for (i=0; i<A->cmap->n*A->rmap->n; i++) {
1333329f5518SBarry Smith         sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1334289bc588SBarry Smith       }
1335a5ce6ee0Svictorle     }
13368f1a2a5eSBarry Smith     *nrm = PetscSqrtReal(sum);
1337dc0b31edSSatish Balay     ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
13383a40ed3dSBarry Smith   } else if (type == NORM_1) {
1339064f8208SBarry Smith     *nrm = 0.0;
1340d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
13411b807ce4Svictorle       v   = mat->v + j*mat->lda;
1342289bc588SBarry Smith       sum = 0.0;
1343d0f46423SBarry Smith       for (i=0; i<A->rmap->n; i++) {
134433a8263dSBarry Smith         sum += PetscAbsScalar(*v);  v++;
1345289bc588SBarry Smith       }
1346064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1347289bc588SBarry Smith     }
1348d0f46423SBarry Smith     ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr);
13493a40ed3dSBarry Smith   } else if (type == NORM_INFINITY) {
1350064f8208SBarry Smith     *nrm = 0.0;
1351d0f46423SBarry Smith     for (j=0; j<A->rmap->n; j++) {
1352289bc588SBarry Smith       v   = mat->v + j;
1353289bc588SBarry Smith       sum = 0.0;
1354d0f46423SBarry Smith       for (i=0; i<A->cmap->n; i++) {
13551b807ce4Svictorle         sum += PetscAbsScalar(*v); v += mat->lda;
1356289bc588SBarry Smith       }
1357064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1358289bc588SBarry Smith     }
1359d0f46423SBarry Smith     ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr);
1360e7e72b3dSBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm");
13613a40ed3dSBarry Smith   PetscFunctionReturn(0);
1362289bc588SBarry Smith }
1363289bc588SBarry Smith 
13644a2ae208SSatish Balay #undef __FUNCT__
13654a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense"
1366ace3abfcSBarry Smith PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg)
1367289bc588SBarry Smith {
1368c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *aij = (Mat_SeqDense*)A->data;
136963ba0a88SBarry Smith   PetscErrorCode ierr;
137067e560aaSBarry Smith 
13713a40ed3dSBarry Smith   PetscFunctionBegin;
1372b5a2b587SKris Buschelman   switch (op) {
1373b5a2b587SKris Buschelman   case MAT_ROW_ORIENTED:
13744e0d8c25SBarry Smith     aij->roworiented = flg;
1375b5a2b587SKris Buschelman     break;
1376512a5fc5SBarry Smith   case MAT_NEW_NONZERO_LOCATIONS:
1377b5a2b587SKris Buschelman   case MAT_NEW_NONZERO_LOCATION_ERR:
13783971808eSMatthew Knepley   case MAT_NEW_NONZERO_ALLOCATION_ERR:
13794e0d8c25SBarry Smith   case MAT_NEW_DIAGONALS:
138013fa8e87SLisandro Dalcin   case MAT_KEEP_NONZERO_PATTERN:
1381b5a2b587SKris Buschelman   case MAT_IGNORE_OFF_PROC_ENTRIES:
1382b5a2b587SKris Buschelman   case MAT_USE_HASH_TABLE:
13835021d80fSJed Brown   case MAT_IGNORE_LOWER_TRIANGULAR:
13845021d80fSJed Brown     ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr);
13855021d80fSJed Brown     break;
13865021d80fSJed Brown   case MAT_SPD:
138777e54ba9SKris Buschelman   case MAT_SYMMETRIC:
138877e54ba9SKris Buschelman   case MAT_STRUCTURALLY_SYMMETRIC:
13899a4540c5SBarry Smith   case MAT_HERMITIAN:
13909a4540c5SBarry Smith   case MAT_SYMMETRY_ETERNAL:
13915021d80fSJed Brown     /* These options are handled directly by MatSetOption() */
139277e54ba9SKris Buschelman     break;
1393b5a2b587SKris Buschelman   default:
1394e32f2f54SBarry Smith     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]);
13953a40ed3dSBarry Smith   }
13963a40ed3dSBarry Smith   PetscFunctionReturn(0);
1397289bc588SBarry Smith }
1398289bc588SBarry Smith 
13994a2ae208SSatish Balay #undef __FUNCT__
14004a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense"
1401dfbe8321SBarry Smith PetscErrorCode MatZeroEntries_SeqDense(Mat A)
14026f0a148fSBarry Smith {
1403ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)A->data;
14046849ba73SBarry Smith   PetscErrorCode ierr;
1405d0f46423SBarry Smith   PetscInt       lda=l->lda,m=A->rmap->n,j;
14063a40ed3dSBarry Smith 
14073a40ed3dSBarry Smith   PetscFunctionBegin;
1408a5ce6ee0Svictorle   if (lda>m) {
1409d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1410a5ce6ee0Svictorle       ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
1411a5ce6ee0Svictorle     }
1412a5ce6ee0Svictorle   } else {
1413d0f46423SBarry Smith     ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1414a5ce6ee0Svictorle   }
14153a40ed3dSBarry Smith   PetscFunctionReturn(0);
14166f0a148fSBarry Smith }
14176f0a148fSBarry Smith 
14184a2ae208SSatish Balay #undef __FUNCT__
14194a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense"
14202b40b63fSBarry Smith PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b)
14216f0a148fSBarry Smith {
142297b48c8fSBarry Smith   PetscErrorCode    ierr;
1423ec8511deSBarry Smith   Mat_SeqDense      *l = (Mat_SeqDense*)A->data;
1424b9679d65SBarry Smith   PetscInt          m  = l->lda, n = A->cmap->n, i,j;
142597b48c8fSBarry Smith   PetscScalar       *slot,*bb;
142697b48c8fSBarry Smith   const PetscScalar *xx;
142755659b69SBarry Smith 
14283a40ed3dSBarry Smith   PetscFunctionBegin;
1429b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG)
1430b9679d65SBarry Smith   for (i=0; i<N; i++) {
1431b9679d65SBarry Smith     if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed");
1432b9679d65SBarry 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);
1433b9679d65SBarry Smith   }
1434b9679d65SBarry Smith #endif
1435b9679d65SBarry Smith 
143697b48c8fSBarry Smith   /* fix right hand side if needed */
143797b48c8fSBarry Smith   if (x && b) {
143897b48c8fSBarry Smith     ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr);
143997b48c8fSBarry Smith     ierr = VecGetArray(b,&bb);CHKERRQ(ierr);
14402205254eSKarl Rupp     for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]];
144197b48c8fSBarry Smith     ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr);
144297b48c8fSBarry Smith     ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr);
144397b48c8fSBarry Smith   }
144497b48c8fSBarry Smith 
14456f0a148fSBarry Smith   for (i=0; i<N; i++) {
14466f0a148fSBarry Smith     slot = l->v + rows[i];
1447b9679d65SBarry Smith     for (j=0; j<n; j++) { *slot = 0.0; slot += m;}
14486f0a148fSBarry Smith   }
1449f4df32b1SMatthew Knepley   if (diag != 0.0) {
1450b9679d65SBarry Smith     if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices");
14516f0a148fSBarry Smith     for (i=0; i<N; i++) {
1452b9679d65SBarry Smith       slot  = l->v + (m+1)*rows[i];
1453f4df32b1SMatthew Knepley       *slot = diag;
14546f0a148fSBarry Smith     }
14556f0a148fSBarry Smith   }
14563a40ed3dSBarry Smith   PetscFunctionReturn(0);
14576f0a148fSBarry Smith }
1458557bce09SLois Curfman McInnes 
14594a2ae208SSatish Balay #undef __FUNCT__
14608c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray_SeqDense"
14618c778c55SBarry Smith PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar *array[])
146264e87e97SBarry Smith {
1463c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
14643a40ed3dSBarry Smith 
14653a40ed3dSBarry Smith   PetscFunctionBegin;
1466e32f2f54SBarry 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");
146764e87e97SBarry Smith   *array = mat->v;
14683a40ed3dSBarry Smith   PetscFunctionReturn(0);
146964e87e97SBarry Smith }
14700754003eSLois Curfman McInnes 
14714a2ae208SSatish Balay #undef __FUNCT__
14728c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray_SeqDense"
14738c778c55SBarry Smith PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar *array[])
1474ff14e315SSatish Balay {
14753a40ed3dSBarry Smith   PetscFunctionBegin;
147609b544d4SBarry Smith   *array = 0; /* user cannot accidently use the array later */
14773a40ed3dSBarry Smith   PetscFunctionReturn(0);
1478ff14e315SSatish Balay }
14790754003eSLois Curfman McInnes 
14804a2ae208SSatish Balay #undef __FUNCT__
14818c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray"
1482dec5eb66SMatthew G Knepley /*@C
14838c778c55SBarry Smith    MatDenseGetArray - gives access to the array where the data for a SeqDense matrix is stored
148473a71a0fSBarry Smith 
148573a71a0fSBarry Smith    Not Collective
148673a71a0fSBarry Smith 
148773a71a0fSBarry Smith    Input Parameter:
1488579dbff0SBarry Smith .  mat - a MATSEQDENSE or MATMPIDENSE matrix
148973a71a0fSBarry Smith 
149073a71a0fSBarry Smith    Output Parameter:
149173a71a0fSBarry Smith .   array - pointer to the data
149273a71a0fSBarry Smith 
149373a71a0fSBarry Smith    Level: intermediate
149473a71a0fSBarry Smith 
14958c778c55SBarry Smith .seealso: MatDenseRestoreArray()
149673a71a0fSBarry Smith @*/
14978c778c55SBarry Smith PetscErrorCode  MatDenseGetArray(Mat A,PetscScalar **array)
149873a71a0fSBarry Smith {
149973a71a0fSBarry Smith   PetscErrorCode ierr;
150073a71a0fSBarry Smith 
150173a71a0fSBarry Smith   PetscFunctionBegin;
15028c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
150373a71a0fSBarry Smith   PetscFunctionReturn(0);
150473a71a0fSBarry Smith }
150573a71a0fSBarry Smith 
150673a71a0fSBarry Smith #undef __FUNCT__
15078c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray"
1508dec5eb66SMatthew G Knepley /*@C
1509579dbff0SBarry Smith    MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray()
151073a71a0fSBarry Smith 
151173a71a0fSBarry Smith    Not Collective
151273a71a0fSBarry Smith 
151373a71a0fSBarry Smith    Input Parameters:
1514579dbff0SBarry Smith .  mat - a MATSEQDENSE or MATMPIDENSE matrix
151573a71a0fSBarry Smith .  array - pointer to the data
151673a71a0fSBarry Smith 
151773a71a0fSBarry Smith    Level: intermediate
151873a71a0fSBarry Smith 
15198c778c55SBarry Smith .seealso: MatDenseGetArray()
152073a71a0fSBarry Smith @*/
15218c778c55SBarry Smith PetscErrorCode  MatDenseRestoreArray(Mat A,PetscScalar **array)
152273a71a0fSBarry Smith {
152373a71a0fSBarry Smith   PetscErrorCode ierr;
152473a71a0fSBarry Smith 
152573a71a0fSBarry Smith   PetscFunctionBegin;
15268c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
152773a71a0fSBarry Smith   PetscFunctionReturn(0);
152873a71a0fSBarry Smith }
152973a71a0fSBarry Smith 
153073a71a0fSBarry Smith #undef __FUNCT__
15314a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense"
153213f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B)
15330754003eSLois Curfman McInnes {
1534c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
15356849ba73SBarry Smith   PetscErrorCode ierr;
15365d0c19d7SBarry Smith   PetscInt       i,j,nrows,ncols;
15375d0c19d7SBarry Smith   const PetscInt *irow,*icol;
153887828ca2SBarry Smith   PetscScalar    *av,*bv,*v = mat->v;
15390754003eSLois Curfman McInnes   Mat            newmat;
15400754003eSLois Curfman McInnes 
15413a40ed3dSBarry Smith   PetscFunctionBegin;
154278b31e54SBarry Smith   ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr);
154378b31e54SBarry Smith   ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr);
1544e03a110bSBarry Smith   ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr);
1545e03a110bSBarry Smith   ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr);
15460754003eSLois Curfman McInnes 
1547182d2002SSatish Balay   /* Check submatrixcall */
1548182d2002SSatish Balay   if (scall == MAT_REUSE_MATRIX) {
154913f74950SBarry Smith     PetscInt n_cols,n_rows;
1550182d2002SSatish Balay     ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr);
155121a2c019SBarry Smith     if (n_rows != nrows || n_cols != ncols) {
1552f746d493SDmitry Karpeev       /* resize the result matrix to match number of requested rows/columns */
1553c61587bbSBarry Smith       ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
155421a2c019SBarry Smith     }
1555182d2002SSatish Balay     newmat = *B;
1556182d2002SSatish Balay   } else {
15570754003eSLois Curfman McInnes     /* Create and fill new matrix */
1558ce94432eSBarry Smith     ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr);
1559f69a0ea3SMatthew Knepley     ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
15607adad957SLisandro Dalcin     ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
15610298fd71SBarry Smith     ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr);
1562182d2002SSatish Balay   }
1563182d2002SSatish Balay 
1564182d2002SSatish Balay   /* Now extract the data pointers and do the copy,column at a time */
1565182d2002SSatish Balay   bv = ((Mat_SeqDense*)newmat->data)->v;
1566182d2002SSatish Balay 
1567182d2002SSatish Balay   for (i=0; i<ncols; i++) {
15686de62eeeSBarry Smith     av = v + mat->lda*icol[i];
15692205254eSKarl Rupp     for (j=0; j<nrows; j++) *bv++ = av[irow[j]];
15700754003eSLois Curfman McInnes   }
1571182d2002SSatish Balay 
1572182d2002SSatish Balay   /* Assemble the matrices so that the correct flags are set */
15736d4a8577SBarry Smith   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
15746d4a8577SBarry Smith   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
15750754003eSLois Curfman McInnes 
15760754003eSLois Curfman McInnes   /* Free work space */
157778b31e54SBarry Smith   ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr);
157878b31e54SBarry Smith   ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr);
1579182d2002SSatish Balay   *B   = newmat;
15803a40ed3dSBarry Smith   PetscFunctionReturn(0);
15810754003eSLois Curfman McInnes }
15820754003eSLois Curfman McInnes 
15834a2ae208SSatish Balay #undef __FUNCT__
15844a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense"
158513f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[])
1586905e6a2fSBarry Smith {
15876849ba73SBarry Smith   PetscErrorCode ierr;
158813f74950SBarry Smith   PetscInt       i;
1589905e6a2fSBarry Smith 
15903a40ed3dSBarry Smith   PetscFunctionBegin;
1591905e6a2fSBarry Smith   if (scall == MAT_INITIAL_MATRIX) {
1592785e854fSJed Brown     ierr = PetscMalloc1((n+1),B);CHKERRQ(ierr);
1593905e6a2fSBarry Smith   }
1594905e6a2fSBarry Smith 
1595905e6a2fSBarry Smith   for (i=0; i<n; i++) {
15966a6a5d1dSBarry Smith     ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr);
1597905e6a2fSBarry Smith   }
15983a40ed3dSBarry Smith   PetscFunctionReturn(0);
1599905e6a2fSBarry Smith }
1600905e6a2fSBarry Smith 
16014a2ae208SSatish Balay #undef __FUNCT__
1602c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense"
1603c0aa2d19SHong Zhang PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode)
1604c0aa2d19SHong Zhang {
1605c0aa2d19SHong Zhang   PetscFunctionBegin;
1606c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1607c0aa2d19SHong Zhang }
1608c0aa2d19SHong Zhang 
1609c0aa2d19SHong Zhang #undef __FUNCT__
1610c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense"
1611c0aa2d19SHong Zhang PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode)
1612c0aa2d19SHong Zhang {
1613c0aa2d19SHong Zhang   PetscFunctionBegin;
1614c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1615c0aa2d19SHong Zhang }
1616c0aa2d19SHong Zhang 
1617c0aa2d19SHong Zhang #undef __FUNCT__
16184a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense"
1619dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str)
16204b0e389bSBarry Smith {
16214b0e389bSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data;
16226849ba73SBarry Smith   PetscErrorCode ierr;
1623d0f46423SBarry Smith   PetscInt       lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j;
16243a40ed3dSBarry Smith 
16253a40ed3dSBarry Smith   PetscFunctionBegin;
162633f4a19fSKris Buschelman   /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */
162733f4a19fSKris Buschelman   if (A->ops->copy != B->ops->copy) {
1628cb5b572fSBarry Smith     ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr);
16293a40ed3dSBarry Smith     PetscFunctionReturn(0);
16303a40ed3dSBarry Smith   }
1631e32f2f54SBarry Smith   if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)");
1632a5ce6ee0Svictorle   if (lda1>m || lda2>m) {
16330dbb7854Svictorle     for (j=0; j<n; j++) {
1634a5ce6ee0Svictorle       ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr);
1635a5ce6ee0Svictorle     }
1636a5ce6ee0Svictorle   } else {
1637d0f46423SBarry Smith     ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1638a5ce6ee0Svictorle   }
1639273d9f13SBarry Smith   PetscFunctionReturn(0);
1640273d9f13SBarry Smith }
1641273d9f13SBarry Smith 
16424a2ae208SSatish Balay #undef __FUNCT__
16434994cf47SJed Brown #define __FUNCT__ "MatSetUp_SeqDense"
16444994cf47SJed Brown PetscErrorCode MatSetUp_SeqDense(Mat A)
1645273d9f13SBarry Smith {
1646dfbe8321SBarry Smith   PetscErrorCode ierr;
1647273d9f13SBarry Smith 
1648273d9f13SBarry Smith   PetscFunctionBegin;
1649273d9f13SBarry Smith   ierr =  MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr);
16503a40ed3dSBarry Smith   PetscFunctionReturn(0);
16514b0e389bSBarry Smith }
16524b0e389bSBarry Smith 
1653284134d9SBarry Smith #undef __FUNCT__
1654ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense"
1655ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A)
1656ba337c44SJed Brown {
1657ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1658ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1659ba337c44SJed Brown   PetscScalar  *aa = a->v;
1660ba337c44SJed Brown 
1661ba337c44SJed Brown   PetscFunctionBegin;
1662ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]);
1663ba337c44SJed Brown   PetscFunctionReturn(0);
1664ba337c44SJed Brown }
1665ba337c44SJed Brown 
1666ba337c44SJed Brown #undef __FUNCT__
1667ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense"
1668ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A)
1669ba337c44SJed Brown {
1670ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1671ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1672ba337c44SJed Brown   PetscScalar  *aa = a->v;
1673ba337c44SJed Brown 
1674ba337c44SJed Brown   PetscFunctionBegin;
1675ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]);
1676ba337c44SJed Brown   PetscFunctionReturn(0);
1677ba337c44SJed Brown }
1678ba337c44SJed Brown 
1679ba337c44SJed Brown #undef __FUNCT__
1680ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense"
1681ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A)
1682ba337c44SJed Brown {
1683ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1684ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1685ba337c44SJed Brown   PetscScalar  *aa = a->v;
1686ba337c44SJed Brown 
1687ba337c44SJed Brown   PetscFunctionBegin;
1688ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]);
1689ba337c44SJed Brown   PetscFunctionReturn(0);
1690ba337c44SJed Brown }
1691284134d9SBarry Smith 
1692a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/
1693a9fe9ddaSSatish Balay #undef __FUNCT__
1694a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense"
1695a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1696a9fe9ddaSSatish Balay {
1697a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1698a9fe9ddaSSatish Balay 
1699a9fe9ddaSSatish Balay   PetscFunctionBegin;
1700a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
17013ff4c91cSHong Zhang     ierr = PetscLogEventBegin(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1702a9fe9ddaSSatish Balay     ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
17033ff4c91cSHong Zhang     ierr = PetscLogEventEnd(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1704a9fe9ddaSSatish Balay   }
17053ff4c91cSHong Zhang   ierr = PetscLogEventBegin(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1706a9fe9ddaSSatish Balay   ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
17073ff4c91cSHong Zhang   ierr = PetscLogEventEnd(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1708a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1709a9fe9ddaSSatish Balay }
1710a9fe9ddaSSatish Balay 
1711a9fe9ddaSSatish Balay #undef __FUNCT__
1712a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense"
1713a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1714a9fe9ddaSSatish Balay {
1715ee16a9a1SHong Zhang   PetscErrorCode ierr;
1716d0f46423SBarry Smith   PetscInt       m=A->rmap->n,n=B->cmap->n;
1717ee16a9a1SHong Zhang   Mat            Cmat;
1718a9fe9ddaSSatish Balay 
1719ee16a9a1SHong Zhang   PetscFunctionBegin;
1720e32f2f54SBarry 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);
1721ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1722ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1723ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
17240298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr);
1725d73949e8SHong Zhang 
1726ee16a9a1SHong Zhang   *C = Cmat;
1727ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1728ee16a9a1SHong Zhang }
1729a9fe9ddaSSatish Balay 
173098a3b096SSatish Balay #undef __FUNCT__
1731a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense"
1732a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1733a9fe9ddaSSatish Balay {
1734a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1735a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1736a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
17370805154bSBarry Smith   PetscBLASInt   m,n,k;
1738a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1739c5df96a5SBarry Smith   PetscErrorCode ierr;
1740a9fe9ddaSSatish Balay 
1741a9fe9ddaSSatish Balay   PetscFunctionBegin;
1742c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
1743c5df96a5SBarry Smith   ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr);
1744c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr);
17458b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
1746a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1747a9fe9ddaSSatish Balay }
1748a9fe9ddaSSatish Balay 
1749a9fe9ddaSSatish Balay #undef __FUNCT__
175075648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqDense_SeqDense"
175175648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1752a9fe9ddaSSatish Balay {
1753a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1754a9fe9ddaSSatish Balay 
1755a9fe9ddaSSatish Balay   PetscFunctionBegin;
1756a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
17573ff4c91cSHong Zhang     ierr = PetscLogEventBegin(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
175875648e8dSHong Zhang     ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
17593ff4c91cSHong Zhang     ierr = PetscLogEventEnd(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1760a9fe9ddaSSatish Balay   }
17613ff4c91cSHong Zhang   ierr = PetscLogEventBegin(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr);
176275648e8dSHong Zhang   ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
17633ff4c91cSHong Zhang   ierr = PetscLogEventEnd(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1764a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1765a9fe9ddaSSatish Balay }
1766a9fe9ddaSSatish Balay 
1767a9fe9ddaSSatish Balay #undef __FUNCT__
176875648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqDense_SeqDense"
176975648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1770a9fe9ddaSSatish Balay {
1771ee16a9a1SHong Zhang   PetscErrorCode ierr;
1772d0f46423SBarry Smith   PetscInt       m=A->cmap->n,n=B->cmap->n;
1773ee16a9a1SHong Zhang   Mat            Cmat;
1774a9fe9ddaSSatish Balay 
1775ee16a9a1SHong Zhang   PetscFunctionBegin;
1776e32f2f54SBarry 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);
1777ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1778ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1779ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
17800298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr);
17812205254eSKarl Rupp 
1782ee16a9a1SHong Zhang   Cmat->assembled = PETSC_TRUE;
17832205254eSKarl Rupp 
1784ee16a9a1SHong Zhang   *C = Cmat;
1785ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1786ee16a9a1SHong Zhang }
1787a9fe9ddaSSatish Balay 
1788a9fe9ddaSSatish Balay #undef __FUNCT__
178975648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqDense_SeqDense"
179075648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1791a9fe9ddaSSatish Balay {
1792a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1793a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1794a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
17950805154bSBarry Smith   PetscBLASInt   m,n,k;
1796a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1797c5df96a5SBarry Smith   PetscErrorCode ierr;
1798a9fe9ddaSSatish Balay 
1799a9fe9ddaSSatish Balay   PetscFunctionBegin;
1800c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&m);CHKERRQ(ierr);
1801c5df96a5SBarry Smith   ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr);
1802c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr);
18032fbe02b9SBarry Smith   /*
18042fbe02b9SBarry Smith      Note the m and n arguments below are the number rows and columns of A', not A!
18052fbe02b9SBarry Smith   */
18068b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
1807a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1808a9fe9ddaSSatish Balay }
1809985db425SBarry Smith 
1810985db425SBarry Smith #undef __FUNCT__
1811985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense"
1812985db425SBarry Smith PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[])
1813985db425SBarry Smith {
1814985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1815985db425SBarry Smith   PetscErrorCode ierr;
1816d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1817985db425SBarry Smith   PetscScalar    *x;
1818985db425SBarry Smith   MatScalar      *aa = a->v;
1819985db425SBarry Smith 
1820985db425SBarry Smith   PetscFunctionBegin;
1821e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1822985db425SBarry Smith 
1823985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1824985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1825985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1826e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1827985db425SBarry Smith   for (i=0; i<m; i++) {
1828985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1829985db425SBarry Smith     for (j=1; j<n; j++) {
1830985db425SBarry Smith       if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1831985db425SBarry Smith     }
1832985db425SBarry Smith   }
1833985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1834985db425SBarry Smith   PetscFunctionReturn(0);
1835985db425SBarry Smith }
1836985db425SBarry Smith 
1837985db425SBarry Smith #undef __FUNCT__
1838985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense"
1839985db425SBarry Smith PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[])
1840985db425SBarry Smith {
1841985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1842985db425SBarry Smith   PetscErrorCode ierr;
1843d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1844985db425SBarry Smith   PetscScalar    *x;
1845985db425SBarry Smith   PetscReal      atmp;
1846985db425SBarry Smith   MatScalar      *aa = a->v;
1847985db425SBarry Smith 
1848985db425SBarry Smith   PetscFunctionBegin;
1849e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1850985db425SBarry Smith 
1851985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1852985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1853985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1854e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1855985db425SBarry Smith   for (i=0; i<m; i++) {
18569189402eSHong Zhang     x[i] = PetscAbsScalar(aa[i]);
1857985db425SBarry Smith     for (j=1; j<n; j++) {
1858985db425SBarry Smith       atmp = PetscAbsScalar(aa[i+m*j]);
1859985db425SBarry Smith       if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;}
1860985db425SBarry Smith     }
1861985db425SBarry Smith   }
1862985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1863985db425SBarry Smith   PetscFunctionReturn(0);
1864985db425SBarry Smith }
1865985db425SBarry Smith 
1866985db425SBarry Smith #undef __FUNCT__
1867985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense"
1868985db425SBarry Smith PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[])
1869985db425SBarry Smith {
1870985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1871985db425SBarry Smith   PetscErrorCode ierr;
1872d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1873985db425SBarry Smith   PetscScalar    *x;
1874985db425SBarry Smith   MatScalar      *aa = a->v;
1875985db425SBarry Smith 
1876985db425SBarry Smith   PetscFunctionBegin;
1877e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1878985db425SBarry Smith 
1879985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1880985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1881985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1882e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1883985db425SBarry Smith   for (i=0; i<m; i++) {
1884985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1885985db425SBarry Smith     for (j=1; j<n; j++) {
1886985db425SBarry Smith       if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1887985db425SBarry Smith     }
1888985db425SBarry Smith   }
1889985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1890985db425SBarry Smith   PetscFunctionReturn(0);
1891985db425SBarry Smith }
1892985db425SBarry Smith 
18938d0534beSBarry Smith #undef __FUNCT__
18948d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense"
18958d0534beSBarry Smith PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col)
18968d0534beSBarry Smith {
18978d0534beSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
18988d0534beSBarry Smith   PetscErrorCode ierr;
18998d0534beSBarry Smith   PetscScalar    *x;
19008d0534beSBarry Smith 
19018d0534beSBarry Smith   PetscFunctionBegin;
1902e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
19038d0534beSBarry Smith 
19048d0534beSBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1905d0f46423SBarry Smith   ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
19068d0534beSBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
19078d0534beSBarry Smith   PetscFunctionReturn(0);
19088d0534beSBarry Smith }
19098d0534beSBarry Smith 
19100716a85fSBarry Smith 
19110716a85fSBarry Smith #undef __FUNCT__
19120716a85fSBarry Smith #define __FUNCT__ "MatGetColumnNorms_SeqDense"
19130716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms)
19140716a85fSBarry Smith {
19150716a85fSBarry Smith   PetscErrorCode ierr;
19160716a85fSBarry Smith   PetscInt       i,j,m,n;
19170716a85fSBarry Smith   PetscScalar    *a;
19180716a85fSBarry Smith 
19190716a85fSBarry Smith   PetscFunctionBegin;
19200716a85fSBarry Smith   ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr);
19210716a85fSBarry Smith   ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr);
19228c778c55SBarry Smith   ierr = MatDenseGetArray(A,&a);CHKERRQ(ierr);
19230716a85fSBarry Smith   if (type == NORM_2) {
19240716a85fSBarry Smith     for (i=0; i<n; i++) {
19250716a85fSBarry Smith       for (j=0; j<m; j++) {
19260716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]*a[j]);
19270716a85fSBarry Smith       }
19280716a85fSBarry Smith       a += m;
19290716a85fSBarry Smith     }
19300716a85fSBarry Smith   } else if (type == NORM_1) {
19310716a85fSBarry Smith     for (i=0; i<n; i++) {
19320716a85fSBarry Smith       for (j=0; j<m; j++) {
19330716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]);
19340716a85fSBarry Smith       }
19350716a85fSBarry Smith       a += m;
19360716a85fSBarry Smith     }
19370716a85fSBarry Smith   } else if (type == NORM_INFINITY) {
19380716a85fSBarry Smith     for (i=0; i<n; i++) {
19390716a85fSBarry Smith       for (j=0; j<m; j++) {
19400716a85fSBarry Smith         norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]);
19410716a85fSBarry Smith       }
19420716a85fSBarry Smith       a += m;
19430716a85fSBarry Smith     }
1944ce94432eSBarry Smith   } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType");
19458c778c55SBarry Smith   ierr = MatDenseRestoreArray(A,&a);CHKERRQ(ierr);
19460716a85fSBarry Smith   if (type == NORM_2) {
19478f1a2a5eSBarry Smith     for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]);
19480716a85fSBarry Smith   }
19490716a85fSBarry Smith   PetscFunctionReturn(0);
19500716a85fSBarry Smith }
19510716a85fSBarry Smith 
195273a71a0fSBarry Smith #undef __FUNCT__
195373a71a0fSBarry Smith #define __FUNCT__ "MatSetRandom_SeqDense"
195473a71a0fSBarry Smith static PetscErrorCode  MatSetRandom_SeqDense(Mat x,PetscRandom rctx)
195573a71a0fSBarry Smith {
195673a71a0fSBarry Smith   PetscErrorCode ierr;
195773a71a0fSBarry Smith   PetscScalar    *a;
195873a71a0fSBarry Smith   PetscInt       m,n,i;
195973a71a0fSBarry Smith 
196073a71a0fSBarry Smith   PetscFunctionBegin;
196173a71a0fSBarry Smith   ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr);
19628c778c55SBarry Smith   ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr);
196373a71a0fSBarry Smith   for (i=0; i<m*n; i++) {
196473a71a0fSBarry Smith     ierr = PetscRandomGetValue(rctx,a+i);CHKERRQ(ierr);
196573a71a0fSBarry Smith   }
19668c778c55SBarry Smith   ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr);
196773a71a0fSBarry Smith   PetscFunctionReturn(0);
196873a71a0fSBarry Smith }
196973a71a0fSBarry Smith 
197073a71a0fSBarry Smith 
1971289bc588SBarry Smith /* -------------------------------------------------------------------*/
1972a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense,
1973905e6a2fSBarry Smith                                         MatGetRow_SeqDense,
1974905e6a2fSBarry Smith                                         MatRestoreRow_SeqDense,
1975905e6a2fSBarry Smith                                         MatMult_SeqDense,
197697304618SKris Buschelman                                 /*  4*/ MatMultAdd_SeqDense,
19777c922b88SBarry Smith                                         MatMultTranspose_SeqDense,
19787c922b88SBarry Smith                                         MatMultTransposeAdd_SeqDense,
1979db4efbfdSBarry Smith                                         0,
1980db4efbfdSBarry Smith                                         0,
1981db4efbfdSBarry Smith                                         0,
1982db4efbfdSBarry Smith                                 /* 10*/ 0,
1983905e6a2fSBarry Smith                                         MatLUFactor_SeqDense,
1984905e6a2fSBarry Smith                                         MatCholeskyFactor_SeqDense,
198541f059aeSBarry Smith                                         MatSOR_SeqDense,
1986ec8511deSBarry Smith                                         MatTranspose_SeqDense,
198797304618SKris Buschelman                                 /* 15*/ MatGetInfo_SeqDense,
1988905e6a2fSBarry Smith                                         MatEqual_SeqDense,
1989905e6a2fSBarry Smith                                         MatGetDiagonal_SeqDense,
1990905e6a2fSBarry Smith                                         MatDiagonalScale_SeqDense,
1991905e6a2fSBarry Smith                                         MatNorm_SeqDense,
1992c0aa2d19SHong Zhang                                 /* 20*/ MatAssemblyBegin_SeqDense,
1993c0aa2d19SHong Zhang                                         MatAssemblyEnd_SeqDense,
1994905e6a2fSBarry Smith                                         MatSetOption_SeqDense,
1995905e6a2fSBarry Smith                                         MatZeroEntries_SeqDense,
1996d519adbfSMatthew Knepley                                 /* 24*/ MatZeroRows_SeqDense,
1997db4efbfdSBarry Smith                                         0,
1998db4efbfdSBarry Smith                                         0,
1999db4efbfdSBarry Smith                                         0,
2000db4efbfdSBarry Smith                                         0,
20014994cf47SJed Brown                                 /* 29*/ MatSetUp_SeqDense,
2002273d9f13SBarry Smith                                         0,
2003905e6a2fSBarry Smith                                         0,
200473a71a0fSBarry Smith                                         0,
200573a71a0fSBarry Smith                                         0,
2006d519adbfSMatthew Knepley                                 /* 34*/ MatDuplicate_SeqDense,
2007a5ae1ecdSBarry Smith                                         0,
2008a5ae1ecdSBarry Smith                                         0,
2009a5ae1ecdSBarry Smith                                         0,
2010a5ae1ecdSBarry Smith                                         0,
2011d519adbfSMatthew Knepley                                 /* 39*/ MatAXPY_SeqDense,
2012a5ae1ecdSBarry Smith                                         MatGetSubMatrices_SeqDense,
2013a5ae1ecdSBarry Smith                                         0,
20144b0e389bSBarry Smith                                         MatGetValues_SeqDense,
2015a5ae1ecdSBarry Smith                                         MatCopy_SeqDense,
2016d519adbfSMatthew Knepley                                 /* 44*/ MatGetRowMax_SeqDense,
2017a5ae1ecdSBarry Smith                                         MatScale_SeqDense,
2018a5ae1ecdSBarry Smith                                         0,
2019a5ae1ecdSBarry Smith                                         0,
2020a5ae1ecdSBarry Smith                                         0,
202173a71a0fSBarry Smith                                 /* 49*/ MatSetRandom_SeqDense,
2022a5ae1ecdSBarry Smith                                         0,
2023a5ae1ecdSBarry Smith                                         0,
2024a5ae1ecdSBarry Smith                                         0,
2025a5ae1ecdSBarry Smith                                         0,
2026d519adbfSMatthew Knepley                                 /* 54*/ 0,
2027a5ae1ecdSBarry Smith                                         0,
2028a5ae1ecdSBarry Smith                                         0,
2029a5ae1ecdSBarry Smith                                         0,
2030a5ae1ecdSBarry Smith                                         0,
2031d519adbfSMatthew Knepley                                 /* 59*/ 0,
2032e03a110bSBarry Smith                                         MatDestroy_SeqDense,
2033e03a110bSBarry Smith                                         MatView_SeqDense,
2034357abbc8SBarry Smith                                         0,
203597304618SKris Buschelman                                         0,
2036d519adbfSMatthew Knepley                                 /* 64*/ 0,
203797304618SKris Buschelman                                         0,
203897304618SKris Buschelman                                         0,
203997304618SKris Buschelman                                         0,
204097304618SKris Buschelman                                         0,
2041d519adbfSMatthew Knepley                                 /* 69*/ MatGetRowMaxAbs_SeqDense,
204297304618SKris Buschelman                                         0,
204397304618SKris Buschelman                                         0,
204497304618SKris Buschelman                                         0,
204597304618SKris Buschelman                                         0,
2046d519adbfSMatthew Knepley                                 /* 74*/ 0,
204797304618SKris Buschelman                                         0,
204897304618SKris Buschelman                                         0,
204997304618SKris Buschelman                                         0,
205097304618SKris Buschelman                                         0,
2051d519adbfSMatthew Knepley                                 /* 79*/ 0,
205297304618SKris Buschelman                                         0,
205397304618SKris Buschelman                                         0,
205497304618SKris Buschelman                                         0,
20555bba2384SShri Abhyankar                                 /* 83*/ MatLoad_SeqDense,
2056865e5f61SKris Buschelman                                         0,
20571cbb95d3SBarry Smith                                         MatIsHermitian_SeqDense,
2058865e5f61SKris Buschelman                                         0,
2059865e5f61SKris Buschelman                                         0,
2060865e5f61SKris Buschelman                                         0,
2061d519adbfSMatthew Knepley                                 /* 89*/ MatMatMult_SeqDense_SeqDense,
2062a9fe9ddaSSatish Balay                                         MatMatMultSymbolic_SeqDense_SeqDense,
2063a9fe9ddaSSatish Balay                                         MatMatMultNumeric_SeqDense_SeqDense,
2064865e5f61SKris Buschelman                                         0,
2065865e5f61SKris Buschelman                                         0,
2066d519adbfSMatthew Knepley                                 /* 94*/ 0,
20675df89d91SHong Zhang                                         0,
20685df89d91SHong Zhang                                         0,
20695df89d91SHong Zhang                                         0,
2070284134d9SBarry Smith                                         0,
2071d519adbfSMatthew Knepley                                 /* 99*/ 0,
2072284134d9SBarry Smith                                         0,
2073284134d9SBarry Smith                                         0,
2074ba337c44SJed Brown                                         MatConjugate_SeqDense,
2075f73d5cc4SBarry Smith                                         0,
2076ba337c44SJed Brown                                 /*104*/ 0,
2077ba337c44SJed Brown                                         MatRealPart_SeqDense,
2078ba337c44SJed Brown                                         MatImaginaryPart_SeqDense,
2079985db425SBarry Smith                                         0,
2080985db425SBarry Smith                                         0,
208185e2c93fSHong Zhang                                 /*109*/ MatMatSolve_SeqDense,
2082985db425SBarry Smith                                         0,
20838d0534beSBarry Smith                                         MatGetRowMin_SeqDense,
2084aabbc4fbSShri Abhyankar                                         MatGetColumnVector_SeqDense,
2085aabbc4fbSShri Abhyankar                                         0,
2086aabbc4fbSShri Abhyankar                                 /*114*/ 0,
2087aabbc4fbSShri Abhyankar                                         0,
2088aabbc4fbSShri Abhyankar                                         0,
2089aabbc4fbSShri Abhyankar                                         0,
2090aabbc4fbSShri Abhyankar                                         0,
2091aabbc4fbSShri Abhyankar                                 /*119*/ 0,
2092aabbc4fbSShri Abhyankar                                         0,
2093aabbc4fbSShri Abhyankar                                         0,
20940716a85fSBarry Smith                                         0,
20950716a85fSBarry Smith                                         0,
20960716a85fSBarry Smith                                 /*124*/ 0,
20975df89d91SHong Zhang                                         MatGetColumnNorms_SeqDense,
20985df89d91SHong Zhang                                         0,
20995df89d91SHong Zhang                                         0,
21005df89d91SHong Zhang                                         0,
21015df89d91SHong Zhang                                 /*129*/ 0,
210275648e8dSHong Zhang                                         MatTransposeMatMult_SeqDense_SeqDense,
210375648e8dSHong Zhang                                         MatTransposeMatMultSymbolic_SeqDense_SeqDense,
210475648e8dSHong Zhang                                         MatTransposeMatMultNumeric_SeqDense_SeqDense,
21053964eb88SJed Brown                                         0,
21063964eb88SJed Brown                                 /*134*/ 0,
21073964eb88SJed Brown                                         0,
21083964eb88SJed Brown                                         0,
21093964eb88SJed Brown                                         0,
21103964eb88SJed Brown                                         0,
21113964eb88SJed Brown                                 /*139*/ 0,
2112f9426fe0SMark Adams                                         0,
21133964eb88SJed Brown                                         0
2114985db425SBarry Smith };
211590ace30eSBarry Smith 
21164a2ae208SSatish Balay #undef __FUNCT__
21174a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense"
21184b828684SBarry Smith /*@C
2119fafbff53SBarry Smith    MatCreateSeqDense - Creates a sequential dense matrix that
2120d65003e9SLois Curfman McInnes    is stored in column major order (the usual Fortran 77 manner). Many
2121d65003e9SLois Curfman McInnes    of the matrix operations use the BLAS and LAPACK routines.
2122289bc588SBarry Smith 
2123db81eaa0SLois Curfman McInnes    Collective on MPI_Comm
2124db81eaa0SLois Curfman McInnes 
212520563c6bSBarry Smith    Input Parameters:
2126db81eaa0SLois Curfman McInnes +  comm - MPI communicator, set to PETSC_COMM_SELF
21270c775827SLois Curfman McInnes .  m - number of rows
212818f449edSLois Curfman McInnes .  n - number of columns
21290298fd71SBarry Smith -  data - optional location of matrix data in column major order.  Set data=NULL for PETSc
2130dfc5480cSLois Curfman McInnes    to control all matrix memory allocation.
213120563c6bSBarry Smith 
213220563c6bSBarry Smith    Output Parameter:
213344cd7ae7SLois Curfman McInnes .  A - the matrix
213420563c6bSBarry Smith 
2135b259b22eSLois Curfman McInnes    Notes:
213618f449edSLois Curfman McInnes    The data input variable is intended primarily for Fortran programmers
213718f449edSLois Curfman McInnes    who wish to allocate their own matrix memory space.  Most users should
21380298fd71SBarry Smith    set data=NULL.
213918f449edSLois Curfman McInnes 
2140027ccd11SLois Curfman McInnes    Level: intermediate
2141027ccd11SLois Curfman McInnes 
2142dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS
2143d65003e9SLois Curfman McInnes 
214469b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues()
214520563c6bSBarry Smith @*/
21467087cfbeSBarry Smith PetscErrorCode  MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A)
2147289bc588SBarry Smith {
2148dfbe8321SBarry Smith   PetscErrorCode ierr;
21493b2fbd54SBarry Smith 
21503a40ed3dSBarry Smith   PetscFunctionBegin;
2151f69a0ea3SMatthew Knepley   ierr = MatCreate(comm,A);CHKERRQ(ierr);
2152f69a0ea3SMatthew Knepley   ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr);
2153273d9f13SBarry Smith   ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr);
2154273d9f13SBarry Smith   ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr);
2155273d9f13SBarry Smith   PetscFunctionReturn(0);
2156273d9f13SBarry Smith }
2157273d9f13SBarry Smith 
21584a2ae208SSatish Balay #undef __FUNCT__
2159afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation"
2160273d9f13SBarry Smith /*@C
2161273d9f13SBarry Smith    MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements
2162273d9f13SBarry Smith 
2163273d9f13SBarry Smith    Collective on MPI_Comm
2164273d9f13SBarry Smith 
2165273d9f13SBarry Smith    Input Parameters:
21661c4f3114SJed Brown +  B - the matrix
21670298fd71SBarry Smith -  data - the array (or NULL)
2168273d9f13SBarry Smith 
2169273d9f13SBarry Smith    Notes:
2170273d9f13SBarry Smith    The data input variable is intended primarily for Fortran programmers
2171273d9f13SBarry Smith    who wish to allocate their own matrix memory space.  Most users should
2172284134d9SBarry Smith    need not call this routine.
2173273d9f13SBarry Smith 
2174273d9f13SBarry Smith    Level: intermediate
2175273d9f13SBarry Smith 
2176273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS
2177273d9f13SBarry Smith 
217869b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA()
2179867c911aSBarry Smith 
2180273d9f13SBarry Smith @*/
21817087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation(Mat B,PetscScalar data[])
2182273d9f13SBarry Smith {
21834ac538c5SBarry Smith   PetscErrorCode ierr;
2184a23d5eceSKris Buschelman 
2185a23d5eceSKris Buschelman   PetscFunctionBegin;
21864ac538c5SBarry Smith   ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr);
2187a23d5eceSKris Buschelman   PetscFunctionReturn(0);
2188a23d5eceSKris Buschelman }
2189a23d5eceSKris Buschelman 
2190a23d5eceSKris Buschelman #undef __FUNCT__
2191afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense"
21927087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data)
2193a23d5eceSKris Buschelman {
2194273d9f13SBarry Smith   Mat_SeqDense   *b;
2195dfbe8321SBarry Smith   PetscErrorCode ierr;
2196273d9f13SBarry Smith 
2197273d9f13SBarry Smith   PetscFunctionBegin;
2198273d9f13SBarry Smith   B->preallocated = PETSC_TRUE;
2199a868139aSShri Abhyankar 
220034ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr);
220134ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr);
220234ef9618SShri Abhyankar 
2203273d9f13SBarry Smith   b       = (Mat_SeqDense*)B->data;
220486d161a7SShri Abhyankar   b->Mmax = B->rmap->n;
220586d161a7SShri Abhyankar   b->Nmax = B->cmap->n;
220686d161a7SShri Abhyankar   if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n;
220786d161a7SShri Abhyankar 
22089e8f95c4SLisandro Dalcin   if (!data) { /* petsc-allocated storage */
22099e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2210e92229d0SSatish Balay     ierr = PetscCalloc1((size_t)b->lda*b->Nmax,&b->v);CHKERRQ(ierr);
22113bb1ff40SBarry Smith     ierr = PetscLogObjectMemory((PetscObject)B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
22122205254eSKarl Rupp 
22139e8f95c4SLisandro Dalcin     b->user_alloc = PETSC_FALSE;
2214273d9f13SBarry Smith   } else { /* user-allocated storage */
22159e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2216273d9f13SBarry Smith     b->v          = data;
2217273d9f13SBarry Smith     b->user_alloc = PETSC_TRUE;
2218273d9f13SBarry Smith   }
22190450473dSBarry Smith   B->assembled = PETSC_TRUE;
2220273d9f13SBarry Smith   PetscFunctionReturn(0);
2221273d9f13SBarry Smith }
2222273d9f13SBarry Smith 
22231b807ce4Svictorle #undef __FUNCT__
22248baccfbdSHong Zhang #define __FUNCT__ "MatConvert_SeqDense_Elemental"
22258baccfbdSHong Zhang PETSC_EXTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat)
22268baccfbdSHong Zhang {
22278baccfbdSHong Zhang   PetscFunctionBegin;
22288baccfbdSHong Zhang   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for requested operation");
22298baccfbdSHong Zhang   PetscFunctionReturn(0);
22308baccfbdSHong Zhang }
22318baccfbdSHong Zhang 
22328baccfbdSHong Zhang #undef __FUNCT__
22331b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA"
22341b807ce4Svictorle /*@C
22351b807ce4Svictorle   MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array
22361b807ce4Svictorle 
22371b807ce4Svictorle   Input parameter:
22381b807ce4Svictorle + A - the matrix
22391b807ce4Svictorle - lda - the leading dimension
22401b807ce4Svictorle 
22411b807ce4Svictorle   Notes:
2242867c911aSBarry Smith   This routine is to be used in conjunction with MatSeqDenseSetPreallocation();
22431b807ce4Svictorle   it asserts that the preallocation has a leading dimension (the LDA parameter
22441b807ce4Svictorle   of Blas and Lapack fame) larger than M, the first dimension of the matrix.
22451b807ce4Svictorle 
22461b807ce4Svictorle   Level: intermediate
22471b807ce4Svictorle 
22481b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS
22491b807ce4Svictorle 
2250284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize()
2251867c911aSBarry Smith 
22521b807ce4Svictorle @*/
22537087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetLDA(Mat B,PetscInt lda)
22541b807ce4Svictorle {
22551b807ce4Svictorle   Mat_SeqDense *b = (Mat_SeqDense*)B->data;
225621a2c019SBarry Smith 
22571b807ce4Svictorle   PetscFunctionBegin;
2258e32f2f54SBarry 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);
22591b807ce4Svictorle   b->lda       = lda;
226021a2c019SBarry Smith   b->changelda = PETSC_FALSE;
226121a2c019SBarry Smith   b->Mmax      = PetscMax(b->Mmax,lda);
22621b807ce4Svictorle   PetscFunctionReturn(0);
22631b807ce4Svictorle }
22641b807ce4Svictorle 
22650bad9183SKris Buschelman /*MC
2266fafad747SKris Buschelman    MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices.
22670bad9183SKris Buschelman 
22680bad9183SKris Buschelman    Options Database Keys:
22690bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions()
22700bad9183SKris Buschelman 
22710bad9183SKris Buschelman   Level: beginner
22720bad9183SKris Buschelman 
227389665df3SBarry Smith .seealso: MatCreateSeqDense()
227489665df3SBarry Smith 
22750bad9183SKris Buschelman M*/
22760bad9183SKris Buschelman 
22774a2ae208SSatish Balay #undef __FUNCT__
22784a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense"
22798cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatCreate_SeqDense(Mat B)
2280273d9f13SBarry Smith {
2281273d9f13SBarry Smith   Mat_SeqDense   *b;
2282dfbe8321SBarry Smith   PetscErrorCode ierr;
22837c334f02SBarry Smith   PetscMPIInt    size;
2284273d9f13SBarry Smith 
2285273d9f13SBarry Smith   PetscFunctionBegin;
2286ce94432eSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr);
2287e32f2f54SBarry Smith   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1");
228855659b69SBarry Smith 
2289b00a9115SJed Brown   ierr    = PetscNewLog(B,&b);CHKERRQ(ierr);
2290549d3d68SSatish Balay   ierr    = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr);
229144cd7ae7SLois Curfman McInnes   B->data = (void*)b;
229218f449edSLois Curfman McInnes 
229344cd7ae7SLois Curfman McInnes   b->pivots      = 0;
2294273d9f13SBarry Smith   b->roworiented = PETSC_TRUE;
2295273d9f13SBarry Smith   b->v           = 0;
229621a2c019SBarry Smith   b->changelda   = PETSC_FALSE;
22974e220ebcSLois Curfman McInnes 
2298bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr);
2299bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr);
2300bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr);
23018baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
23028baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr);
23038baccfbdSHong Zhang #endif
2304bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatGetFactor_petsc_C",MatGetFactor_seqdense_petsc);CHKERRQ(ierr);
2305bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr);
2306bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaij_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
2307bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
2308bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
23093bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaij_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
23103bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
23113bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaij_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
231217667f90SBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr);
23133a40ed3dSBarry Smith   PetscFunctionReturn(0);
2314289bc588SBarry Smith }
2315