xref: /petsc/src/mat/impls/dense/seq/dense.c (revision c98fd787ce49cfe1bba58d59168f91d3fdf7ec65)
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;
207f1ceaac6SMatthew G. Knepley   const PetscScalar *x;
208f1ceaac6SMatthew G. Knepley   PetscScalar       *y;
209c5df96a5SBarry Smith   PetscBLASInt      one = 1,info,m;
21067e560aaSBarry Smith 
2113a40ed3dSBarry Smith   PetscFunctionBegin;
212c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
213f1ceaac6SMatthew G. Knepley   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
2141ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
215d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
216d5f3da31SBarry Smith   if (A->factortype == MAT_FACTOR_LU) {
217ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
218e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
219ae7cfcebSSatish Balay #else
2208b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
221e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
222ae7cfcebSSatish Balay #endif
223d5f3da31SBarry Smith   } else if (A->factortype == MAT_FACTOR_CHOLESKY) {
224ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
225e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
226ae7cfcebSSatish Balay #else
2278b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
228e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
229ae7cfcebSSatish Balay #endif
2302205254eSKarl Rupp   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
231f1ceaac6SMatthew G. Knepley   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
2321ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
233dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
2343a40ed3dSBarry Smith   PetscFunctionReturn(0);
235289bc588SBarry Smith }
2366ee01492SSatish Balay 
2374a2ae208SSatish Balay #undef __FUNCT__
23885e2c93fSHong Zhang #define __FUNCT__ "MatMatSolve_SeqDense"
23985e2c93fSHong Zhang PetscErrorCode MatMatSolve_SeqDense(Mat A,Mat B,Mat X)
24085e2c93fSHong Zhang {
24185e2c93fSHong Zhang   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
24285e2c93fSHong Zhang   PetscErrorCode ierr;
24385e2c93fSHong Zhang   PetscScalar    *b,*x;
244efb80c78SLisandro Dalcin   PetscInt       n;
245783b601eSJed Brown   PetscBLASInt   nrhs,info,m;
246bda8bf91SBarry Smith   PetscBool      flg;
24785e2c93fSHong Zhang 
24885e2c93fSHong Zhang   PetscFunctionBegin;
249c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
2500298fd71SBarry Smith   ierr = PetscObjectTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr);
251ce94432eSBarry Smith   if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix B must be MATDENSE matrix");
2520298fd71SBarry Smith   ierr = PetscObjectTypeCompareAny((PetscObject)X,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr);
253ce94432eSBarry Smith   if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix X must be MATDENSE matrix");
254bda8bf91SBarry Smith 
2550298fd71SBarry Smith   ierr = MatGetSize(B,NULL,&n);CHKERRQ(ierr);
256c5df96a5SBarry Smith   ierr = PetscBLASIntCast(n,&nrhs);CHKERRQ(ierr);
2578c778c55SBarry Smith   ierr = MatDenseGetArray(B,&b);CHKERRQ(ierr);
2588c778c55SBarry Smith   ierr = MatDenseGetArray(X,&x);CHKERRQ(ierr);
25985e2c93fSHong Zhang 
260f272c775SHong Zhang   ierr = PetscMemcpy(x,b,m*nrhs*sizeof(PetscScalar));CHKERRQ(ierr);
26185e2c93fSHong Zhang 
26285e2c93fSHong Zhang   if (A->factortype == MAT_FACTOR_LU) {
26385e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_GETRS)
26485e2c93fSHong Zhang     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
26585e2c93fSHong Zhang #else
2668b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info));
26785e2c93fSHong Zhang     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
26885e2c93fSHong Zhang #endif
26985e2c93fSHong Zhang   } else if (A->factortype == MAT_FACTOR_CHOLESKY) {
27085e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_POTRS)
27185e2c93fSHong Zhang     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
27285e2c93fSHong Zhang #else
2738b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info));
27485e2c93fSHong Zhang     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
27585e2c93fSHong Zhang #endif
2762205254eSKarl Rupp   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
27785e2c93fSHong Zhang 
2788c778c55SBarry Smith   ierr = MatDenseRestoreArray(B,&b);CHKERRQ(ierr);
2798c778c55SBarry Smith   ierr = MatDenseRestoreArray(X,&x);CHKERRQ(ierr);
28085e2c93fSHong Zhang   ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr);
28185e2c93fSHong Zhang   PetscFunctionReturn(0);
28285e2c93fSHong Zhang }
28385e2c93fSHong Zhang 
28485e2c93fSHong Zhang #undef __FUNCT__
2854a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense"
286dfbe8321SBarry Smith PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy)
287da3a660dSBarry Smith {
288c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
289dfbe8321SBarry Smith   PetscErrorCode    ierr;
290f1ceaac6SMatthew G. Knepley   const PetscScalar *x;
291f1ceaac6SMatthew G. Knepley   PetscScalar       *y;
292c5df96a5SBarry Smith   PetscBLASInt      one = 1,info,m;
29367e560aaSBarry Smith 
2943a40ed3dSBarry Smith   PetscFunctionBegin;
295c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
296f1ceaac6SMatthew G. Knepley   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
2971ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
298d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
299752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
300da3a660dSBarry Smith   if (mat->pivots) {
301ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
302e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
303ae7cfcebSSatish Balay #else
3048b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
305e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve");
306ae7cfcebSSatish Balay #endif
3077a97a34bSBarry Smith   } else {
308ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
309e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
310ae7cfcebSSatish Balay #else
3118b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
312e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve");
313ae7cfcebSSatish Balay #endif
314da3a660dSBarry Smith   }
315f1ceaac6SMatthew G. Knepley   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
3161ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
317dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
3183a40ed3dSBarry Smith   PetscFunctionReturn(0);
319da3a660dSBarry Smith }
3206ee01492SSatish Balay 
3214a2ae208SSatish Balay #undef __FUNCT__
3224a2ae208SSatish Balay #define __FUNCT__ "MatSolveAdd_SeqDense"
323dfbe8321SBarry Smith PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
324da3a660dSBarry Smith {
325c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
326dfbe8321SBarry Smith   PetscErrorCode    ierr;
327f1ceaac6SMatthew G. Knepley   const PetscScalar *x;
328f1ceaac6SMatthew G. Knepley   PetscScalar       *y,sone = 1.0;
329da3a660dSBarry Smith   Vec               tmp = 0;
330c5df96a5SBarry Smith   PetscBLASInt      one = 1,info,m;
33167e560aaSBarry Smith 
3323a40ed3dSBarry Smith   PetscFunctionBegin;
333c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
334f1ceaac6SMatthew G. Knepley   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
3351ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
336d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
337da3a660dSBarry Smith   if (yy == zz) {
33878b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
3393bb1ff40SBarry Smith     ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr);
34078b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
341da3a660dSBarry Smith   }
342d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
343752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
344da3a660dSBarry Smith   if (mat->pivots) {
345ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
346e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
347ae7cfcebSSatish Balay #else
3488b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
349e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
350ae7cfcebSSatish Balay #endif
351a8c6a408SBarry Smith   } else {
352ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
353e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
354ae7cfcebSSatish Balay #else
3558b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
356e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
357ae7cfcebSSatish Balay #endif
358da3a660dSBarry Smith   }
3596bf464f9SBarry Smith   if (tmp) {
3606bf464f9SBarry Smith     ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr);
3616bf464f9SBarry Smith     ierr = VecDestroy(&tmp);CHKERRQ(ierr);
3626bf464f9SBarry Smith   } else {
3636bf464f9SBarry Smith     ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);
3646bf464f9SBarry Smith   }
365f1ceaac6SMatthew G. Knepley   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
3661ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
367dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
3683a40ed3dSBarry Smith   PetscFunctionReturn(0);
369da3a660dSBarry Smith }
37067e560aaSBarry Smith 
3714a2ae208SSatish Balay #undef __FUNCT__
3724a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense"
373dfbe8321SBarry Smith PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
374da3a660dSBarry Smith {
375c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
3766849ba73SBarry Smith   PetscErrorCode    ierr;
377f1ceaac6SMatthew G. Knepley   const PetscScalar *x;
378f1ceaac6SMatthew G. Knepley   PetscScalar       *y,sone = 1.0;
379da3a660dSBarry Smith   Vec               tmp;
380c5df96a5SBarry Smith   PetscBLASInt      one = 1,info,m;
38167e560aaSBarry Smith 
3823a40ed3dSBarry Smith   PetscFunctionBegin;
383c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
384d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
385f1ceaac6SMatthew G. Knepley   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
3861ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
387da3a660dSBarry Smith   if (yy == zz) {
38878b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
3893bb1ff40SBarry Smith     ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr);
39078b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
391da3a660dSBarry Smith   }
392d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
393752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
394da3a660dSBarry Smith   if (mat->pivots) {
395ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
396e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
397ae7cfcebSSatish Balay #else
3988b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
399e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
400ae7cfcebSSatish Balay #endif
4013a40ed3dSBarry Smith   } else {
402ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
403e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
404ae7cfcebSSatish Balay #else
4058b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
406e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
407ae7cfcebSSatish Balay #endif
408da3a660dSBarry Smith   }
40990f02eecSBarry Smith   if (tmp) {
4102dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr);
4116bf464f9SBarry Smith     ierr = VecDestroy(&tmp);CHKERRQ(ierr);
4123a40ed3dSBarry Smith   } else {
4132dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);
41490f02eecSBarry Smith   }
415f1ceaac6SMatthew G. Knepley   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
4161ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
417dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
4183a40ed3dSBarry Smith   PetscFunctionReturn(0);
419da3a660dSBarry Smith }
420db4efbfdSBarry Smith 
421db4efbfdSBarry Smith /* ---------------------------------------------------------------*/
422db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots,
423db4efbfdSBarry Smith    rather than put it in the Mat->row slot.*/
424db4efbfdSBarry Smith #undef __FUNCT__
425db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactor_SeqDense"
4260481f469SBarry Smith PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo)
427db4efbfdSBarry Smith {
428db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF)
429db4efbfdSBarry Smith   PetscFunctionBegin;
430e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable.");
431db4efbfdSBarry Smith #else
432db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
433db4efbfdSBarry Smith   PetscErrorCode ierr;
434db4efbfdSBarry Smith   PetscBLASInt   n,m,info;
435db4efbfdSBarry Smith 
436db4efbfdSBarry Smith   PetscFunctionBegin;
437c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
438c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
439db4efbfdSBarry Smith   if (!mat->pivots) {
440854ce69bSBarry Smith     ierr = PetscMalloc1(A->rmap->n+1,&mat->pivots);CHKERRQ(ierr);
4413bb1ff40SBarry Smith     ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr);
442db4efbfdSBarry Smith   }
443db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
4448e57ea43SSatish Balay   ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
4458b83055fSJed Brown   PetscStackCallBLAS("LAPACKgetrf",LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info));
4468e57ea43SSatish Balay   ierr = PetscFPTrapPop();CHKERRQ(ierr);
4478e57ea43SSatish Balay 
448e32f2f54SBarry Smith   if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization");
449e32f2f54SBarry Smith   if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization");
450db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
451db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
452db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
453db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
454d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_LU;
455db4efbfdSBarry Smith 
456dc0b31edSSatish Balay   ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr);
457db4efbfdSBarry Smith #endif
458db4efbfdSBarry Smith   PetscFunctionReturn(0);
459db4efbfdSBarry Smith }
460db4efbfdSBarry Smith 
461db4efbfdSBarry Smith #undef __FUNCT__
462db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactor_SeqDense"
4630481f469SBarry Smith PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo)
464db4efbfdSBarry Smith {
465db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF)
466db4efbfdSBarry Smith   PetscFunctionBegin;
467e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable.");
468db4efbfdSBarry Smith #else
469db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
470db4efbfdSBarry Smith   PetscErrorCode ierr;
471c5df96a5SBarry Smith   PetscBLASInt   info,n;
472db4efbfdSBarry Smith 
473db4efbfdSBarry Smith   PetscFunctionBegin;
474c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
475db4efbfdSBarry Smith   ierr = PetscFree(mat->pivots);CHKERRQ(ierr);
476db4efbfdSBarry Smith 
477db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
4788b83055fSJed Brown   PetscStackCallBLAS("LAPACKpotrf",LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info));
479e32f2f54SBarry Smith   if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1);
480db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
481db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
482db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
483db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
484d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_CHOLESKY;
4852205254eSKarl Rupp 
486dc0b31edSSatish Balay   ierr = PetscLogFlops((A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr);
487db4efbfdSBarry Smith #endif
488db4efbfdSBarry Smith   PetscFunctionReturn(0);
489db4efbfdSBarry Smith }
490db4efbfdSBarry Smith 
491db4efbfdSBarry Smith 
492db4efbfdSBarry Smith #undef __FUNCT__
493db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense"
4940481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
495db4efbfdSBarry Smith {
496db4efbfdSBarry Smith   PetscErrorCode ierr;
497db4efbfdSBarry Smith   MatFactorInfo  info;
498db4efbfdSBarry Smith 
499db4efbfdSBarry Smith   PetscFunctionBegin;
500db4efbfdSBarry Smith   info.fill = 1.0;
5012205254eSKarl Rupp 
502c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
503719d5645SBarry Smith   ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr);
504db4efbfdSBarry Smith   PetscFunctionReturn(0);
505db4efbfdSBarry Smith }
506db4efbfdSBarry Smith 
507db4efbfdSBarry Smith #undef __FUNCT__
508db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense"
5090481f469SBarry Smith PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info)
510db4efbfdSBarry Smith {
511db4efbfdSBarry Smith   PetscFunctionBegin;
512c3ef05f6SHong Zhang   fact->assembled                  = PETSC_TRUE;
5131bbcc794SSatish Balay   fact->preallocated               = PETSC_TRUE;
514719d5645SBarry Smith   fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense;
515db4efbfdSBarry Smith   PetscFunctionReturn(0);
516db4efbfdSBarry Smith }
517db4efbfdSBarry Smith 
518db4efbfdSBarry Smith #undef __FUNCT__
519db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactorSymbolic_SeqDense"
5200481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info)
521db4efbfdSBarry Smith {
522db4efbfdSBarry Smith   PetscFunctionBegin;
523b66fe19dSMatthew G Knepley   fact->preallocated         = PETSC_TRUE;
524c3ef05f6SHong Zhang   fact->assembled            = PETSC_TRUE;
525719d5645SBarry Smith   fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense;
526db4efbfdSBarry Smith   PetscFunctionReturn(0);
527db4efbfdSBarry Smith }
528db4efbfdSBarry Smith 
529db4efbfdSBarry Smith #undef __FUNCT__
530db4efbfdSBarry Smith #define __FUNCT__ "MatGetFactor_seqdense_petsc"
5318cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact)
532db4efbfdSBarry Smith {
533db4efbfdSBarry Smith   PetscErrorCode ierr;
534db4efbfdSBarry Smith 
535db4efbfdSBarry Smith   PetscFunctionBegin;
536ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),fact);CHKERRQ(ierr);
537db4efbfdSBarry Smith   ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
538db4efbfdSBarry Smith   ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr);
539db4efbfdSBarry Smith   if (ftype == MAT_FACTOR_LU) {
540db4efbfdSBarry Smith     (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense;
541db4efbfdSBarry Smith   } else {
542db4efbfdSBarry Smith     (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense;
543db4efbfdSBarry Smith   }
544d5f3da31SBarry Smith   (*fact)->factortype = ftype;
545db4efbfdSBarry Smith   PetscFunctionReturn(0);
546db4efbfdSBarry Smith }
547db4efbfdSBarry Smith 
548289bc588SBarry Smith /* ------------------------------------------------------------------*/
5494a2ae208SSatish Balay #undef __FUNCT__
55041f059aeSBarry Smith #define __FUNCT__ "MatSOR_SeqDense"
55141f059aeSBarry Smith PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx)
552289bc588SBarry Smith {
553c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
554d9ca1df4SBarry Smith   PetscScalar       *x,*v = mat->v,zero = 0.0,xt;
555d9ca1df4SBarry Smith   const PetscScalar *b;
556dfbe8321SBarry Smith   PetscErrorCode    ierr;
557d0f46423SBarry Smith   PetscInt          m = A->rmap->n,i;
558c5df96a5SBarry Smith   PetscBLASInt      o = 1,bm;
559289bc588SBarry Smith 
5603a40ed3dSBarry Smith   PetscFunctionBegin;
561c5df96a5SBarry Smith   ierr = PetscBLASIntCast(m,&bm);CHKERRQ(ierr);
562289bc588SBarry Smith   if (flag & SOR_ZERO_INITIAL_GUESS) {
56371044d3cSBarry Smith     /* this is a hack fix, should have another version without the second BLASdot */
5642dcb1b2aSMatthew Knepley     ierr = VecSet(xx,zero);CHKERRQ(ierr);
565289bc588SBarry Smith   }
5661ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
567d9ca1df4SBarry Smith   ierr = VecGetArrayRead(bb,&b);CHKERRQ(ierr);
568b965ef7fSBarry Smith   its  = its*lits;
569e32f2f54SBarry 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);
570289bc588SBarry Smith   while (its--) {
571fccaa45eSBarry Smith     if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) {
572289bc588SBarry Smith       for (i=0; i<m; i++) {
5738b83055fSJed Brown         PetscStackCallBLAS("BLASdot",xt   = b[i] - BLASdot_(&bm,v+i,&bm,x,&o));
57455a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
575289bc588SBarry Smith       }
576289bc588SBarry Smith     }
577fccaa45eSBarry Smith     if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) {
578289bc588SBarry Smith       for (i=m-1; i>=0; i--) {
5798b83055fSJed Brown         PetscStackCallBLAS("BLASdot",xt   = b[i] - BLASdot_(&bm,v+i,&bm,x,&o));
58055a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
581289bc588SBarry Smith       }
582289bc588SBarry Smith     }
583289bc588SBarry Smith   }
584d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(bb,&b);CHKERRQ(ierr);
5851ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
5863a40ed3dSBarry Smith   PetscFunctionReturn(0);
587289bc588SBarry Smith }
588289bc588SBarry Smith 
589289bc588SBarry Smith /* -----------------------------------------------------------------*/
5904a2ae208SSatish Balay #undef __FUNCT__
5914a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense"
592dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy)
593289bc588SBarry Smith {
594c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
595d9ca1df4SBarry Smith   const PetscScalar *v   = mat->v,*x;
596d9ca1df4SBarry Smith   PetscScalar       *y;
597dfbe8321SBarry Smith   PetscErrorCode    ierr;
5980805154bSBarry Smith   PetscBLASInt      m, n,_One=1;
599ea709b57SSatish Balay   PetscScalar       _DOne=1.0,_DZero=0.0;
6003a40ed3dSBarry Smith 
6013a40ed3dSBarry Smith   PetscFunctionBegin;
602c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
603c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
604d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
605d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
6061ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
6078b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One));
608d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
6091ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
610dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
6113a40ed3dSBarry Smith   PetscFunctionReturn(0);
612289bc588SBarry Smith }
613800995b7SMatthew Knepley 
6144a2ae208SSatish Balay #undef __FUNCT__
6154a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense"
616dfbe8321SBarry Smith PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy)
617289bc588SBarry Smith {
618c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
619d9ca1df4SBarry Smith   PetscScalar       *y,_DOne=1.0,_DZero=0.0;
620dfbe8321SBarry Smith   PetscErrorCode    ierr;
6210805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
622d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
6233a40ed3dSBarry Smith 
6243a40ed3dSBarry Smith   PetscFunctionBegin;
625c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
626c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
627d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
628d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
6291ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
6308b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One));
631d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
6321ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
633dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr);
6343a40ed3dSBarry Smith   PetscFunctionReturn(0);
635289bc588SBarry Smith }
6366ee01492SSatish Balay 
6374a2ae208SSatish Balay #undef __FUNCT__
6384a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense"
639dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
640289bc588SBarry Smith {
641c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
642d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
643d9ca1df4SBarry Smith   PetscScalar       *y,_DOne=1.0;
644dfbe8321SBarry Smith   PetscErrorCode    ierr;
6450805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
6463a40ed3dSBarry Smith 
6473a40ed3dSBarry Smith   PetscFunctionBegin;
648c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
649c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
650d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
651600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
652d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
6531ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
6548b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
655d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
6561ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
657dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
6583a40ed3dSBarry Smith   PetscFunctionReturn(0);
659289bc588SBarry Smith }
6606ee01492SSatish Balay 
6614a2ae208SSatish Balay #undef __FUNCT__
6624a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense"
663dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
664289bc588SBarry Smith {
665c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
666d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
667d9ca1df4SBarry Smith   PetscScalar       *y;
668dfbe8321SBarry Smith   PetscErrorCode    ierr;
6690805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
67087828ca2SBarry Smith   PetscScalar       _DOne=1.0;
6713a40ed3dSBarry Smith 
6723a40ed3dSBarry Smith   PetscFunctionBegin;
673c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
674c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
675d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
676600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
677d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
6781ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
6798b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
680d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
6811ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
682dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
6833a40ed3dSBarry Smith   PetscFunctionReturn(0);
684289bc588SBarry Smith }
685289bc588SBarry Smith 
686289bc588SBarry Smith /* -----------------------------------------------------------------*/
6874a2ae208SSatish Balay #undef __FUNCT__
6884a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense"
68913f74950SBarry Smith PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
690289bc588SBarry Smith {
691c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
69287828ca2SBarry Smith   PetscScalar    *v;
6936849ba73SBarry Smith   PetscErrorCode ierr;
69413f74950SBarry Smith   PetscInt       i;
69567e560aaSBarry Smith 
6963a40ed3dSBarry Smith   PetscFunctionBegin;
697d0f46423SBarry Smith   *ncols = A->cmap->n;
698289bc588SBarry Smith   if (cols) {
699854ce69bSBarry Smith     ierr = PetscMalloc1(A->cmap->n+1,cols);CHKERRQ(ierr);
700d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) (*cols)[i] = i;
701289bc588SBarry Smith   }
702289bc588SBarry Smith   if (vals) {
703854ce69bSBarry Smith     ierr = PetscMalloc1(A->cmap->n+1,vals);CHKERRQ(ierr);
704289bc588SBarry Smith     v    = mat->v + row;
705d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;}
706289bc588SBarry Smith   }
7073a40ed3dSBarry Smith   PetscFunctionReturn(0);
708289bc588SBarry Smith }
7096ee01492SSatish Balay 
7104a2ae208SSatish Balay #undef __FUNCT__
7114a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense"
71213f74950SBarry Smith PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
713289bc588SBarry Smith {
714dfbe8321SBarry Smith   PetscErrorCode ierr;
7156e111a19SKarl Rupp 
716606d414cSSatish Balay   PetscFunctionBegin;
717606d414cSSatish Balay   if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);}
718606d414cSSatish Balay   if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); }
7193a40ed3dSBarry Smith   PetscFunctionReturn(0);
720289bc588SBarry Smith }
721289bc588SBarry Smith /* ----------------------------------------------------------------*/
7224a2ae208SSatish Balay #undef __FUNCT__
7234a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense"
72413f74950SBarry Smith PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv)
725289bc588SBarry Smith {
726c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
72713f74950SBarry Smith   PetscInt     i,j,idx=0;
728d6dfbf8fSBarry Smith 
7293a40ed3dSBarry Smith   PetscFunctionBegin;
730289bc588SBarry Smith   if (!mat->roworiented) {
731dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
732289bc588SBarry Smith       for (j=0; j<n; j++) {
733cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
7342515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
735e32f2f54SBarry 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);
73658804f6dSBarry Smith #endif
737289bc588SBarry Smith         for (i=0; i<m; i++) {
738cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
7392515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
740e32f2f54SBarry 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);
74158804f6dSBarry Smith #endif
742cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
743289bc588SBarry Smith         }
744289bc588SBarry Smith       }
7453a40ed3dSBarry Smith     } else {
746289bc588SBarry Smith       for (j=0; j<n; j++) {
747cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
7482515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
749e32f2f54SBarry 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);
75058804f6dSBarry Smith #endif
751289bc588SBarry Smith         for (i=0; i<m; i++) {
752cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
7532515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
754e32f2f54SBarry 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);
75558804f6dSBarry Smith #endif
756cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
757289bc588SBarry Smith         }
758289bc588SBarry Smith       }
759289bc588SBarry Smith     }
7603a40ed3dSBarry Smith   } else {
761dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
762e8d4e0b9SBarry Smith       for (i=0; i<m; i++) {
763cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
7642515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
765e32f2f54SBarry 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);
76658804f6dSBarry Smith #endif
767e8d4e0b9SBarry Smith         for (j=0; j<n; j++) {
768cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
7692515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
770e32f2f54SBarry 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);
77158804f6dSBarry Smith #endif
772cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
773e8d4e0b9SBarry Smith         }
774e8d4e0b9SBarry Smith       }
7753a40ed3dSBarry Smith     } else {
776289bc588SBarry Smith       for (i=0; i<m; i++) {
777cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
7782515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
779e32f2f54SBarry Smith         if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
78058804f6dSBarry Smith #endif
781289bc588SBarry Smith         for (j=0; j<n; j++) {
782cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
7832515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
784e32f2f54SBarry 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);
78558804f6dSBarry Smith #endif
786cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
787289bc588SBarry Smith         }
788289bc588SBarry Smith       }
789289bc588SBarry Smith     }
790e8d4e0b9SBarry Smith   }
7913a40ed3dSBarry Smith   PetscFunctionReturn(0);
792289bc588SBarry Smith }
793e8d4e0b9SBarry Smith 
7944a2ae208SSatish Balay #undef __FUNCT__
7954a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense"
79613f74950SBarry Smith PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[])
797ae80bb75SLois Curfman McInnes {
798ae80bb75SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
79913f74950SBarry Smith   PetscInt     i,j;
800ae80bb75SLois Curfman McInnes 
8013a40ed3dSBarry Smith   PetscFunctionBegin;
802ae80bb75SLois Curfman McInnes   /* row-oriented output */
803ae80bb75SLois Curfman McInnes   for (i=0; i<m; i++) {
80497e567efSBarry Smith     if (indexm[i] < 0) {v += n;continue;}
805e32f2f54SBarry 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);
806ae80bb75SLois Curfman McInnes     for (j=0; j<n; j++) {
8076f31f424SBarry Smith       if (indexn[j] < 0) {v++; continue;}
808e32f2f54SBarry 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);
80997e567efSBarry Smith       *v++ = mat->v[indexn[j]*mat->lda + indexm[i]];
810ae80bb75SLois Curfman McInnes     }
811ae80bb75SLois Curfman McInnes   }
8123a40ed3dSBarry Smith   PetscFunctionReturn(0);
813ae80bb75SLois Curfman McInnes }
814ae80bb75SLois Curfman McInnes 
815289bc588SBarry Smith /* -----------------------------------------------------------------*/
816289bc588SBarry Smith 
8174a2ae208SSatish Balay #undef __FUNCT__
8185bba2384SShri Abhyankar #define __FUNCT__ "MatLoad_SeqDense"
819112444f4SShri Abhyankar PetscErrorCode MatLoad_SeqDense(Mat newmat,PetscViewer viewer)
820aabbc4fbSShri Abhyankar {
821aabbc4fbSShri Abhyankar   Mat_SeqDense   *a;
822aabbc4fbSShri Abhyankar   PetscErrorCode ierr;
823aabbc4fbSShri Abhyankar   PetscInt       *scols,i,j,nz,header[4];
824aabbc4fbSShri Abhyankar   int            fd;
825aabbc4fbSShri Abhyankar   PetscMPIInt    size;
826aabbc4fbSShri Abhyankar   PetscInt       *rowlengths = 0,M,N,*cols,grows,gcols;
827aabbc4fbSShri Abhyankar   PetscScalar    *vals,*svals,*v,*w;
828ce94432eSBarry Smith   MPI_Comm       comm;
829aabbc4fbSShri Abhyankar 
830aabbc4fbSShri Abhyankar   PetscFunctionBegin;
831*c98fd787SBarry Smith   /* force binary viewer to load .info file if it has not yet done so */
832*c98fd787SBarry Smith   ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr);
833ce94432eSBarry Smith   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
834aabbc4fbSShri Abhyankar   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
835aabbc4fbSShri Abhyankar   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor");
836aabbc4fbSShri Abhyankar   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
837aabbc4fbSShri Abhyankar   ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr);
838aabbc4fbSShri Abhyankar   if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object");
839aabbc4fbSShri Abhyankar   M = header[1]; N = header[2]; nz = header[3];
840aabbc4fbSShri Abhyankar 
841aabbc4fbSShri Abhyankar   /* set global size if not set already*/
842aabbc4fbSShri Abhyankar   if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) {
843aabbc4fbSShri Abhyankar     ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr);
844aabbc4fbSShri Abhyankar   } else {
845aabbc4fbSShri Abhyankar     /* if sizes and type are already set, check if the vector global sizes are correct */
846aabbc4fbSShri Abhyankar     ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr);
847aabbc4fbSShri 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);
848aabbc4fbSShri Abhyankar   }
8490298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr);
850aabbc4fbSShri Abhyankar 
851aabbc4fbSShri Abhyankar   if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */
852aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
853aabbc4fbSShri Abhyankar     v = a->v;
854aabbc4fbSShri Abhyankar     /* Allocate some temp space to read in the values and then flip them
855aabbc4fbSShri Abhyankar        from row major to column major */
856854ce69bSBarry Smith     ierr = PetscMalloc1(M*N > 0 ? M*N : 1,&w);CHKERRQ(ierr);
857aabbc4fbSShri Abhyankar     /* read in nonzero values */
858aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr);
859aabbc4fbSShri Abhyankar     /* now flip the values and store them in the matrix*/
860aabbc4fbSShri Abhyankar     for (j=0; j<N; j++) {
861aabbc4fbSShri Abhyankar       for (i=0; i<M; i++) {
862aabbc4fbSShri Abhyankar         *v++ =w[i*N+j];
863aabbc4fbSShri Abhyankar       }
864aabbc4fbSShri Abhyankar     }
865aabbc4fbSShri Abhyankar     ierr = PetscFree(w);CHKERRQ(ierr);
866aabbc4fbSShri Abhyankar   } else {
867aabbc4fbSShri Abhyankar     /* read row lengths */
868854ce69bSBarry Smith     ierr = PetscMalloc1(M+1,&rowlengths);CHKERRQ(ierr);
869aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr);
870aabbc4fbSShri Abhyankar 
871aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
872aabbc4fbSShri Abhyankar     v = a->v;
873aabbc4fbSShri Abhyankar 
874aabbc4fbSShri Abhyankar     /* read column indices and nonzeros */
875854ce69bSBarry Smith     ierr = PetscMalloc1(nz+1,&scols);CHKERRQ(ierr);
876aabbc4fbSShri Abhyankar     cols = scols;
877aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr);
878854ce69bSBarry Smith     ierr = PetscMalloc1(nz+1,&svals);CHKERRQ(ierr);
879aabbc4fbSShri Abhyankar     vals = svals;
880aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr);
881aabbc4fbSShri Abhyankar 
882aabbc4fbSShri Abhyankar     /* insert into matrix */
883aabbc4fbSShri Abhyankar     for (i=0; i<M; i++) {
884aabbc4fbSShri Abhyankar       for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j];
885aabbc4fbSShri Abhyankar       svals += rowlengths[i]; scols += rowlengths[i];
886aabbc4fbSShri Abhyankar     }
887aabbc4fbSShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
888aabbc4fbSShri Abhyankar     ierr = PetscFree(cols);CHKERRQ(ierr);
889aabbc4fbSShri Abhyankar     ierr = PetscFree(rowlengths);CHKERRQ(ierr);
890aabbc4fbSShri Abhyankar   }
891aabbc4fbSShri Abhyankar   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
892aabbc4fbSShri Abhyankar   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
893aabbc4fbSShri Abhyankar   PetscFunctionReturn(0);
894aabbc4fbSShri Abhyankar }
895aabbc4fbSShri Abhyankar 
896aabbc4fbSShri Abhyankar #undef __FUNCT__
8974a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII"
8986849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer)
899289bc588SBarry Smith {
900932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
901dfbe8321SBarry Smith   PetscErrorCode    ierr;
90213f74950SBarry Smith   PetscInt          i,j;
9032dcb1b2aSMatthew Knepley   const char        *name;
90487828ca2SBarry Smith   PetscScalar       *v;
905f3ef73ceSBarry Smith   PetscViewerFormat format;
9065f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX)
907ace3abfcSBarry Smith   PetscBool         allreal = PETSC_TRUE;
9085f481a85SSatish Balay #endif
909932b0c3eSLois Curfman McInnes 
9103a40ed3dSBarry Smith   PetscFunctionBegin;
911b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
912456192e2SBarry Smith   if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
9133a40ed3dSBarry Smith     PetscFunctionReturn(0);  /* do nothing for now */
914fb9695e5SSatish Balay   } else if (format == PETSC_VIEWER_ASCII_COMMON) {
915d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
916d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
91744cd7ae7SLois Curfman McInnes       v    = a->v + i;
91877431f27SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr);
919d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
920aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
921329f5518SBarry Smith         if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) {
92257622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g + %g i) ",j,(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr);
923329f5518SBarry Smith         } else if (PetscRealPart(*v)) {
92457622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)PetscRealPart(*v));CHKERRQ(ierr);
9256831982aSBarry Smith         }
92680cd9d93SLois Curfman McInnes #else
9276831982aSBarry Smith         if (*v) {
92857622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)*v);CHKERRQ(ierr);
9296831982aSBarry Smith         }
93080cd9d93SLois Curfman McInnes #endif
9311b807ce4Svictorle         v += a->lda;
93280cd9d93SLois Curfman McInnes       }
933b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
93480cd9d93SLois Curfman McInnes     }
935d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
9363a40ed3dSBarry Smith   } else {
937d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
938aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
93947989497SBarry Smith     /* determine if matrix has all real values */
94047989497SBarry Smith     v = a->v;
941d0f46423SBarry Smith     for (i=0; i<A->rmap->n*A->cmap->n; i++) {
942ffac6cdbSBarry Smith       if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break;}
94347989497SBarry Smith     }
94447989497SBarry Smith #endif
945fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
9463a7fca6bSBarry Smith       ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr);
947d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr);
948d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
949fb9695e5SSatish Balay       ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr);
950ffac6cdbSBarry Smith     }
951ffac6cdbSBarry Smith 
952d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
953932b0c3eSLois Curfman McInnes       v = a->v + i;
954d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
955aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
95647989497SBarry Smith         if (allreal) {
957c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr);
95847989497SBarry Smith         } else {
959c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr);
96047989497SBarry Smith         }
961289bc588SBarry Smith #else
962c61cd2faSJed Brown         ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr);
963289bc588SBarry Smith #endif
9641b807ce4Svictorle         v += a->lda;
965289bc588SBarry Smith       }
966b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
967289bc588SBarry Smith     }
968fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
969b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr);
970ffac6cdbSBarry Smith     }
971d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
972da3a660dSBarry Smith   }
973b0a32e0cSBarry Smith   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
9743a40ed3dSBarry Smith   PetscFunctionReturn(0);
975289bc588SBarry Smith }
976289bc588SBarry Smith 
9774a2ae208SSatish Balay #undef __FUNCT__
9784a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary"
9796849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer)
980932b0c3eSLois Curfman McInnes {
981932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
9826849ba73SBarry Smith   PetscErrorCode    ierr;
98313f74950SBarry Smith   int               fd;
984d0f46423SBarry Smith   PetscInt          ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n;
985f4403165SShri Abhyankar   PetscScalar       *v,*anonz,*vals;
986f4403165SShri Abhyankar   PetscViewerFormat format;
987932b0c3eSLois Curfman McInnes 
9883a40ed3dSBarry Smith   PetscFunctionBegin;
989b0a32e0cSBarry Smith   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
99090ace30eSBarry Smith 
991f4403165SShri Abhyankar   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
992f4403165SShri Abhyankar   if (format == PETSC_VIEWER_NATIVE) {
993f4403165SShri Abhyankar     /* store the matrix as a dense matrix */
994785e854fSJed Brown     ierr = PetscMalloc1(4,&col_lens);CHKERRQ(ierr);
9952205254eSKarl Rupp 
996f4403165SShri Abhyankar     col_lens[0] = MAT_FILE_CLASSID;
997f4403165SShri Abhyankar     col_lens[1] = m;
998f4403165SShri Abhyankar     col_lens[2] = n;
999f4403165SShri Abhyankar     col_lens[3] = MATRIX_BINARY_FORMAT_DENSE;
10002205254eSKarl Rupp 
1001f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
1002f4403165SShri Abhyankar     ierr = PetscFree(col_lens);CHKERRQ(ierr);
1003f4403165SShri Abhyankar 
1004f4403165SShri Abhyankar     /* write out matrix, by rows */
1005854ce69bSBarry Smith     ierr = PetscMalloc1(m*n+1,&vals);CHKERRQ(ierr);
1006f4403165SShri Abhyankar     v    = a->v;
1007f4403165SShri Abhyankar     for (j=0; j<n; j++) {
1008f4403165SShri Abhyankar       for (i=0; i<m; i++) {
1009f4403165SShri Abhyankar         vals[j + i*n] = *v++;
1010f4403165SShri Abhyankar       }
1011f4403165SShri Abhyankar     }
1012f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
1013f4403165SShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
1014f4403165SShri Abhyankar   } else {
1015854ce69bSBarry Smith     ierr = PetscMalloc1(4+nz,&col_lens);CHKERRQ(ierr);
10162205254eSKarl Rupp 
10170700a824SBarry Smith     col_lens[0] = MAT_FILE_CLASSID;
1018932b0c3eSLois Curfman McInnes     col_lens[1] = m;
1019932b0c3eSLois Curfman McInnes     col_lens[2] = n;
1020932b0c3eSLois Curfman McInnes     col_lens[3] = nz;
1021932b0c3eSLois Curfman McInnes 
1022932b0c3eSLois Curfman McInnes     /* store lengths of each row and write (including header) to file */
1023932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) col_lens[4+i] = n;
10246f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
1025932b0c3eSLois Curfman McInnes 
1026932b0c3eSLois Curfman McInnes     /* Possibly should write in smaller increments, not whole matrix at once? */
1027932b0c3eSLois Curfman McInnes     /* store column indices (zero start index) */
1028932b0c3eSLois Curfman McInnes     ict = 0;
1029932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1030932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) col_lens[ict++] = j;
1031932b0c3eSLois Curfman McInnes     }
10326f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
1033606d414cSSatish Balay     ierr = PetscFree(col_lens);CHKERRQ(ierr);
1034932b0c3eSLois Curfman McInnes 
1035932b0c3eSLois Curfman McInnes     /* store nonzero values */
1036854ce69bSBarry Smith     ierr = PetscMalloc1(nz+1,&anonz);CHKERRQ(ierr);
1037932b0c3eSLois Curfman McInnes     ict  = 0;
1038932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1039932b0c3eSLois Curfman McInnes       v = a->v + i;
1040932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) {
10411b807ce4Svictorle         anonz[ict++] = *v; v += a->lda;
1042932b0c3eSLois Curfman McInnes       }
1043932b0c3eSLois Curfman McInnes     }
10446f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
1045606d414cSSatish Balay     ierr = PetscFree(anonz);CHKERRQ(ierr);
1046f4403165SShri Abhyankar   }
10473a40ed3dSBarry Smith   PetscFunctionReturn(0);
1048932b0c3eSLois Curfman McInnes }
1049932b0c3eSLois Curfman McInnes 
10509804daf3SBarry Smith #include <petscdraw.h>
10514a2ae208SSatish Balay #undef __FUNCT__
10524a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom"
1053dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa)
1054f1af5d2fSBarry Smith {
1055f1af5d2fSBarry Smith   Mat               A  = (Mat) Aa;
1056f1af5d2fSBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
10576849ba73SBarry Smith   PetscErrorCode    ierr;
1058d0f46423SBarry Smith   PetscInt          m  = A->rmap->n,n = A->cmap->n,color,i,j;
105987828ca2SBarry Smith   PetscScalar       *v = a->v;
1060b0a32e0cSBarry Smith   PetscViewer       viewer;
1061b0a32e0cSBarry Smith   PetscDraw         popup;
1062329f5518SBarry Smith   PetscReal         xl,yl,xr,yr,x_l,x_r,y_l,y_r,scale,maxv = 0.0;
1063f3ef73ceSBarry Smith   PetscViewerFormat format;
1064f1af5d2fSBarry Smith 
1065f1af5d2fSBarry Smith   PetscFunctionBegin;
1066f1af5d2fSBarry Smith   ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr);
1067b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1068b0a32e0cSBarry Smith   ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr);
1069f1af5d2fSBarry Smith 
1070f1af5d2fSBarry Smith   /* Loop over matrix elements drawing boxes */
1071fb9695e5SSatish Balay   if (format != PETSC_VIEWER_DRAW_CONTOUR) {
1072f1af5d2fSBarry Smith     /* Blue for negative and Red for positive */
1073b0a32e0cSBarry Smith     color = PETSC_DRAW_BLUE;
1074f1af5d2fSBarry Smith     for (j = 0; j < n; j++) {
1075f1af5d2fSBarry Smith       x_l = j;
1076f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1077f1af5d2fSBarry Smith       for (i = 0; i < m; i++) {
1078f1af5d2fSBarry Smith         y_l = m - i - 1.0;
1079f1af5d2fSBarry Smith         y_r = y_l + 1.0;
1080329f5518SBarry Smith         if (PetscRealPart(v[j*m+i]) >  0.) {
1081b0a32e0cSBarry Smith           color = PETSC_DRAW_RED;
1082329f5518SBarry Smith         } else if (PetscRealPart(v[j*m+i]) <  0.) {
1083b0a32e0cSBarry Smith           color = PETSC_DRAW_BLUE;
1084f1af5d2fSBarry Smith         } else {
1085f1af5d2fSBarry Smith           continue;
1086f1af5d2fSBarry Smith         }
1087b0a32e0cSBarry Smith         ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1088f1af5d2fSBarry Smith       }
1089f1af5d2fSBarry Smith     }
1090f1af5d2fSBarry Smith   } else {
1091f1af5d2fSBarry Smith     /* use contour shading to indicate magnitude of values */
1092f1af5d2fSBarry Smith     /* first determine max of all nonzero values */
1093f1af5d2fSBarry Smith     for (i = 0; i < m*n; i++) {
1094f1af5d2fSBarry Smith       if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]);
1095f1af5d2fSBarry Smith     }
1096b0a32e0cSBarry Smith     scale = (245.0 - PETSC_DRAW_BASIC_COLORS)/maxv;
1097b0a32e0cSBarry Smith     ierr  = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr);
1098b0a32e0cSBarry Smith     if (popup) {ierr = PetscDrawScalePopup(popup,0.0,maxv);CHKERRQ(ierr);}
1099f1af5d2fSBarry Smith     for (j = 0; j < n; j++) {
1100f1af5d2fSBarry Smith       x_l = j;
1101f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1102f1af5d2fSBarry Smith       for (i = 0; i < m; i++) {
1103f1af5d2fSBarry Smith         y_l   = m - i - 1.0;
1104f1af5d2fSBarry Smith         y_r   = y_l + 1.0;
1105b0a32e0cSBarry Smith         color = PETSC_DRAW_BASIC_COLORS + (int)(scale*PetscAbsScalar(v[j*m+i]));
1106b0a32e0cSBarry Smith         ierr  = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1107f1af5d2fSBarry Smith       }
1108f1af5d2fSBarry Smith     }
1109f1af5d2fSBarry Smith   }
1110f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1111f1af5d2fSBarry Smith }
1112f1af5d2fSBarry Smith 
11134a2ae208SSatish Balay #undef __FUNCT__
11144a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw"
1115dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer)
1116f1af5d2fSBarry Smith {
1117b0a32e0cSBarry Smith   PetscDraw      draw;
1118ace3abfcSBarry Smith   PetscBool      isnull;
1119329f5518SBarry Smith   PetscReal      xr,yr,xl,yl,h,w;
1120dfbe8321SBarry Smith   PetscErrorCode ierr;
1121f1af5d2fSBarry Smith 
1122f1af5d2fSBarry Smith   PetscFunctionBegin;
1123b0a32e0cSBarry Smith   ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
1124b0a32e0cSBarry Smith   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
1125abc0a331SBarry Smith   if (isnull) PetscFunctionReturn(0);
1126f1af5d2fSBarry Smith 
1127f1af5d2fSBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr);
1128d0f46423SBarry Smith   xr   = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0;
1129f1af5d2fSBarry Smith   xr  += w;    yr += h;  xl = -w;     yl = -h;
1130b0a32e0cSBarry Smith   ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr);
1131b0a32e0cSBarry Smith   ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr);
11320298fd71SBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr);
1133f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1134f1af5d2fSBarry Smith }
1135f1af5d2fSBarry Smith 
11364a2ae208SSatish Balay #undef __FUNCT__
11374a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense"
1138dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer)
1139932b0c3eSLois Curfman McInnes {
1140dfbe8321SBarry Smith   PetscErrorCode ierr;
1141ace3abfcSBarry Smith   PetscBool      iascii,isbinary,isdraw;
1142932b0c3eSLois Curfman McInnes 
11433a40ed3dSBarry Smith   PetscFunctionBegin;
1144251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
1145251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
1146251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
11470f5bd95cSBarry Smith 
1148c45a1595SBarry Smith   if (iascii) {
1149c45a1595SBarry Smith     ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr);
11500f5bd95cSBarry Smith   } else if (isbinary) {
11513a40ed3dSBarry Smith     ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr);
1152f1af5d2fSBarry Smith   } else if (isdraw) {
1153f1af5d2fSBarry Smith     ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr);
1154932b0c3eSLois Curfman McInnes   }
11553a40ed3dSBarry Smith   PetscFunctionReturn(0);
1156932b0c3eSLois Curfman McInnes }
1157289bc588SBarry Smith 
11584a2ae208SSatish Balay #undef __FUNCT__
11594a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense"
1160dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqDense(Mat mat)
1161289bc588SBarry Smith {
1162ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)mat->data;
1163dfbe8321SBarry Smith   PetscErrorCode ierr;
116490f02eecSBarry Smith 
11653a40ed3dSBarry Smith   PetscFunctionBegin;
1166aa482453SBarry Smith #if defined(PETSC_USE_LOG)
1167d0f46423SBarry Smith   PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n);
1168a5a9c739SBarry Smith #endif
116905b42c5fSBarry Smith   ierr = PetscFree(l->pivots);CHKERRQ(ierr);
11706857c123SSatish Balay   if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);}
1171bf0cc555SLisandro Dalcin   ierr = PetscFree(mat->data);CHKERRQ(ierr);
1172dbd8c25aSHong Zhang 
1173dbd8c25aSHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr);
1174bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL);CHKERRQ(ierr);
1175bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL);CHKERRQ(ierr);
11768baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL);CHKERRQ(ierr);
11778baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
11788baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL);CHKERRQ(ierr);
11798baccfbdSHong Zhang #endif
1180bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL);CHKERRQ(ierr);
1181bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1182bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1183bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
11843bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
11853bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
11863bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
11873a40ed3dSBarry Smith   PetscFunctionReturn(0);
1188289bc588SBarry Smith }
1189289bc588SBarry Smith 
11904a2ae208SSatish Balay #undef __FUNCT__
11914a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense"
1192fc4dec0aSBarry Smith PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout)
1193289bc588SBarry Smith {
1194c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
11956849ba73SBarry Smith   PetscErrorCode ierr;
119613f74950SBarry Smith   PetscInt       k,j,m,n,M;
119787828ca2SBarry Smith   PetscScalar    *v,tmp;
119848b35521SBarry Smith 
11993a40ed3dSBarry Smith   PetscFunctionBegin;
1200d0f46423SBarry Smith   v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n;
1201e9695a30SBarry Smith   if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */
1202e7e72b3dSBarry Smith     if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place");
1203e7e72b3dSBarry Smith     else {
1204d3e5ee88SLois Curfman McInnes       for (j=0; j<m; j++) {
1205289bc588SBarry Smith         for (k=0; k<j; k++) {
12061b807ce4Svictorle           tmp        = v[j + k*M];
12071b807ce4Svictorle           v[j + k*M] = v[k + j*M];
12081b807ce4Svictorle           v[k + j*M] = tmp;
1209289bc588SBarry Smith         }
1210289bc588SBarry Smith       }
1211d64ed03dSBarry Smith     }
12123a40ed3dSBarry Smith   } else { /* out-of-place transpose */
1213d3e5ee88SLois Curfman McInnes     Mat          tmat;
1214ec8511deSBarry Smith     Mat_SeqDense *tmatd;
121587828ca2SBarry Smith     PetscScalar  *v2;
1216ea709b57SSatish Balay 
1217fc4dec0aSBarry Smith     if (reuse == MAT_INITIAL_MATRIX) {
1218ce94432eSBarry Smith       ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr);
1219d0f46423SBarry Smith       ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr);
12207adad957SLisandro Dalcin       ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
12210298fd71SBarry Smith       ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr);
1222fc4dec0aSBarry Smith     } else {
1223fc4dec0aSBarry Smith       tmat = *matout;
1224fc4dec0aSBarry Smith     }
1225ec8511deSBarry Smith     tmatd = (Mat_SeqDense*)tmat->data;
12260de55854SLois Curfman McInnes     v = mat->v; v2 = tmatd->v;
1227d3e5ee88SLois Curfman McInnes     for (j=0; j<n; j++) {
12281b807ce4Svictorle       for (k=0; k<m; k++) v2[j + k*n] = v[k + j*M];
1229d3e5ee88SLois Curfman McInnes     }
12306d4a8577SBarry Smith     ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
12316d4a8577SBarry Smith     ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1232d3e5ee88SLois Curfman McInnes     *matout = tmat;
123348b35521SBarry Smith   }
12343a40ed3dSBarry Smith   PetscFunctionReturn(0);
1235289bc588SBarry Smith }
1236289bc588SBarry Smith 
12374a2ae208SSatish Balay #undef __FUNCT__
12384a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense"
1239ace3abfcSBarry Smith PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool  *flg)
1240289bc588SBarry Smith {
1241c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data;
1242c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data;
124313f74950SBarry Smith   PetscInt     i,j;
1244a2ea699eSBarry Smith   PetscScalar  *v1,*v2;
12459ea5d5aeSSatish Balay 
12463a40ed3dSBarry Smith   PetscFunctionBegin;
1247d0f46423SBarry Smith   if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1248d0f46423SBarry Smith   if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1249d0f46423SBarry Smith   for (i=0; i<A1->rmap->n; i++) {
12501b807ce4Svictorle     v1 = mat1->v+i; v2 = mat2->v+i;
1251d0f46423SBarry Smith     for (j=0; j<A1->cmap->n; j++) {
12523a40ed3dSBarry Smith       if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
12531b807ce4Svictorle       v1 += mat1->lda; v2 += mat2->lda;
12541b807ce4Svictorle     }
1255289bc588SBarry Smith   }
125677c4ece6SBarry Smith   *flg = PETSC_TRUE;
12573a40ed3dSBarry Smith   PetscFunctionReturn(0);
1258289bc588SBarry Smith }
1259289bc588SBarry Smith 
12604a2ae208SSatish Balay #undef __FUNCT__
12614a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense"
1262dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v)
1263289bc588SBarry Smith {
1264c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
1265dfbe8321SBarry Smith   PetscErrorCode ierr;
126613f74950SBarry Smith   PetscInt       i,n,len;
126787828ca2SBarry Smith   PetscScalar    *x,zero = 0.0;
126844cd7ae7SLois Curfman McInnes 
12693a40ed3dSBarry Smith   PetscFunctionBegin;
12702dcb1b2aSMatthew Knepley   ierr = VecSet(v,zero);CHKERRQ(ierr);
12717a97a34bSBarry Smith   ierr = VecGetSize(v,&n);CHKERRQ(ierr);
12721ebc52fbSHong Zhang   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1273d0f46423SBarry Smith   len  = PetscMin(A->rmap->n,A->cmap->n);
1274e32f2f54SBarry Smith   if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec");
127544cd7ae7SLois Curfman McInnes   for (i=0; i<len; i++) {
12761b807ce4Svictorle     x[i] = mat->v[i*mat->lda + i];
1277289bc588SBarry Smith   }
12781ebc52fbSHong Zhang   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
12793a40ed3dSBarry Smith   PetscFunctionReturn(0);
1280289bc588SBarry Smith }
1281289bc588SBarry Smith 
12824a2ae208SSatish Balay #undef __FUNCT__
12834a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense"
1284dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr)
1285289bc588SBarry Smith {
1286c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
1287f1ceaac6SMatthew G. Knepley   const PetscScalar *l,*r;
1288f1ceaac6SMatthew G. Knepley   PetscScalar       x,*v;
1289dfbe8321SBarry Smith   PetscErrorCode    ierr;
1290d0f46423SBarry Smith   PetscInt          i,j,m = A->rmap->n,n = A->cmap->n;
129155659b69SBarry Smith 
12923a40ed3dSBarry Smith   PetscFunctionBegin;
129328988994SBarry Smith   if (ll) {
12947a97a34bSBarry Smith     ierr = VecGetSize(ll,&m);CHKERRQ(ierr);
1295f1ceaac6SMatthew G. Knepley     ierr = VecGetArrayRead(ll,&l);CHKERRQ(ierr);
1296e32f2f54SBarry Smith     if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size");
1297da3a660dSBarry Smith     for (i=0; i<m; i++) {
1298da3a660dSBarry Smith       x = l[i];
1299da3a660dSBarry Smith       v = mat->v + i;
1300da3a660dSBarry Smith       for (j=0; j<n; j++) { (*v) *= x; v+= m;}
1301da3a660dSBarry Smith     }
1302f1ceaac6SMatthew G. Knepley     ierr = VecRestoreArrayRead(ll,&l);CHKERRQ(ierr);
1303efee365bSSatish Balay     ierr = PetscLogFlops(n*m);CHKERRQ(ierr);
1304da3a660dSBarry Smith   }
130528988994SBarry Smith   if (rr) {
13067a97a34bSBarry Smith     ierr = VecGetSize(rr,&n);CHKERRQ(ierr);
1307f1ceaac6SMatthew G. Knepley     ierr = VecGetArrayRead(rr,&r);CHKERRQ(ierr);
1308e32f2f54SBarry Smith     if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size");
1309da3a660dSBarry Smith     for (i=0; i<n; i++) {
1310da3a660dSBarry Smith       x = r[i];
1311da3a660dSBarry Smith       v = mat->v + i*m;
13122205254eSKarl Rupp       for (j=0; j<m; j++) (*v++) *= x;
1313da3a660dSBarry Smith     }
1314f1ceaac6SMatthew G. Knepley     ierr = VecRestoreArrayRead(rr,&r);CHKERRQ(ierr);
1315efee365bSSatish Balay     ierr = PetscLogFlops(n*m);CHKERRQ(ierr);
1316da3a660dSBarry Smith   }
13173a40ed3dSBarry Smith   PetscFunctionReturn(0);
1318289bc588SBarry Smith }
1319289bc588SBarry Smith 
13204a2ae208SSatish Balay #undef __FUNCT__
13214a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense"
1322dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm)
1323289bc588SBarry Smith {
1324c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
132587828ca2SBarry Smith   PetscScalar    *v   = mat->v;
1326329f5518SBarry Smith   PetscReal      sum  = 0.0;
1327d0f46423SBarry Smith   PetscInt       lda  =mat->lda,m=A->rmap->n,i,j;
1328efee365bSSatish Balay   PetscErrorCode ierr;
132955659b69SBarry Smith 
13303a40ed3dSBarry Smith   PetscFunctionBegin;
1331289bc588SBarry Smith   if (type == NORM_FROBENIUS) {
1332a5ce6ee0Svictorle     if (lda>m) {
1333d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1334a5ce6ee0Svictorle         v = mat->v+j*lda;
1335a5ce6ee0Svictorle         for (i=0; i<m; i++) {
1336a5ce6ee0Svictorle           sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1337a5ce6ee0Svictorle         }
1338a5ce6ee0Svictorle       }
1339a5ce6ee0Svictorle     } else {
1340d0f46423SBarry Smith       for (i=0; i<A->cmap->n*A->rmap->n; i++) {
1341329f5518SBarry Smith         sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1342289bc588SBarry Smith       }
1343a5ce6ee0Svictorle     }
13448f1a2a5eSBarry Smith     *nrm = PetscSqrtReal(sum);
1345dc0b31edSSatish Balay     ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
13463a40ed3dSBarry Smith   } else if (type == NORM_1) {
1347064f8208SBarry Smith     *nrm = 0.0;
1348d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
13491b807ce4Svictorle       v   = mat->v + j*mat->lda;
1350289bc588SBarry Smith       sum = 0.0;
1351d0f46423SBarry Smith       for (i=0; i<A->rmap->n; i++) {
135233a8263dSBarry Smith         sum += PetscAbsScalar(*v);  v++;
1353289bc588SBarry Smith       }
1354064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1355289bc588SBarry Smith     }
1356d0f46423SBarry Smith     ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr);
13573a40ed3dSBarry Smith   } else if (type == NORM_INFINITY) {
1358064f8208SBarry Smith     *nrm = 0.0;
1359d0f46423SBarry Smith     for (j=0; j<A->rmap->n; j++) {
1360289bc588SBarry Smith       v   = mat->v + j;
1361289bc588SBarry Smith       sum = 0.0;
1362d0f46423SBarry Smith       for (i=0; i<A->cmap->n; i++) {
13631b807ce4Svictorle         sum += PetscAbsScalar(*v); v += mat->lda;
1364289bc588SBarry Smith       }
1365064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1366289bc588SBarry Smith     }
1367d0f46423SBarry Smith     ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr);
1368e7e72b3dSBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm");
13693a40ed3dSBarry Smith   PetscFunctionReturn(0);
1370289bc588SBarry Smith }
1371289bc588SBarry Smith 
13724a2ae208SSatish Balay #undef __FUNCT__
13734a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense"
1374ace3abfcSBarry Smith PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg)
1375289bc588SBarry Smith {
1376c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *aij = (Mat_SeqDense*)A->data;
137763ba0a88SBarry Smith   PetscErrorCode ierr;
137867e560aaSBarry Smith 
13793a40ed3dSBarry Smith   PetscFunctionBegin;
1380b5a2b587SKris Buschelman   switch (op) {
1381b5a2b587SKris Buschelman   case MAT_ROW_ORIENTED:
13824e0d8c25SBarry Smith     aij->roworiented = flg;
1383b5a2b587SKris Buschelman     break;
1384512a5fc5SBarry Smith   case MAT_NEW_NONZERO_LOCATIONS:
1385b5a2b587SKris Buschelman   case MAT_NEW_NONZERO_LOCATION_ERR:
13863971808eSMatthew Knepley   case MAT_NEW_NONZERO_ALLOCATION_ERR:
13874e0d8c25SBarry Smith   case MAT_NEW_DIAGONALS:
138813fa8e87SLisandro Dalcin   case MAT_KEEP_NONZERO_PATTERN:
1389b5a2b587SKris Buschelman   case MAT_IGNORE_OFF_PROC_ENTRIES:
1390b5a2b587SKris Buschelman   case MAT_USE_HASH_TABLE:
13915021d80fSJed Brown   case MAT_IGNORE_LOWER_TRIANGULAR:
13925021d80fSJed Brown     ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr);
13935021d80fSJed Brown     break;
13945021d80fSJed Brown   case MAT_SPD:
139577e54ba9SKris Buschelman   case MAT_SYMMETRIC:
139677e54ba9SKris Buschelman   case MAT_STRUCTURALLY_SYMMETRIC:
13979a4540c5SBarry Smith   case MAT_HERMITIAN:
13989a4540c5SBarry Smith   case MAT_SYMMETRY_ETERNAL:
13995021d80fSJed Brown     /* These options are handled directly by MatSetOption() */
140077e54ba9SKris Buschelman     break;
1401b5a2b587SKris Buschelman   default:
1402e32f2f54SBarry Smith     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]);
14033a40ed3dSBarry Smith   }
14043a40ed3dSBarry Smith   PetscFunctionReturn(0);
1405289bc588SBarry Smith }
1406289bc588SBarry Smith 
14074a2ae208SSatish Balay #undef __FUNCT__
14084a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense"
1409dfbe8321SBarry Smith PetscErrorCode MatZeroEntries_SeqDense(Mat A)
14106f0a148fSBarry Smith {
1411ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)A->data;
14126849ba73SBarry Smith   PetscErrorCode ierr;
1413d0f46423SBarry Smith   PetscInt       lda=l->lda,m=A->rmap->n,j;
14143a40ed3dSBarry Smith 
14153a40ed3dSBarry Smith   PetscFunctionBegin;
1416a5ce6ee0Svictorle   if (lda>m) {
1417d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1418a5ce6ee0Svictorle       ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
1419a5ce6ee0Svictorle     }
1420a5ce6ee0Svictorle   } else {
1421d0f46423SBarry Smith     ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1422a5ce6ee0Svictorle   }
14233a40ed3dSBarry Smith   PetscFunctionReturn(0);
14246f0a148fSBarry Smith }
14256f0a148fSBarry Smith 
14264a2ae208SSatish Balay #undef __FUNCT__
14274a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense"
14282b40b63fSBarry Smith PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b)
14296f0a148fSBarry Smith {
143097b48c8fSBarry Smith   PetscErrorCode    ierr;
1431ec8511deSBarry Smith   Mat_SeqDense      *l = (Mat_SeqDense*)A->data;
1432b9679d65SBarry Smith   PetscInt          m  = l->lda, n = A->cmap->n, i,j;
143397b48c8fSBarry Smith   PetscScalar       *slot,*bb;
143497b48c8fSBarry Smith   const PetscScalar *xx;
143555659b69SBarry Smith 
14363a40ed3dSBarry Smith   PetscFunctionBegin;
1437b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG)
1438b9679d65SBarry Smith   for (i=0; i<N; i++) {
1439b9679d65SBarry Smith     if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed");
1440b9679d65SBarry 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);
1441b9679d65SBarry Smith   }
1442b9679d65SBarry Smith #endif
1443b9679d65SBarry Smith 
144497b48c8fSBarry Smith   /* fix right hand side if needed */
144597b48c8fSBarry Smith   if (x && b) {
144697b48c8fSBarry Smith     ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr);
144797b48c8fSBarry Smith     ierr = VecGetArray(b,&bb);CHKERRQ(ierr);
14482205254eSKarl Rupp     for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]];
144997b48c8fSBarry Smith     ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr);
145097b48c8fSBarry Smith     ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr);
145197b48c8fSBarry Smith   }
145297b48c8fSBarry Smith 
14536f0a148fSBarry Smith   for (i=0; i<N; i++) {
14546f0a148fSBarry Smith     slot = l->v + rows[i];
1455b9679d65SBarry Smith     for (j=0; j<n; j++) { *slot = 0.0; slot += m;}
14566f0a148fSBarry Smith   }
1457f4df32b1SMatthew Knepley   if (diag != 0.0) {
1458b9679d65SBarry Smith     if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices");
14596f0a148fSBarry Smith     for (i=0; i<N; i++) {
1460b9679d65SBarry Smith       slot  = l->v + (m+1)*rows[i];
1461f4df32b1SMatthew Knepley       *slot = diag;
14626f0a148fSBarry Smith     }
14636f0a148fSBarry Smith   }
14643a40ed3dSBarry Smith   PetscFunctionReturn(0);
14656f0a148fSBarry Smith }
1466557bce09SLois Curfman McInnes 
14674a2ae208SSatish Balay #undef __FUNCT__
14688c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray_SeqDense"
14698c778c55SBarry Smith PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar *array[])
147064e87e97SBarry Smith {
1471c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
14723a40ed3dSBarry Smith 
14733a40ed3dSBarry Smith   PetscFunctionBegin;
1474e32f2f54SBarry 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");
147564e87e97SBarry Smith   *array = mat->v;
14763a40ed3dSBarry Smith   PetscFunctionReturn(0);
147764e87e97SBarry Smith }
14780754003eSLois Curfman McInnes 
14794a2ae208SSatish Balay #undef __FUNCT__
14808c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray_SeqDense"
14818c778c55SBarry Smith PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar *array[])
1482ff14e315SSatish Balay {
14833a40ed3dSBarry Smith   PetscFunctionBegin;
148409b544d4SBarry Smith   *array = 0; /* user cannot accidently use the array later */
14853a40ed3dSBarry Smith   PetscFunctionReturn(0);
1486ff14e315SSatish Balay }
14870754003eSLois Curfman McInnes 
14884a2ae208SSatish Balay #undef __FUNCT__
14898c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray"
1490dec5eb66SMatthew G Knepley /*@C
14918c778c55SBarry Smith    MatDenseGetArray - gives access to the array where the data for a SeqDense matrix is stored
149273a71a0fSBarry Smith 
149373a71a0fSBarry Smith    Not Collective
149473a71a0fSBarry Smith 
149573a71a0fSBarry Smith    Input Parameter:
1496579dbff0SBarry Smith .  mat - a MATSEQDENSE or MATMPIDENSE matrix
149773a71a0fSBarry Smith 
149873a71a0fSBarry Smith    Output Parameter:
149973a71a0fSBarry Smith .   array - pointer to the data
150073a71a0fSBarry Smith 
150173a71a0fSBarry Smith    Level: intermediate
150273a71a0fSBarry Smith 
15038c778c55SBarry Smith .seealso: MatDenseRestoreArray()
150473a71a0fSBarry Smith @*/
15058c778c55SBarry Smith PetscErrorCode  MatDenseGetArray(Mat A,PetscScalar **array)
150673a71a0fSBarry Smith {
150773a71a0fSBarry Smith   PetscErrorCode ierr;
150873a71a0fSBarry Smith 
150973a71a0fSBarry Smith   PetscFunctionBegin;
15108c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
151173a71a0fSBarry Smith   PetscFunctionReturn(0);
151273a71a0fSBarry Smith }
151373a71a0fSBarry Smith 
151473a71a0fSBarry Smith #undef __FUNCT__
15158c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray"
1516dec5eb66SMatthew G Knepley /*@C
1517579dbff0SBarry Smith    MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray()
151873a71a0fSBarry Smith 
151973a71a0fSBarry Smith    Not Collective
152073a71a0fSBarry Smith 
152173a71a0fSBarry Smith    Input Parameters:
1522579dbff0SBarry Smith .  mat - a MATSEQDENSE or MATMPIDENSE matrix
152373a71a0fSBarry Smith .  array - pointer to the data
152473a71a0fSBarry Smith 
152573a71a0fSBarry Smith    Level: intermediate
152673a71a0fSBarry Smith 
15278c778c55SBarry Smith .seealso: MatDenseGetArray()
152873a71a0fSBarry Smith @*/
15298c778c55SBarry Smith PetscErrorCode  MatDenseRestoreArray(Mat A,PetscScalar **array)
153073a71a0fSBarry Smith {
153173a71a0fSBarry Smith   PetscErrorCode ierr;
153273a71a0fSBarry Smith 
153373a71a0fSBarry Smith   PetscFunctionBegin;
15348c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
153573a71a0fSBarry Smith   PetscFunctionReturn(0);
153673a71a0fSBarry Smith }
153773a71a0fSBarry Smith 
153873a71a0fSBarry Smith #undef __FUNCT__
15394a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense"
154013f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B)
15410754003eSLois Curfman McInnes {
1542c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
15436849ba73SBarry Smith   PetscErrorCode ierr;
15445d0c19d7SBarry Smith   PetscInt       i,j,nrows,ncols;
15455d0c19d7SBarry Smith   const PetscInt *irow,*icol;
154687828ca2SBarry Smith   PetscScalar    *av,*bv,*v = mat->v;
15470754003eSLois Curfman McInnes   Mat            newmat;
15480754003eSLois Curfman McInnes 
15493a40ed3dSBarry Smith   PetscFunctionBegin;
155078b31e54SBarry Smith   ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr);
155178b31e54SBarry Smith   ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr);
1552e03a110bSBarry Smith   ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr);
1553e03a110bSBarry Smith   ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr);
15540754003eSLois Curfman McInnes 
1555182d2002SSatish Balay   /* Check submatrixcall */
1556182d2002SSatish Balay   if (scall == MAT_REUSE_MATRIX) {
155713f74950SBarry Smith     PetscInt n_cols,n_rows;
1558182d2002SSatish Balay     ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr);
155921a2c019SBarry Smith     if (n_rows != nrows || n_cols != ncols) {
1560f746d493SDmitry Karpeev       /* resize the result matrix to match number of requested rows/columns */
1561c61587bbSBarry Smith       ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
156221a2c019SBarry Smith     }
1563182d2002SSatish Balay     newmat = *B;
1564182d2002SSatish Balay   } else {
15650754003eSLois Curfman McInnes     /* Create and fill new matrix */
1566ce94432eSBarry Smith     ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr);
1567f69a0ea3SMatthew Knepley     ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
15687adad957SLisandro Dalcin     ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
15690298fd71SBarry Smith     ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr);
1570182d2002SSatish Balay   }
1571182d2002SSatish Balay 
1572182d2002SSatish Balay   /* Now extract the data pointers and do the copy,column at a time */
1573182d2002SSatish Balay   bv = ((Mat_SeqDense*)newmat->data)->v;
1574182d2002SSatish Balay 
1575182d2002SSatish Balay   for (i=0; i<ncols; i++) {
15766de62eeeSBarry Smith     av = v + mat->lda*icol[i];
15772205254eSKarl Rupp     for (j=0; j<nrows; j++) *bv++ = av[irow[j]];
15780754003eSLois Curfman McInnes   }
1579182d2002SSatish Balay 
1580182d2002SSatish Balay   /* Assemble the matrices so that the correct flags are set */
15816d4a8577SBarry Smith   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
15826d4a8577SBarry Smith   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
15830754003eSLois Curfman McInnes 
15840754003eSLois Curfman McInnes   /* Free work space */
158578b31e54SBarry Smith   ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr);
158678b31e54SBarry Smith   ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr);
1587182d2002SSatish Balay   *B   = newmat;
15883a40ed3dSBarry Smith   PetscFunctionReturn(0);
15890754003eSLois Curfman McInnes }
15900754003eSLois Curfman McInnes 
15914a2ae208SSatish Balay #undef __FUNCT__
15924a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense"
159313f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[])
1594905e6a2fSBarry Smith {
15956849ba73SBarry Smith   PetscErrorCode ierr;
159613f74950SBarry Smith   PetscInt       i;
1597905e6a2fSBarry Smith 
15983a40ed3dSBarry Smith   PetscFunctionBegin;
1599905e6a2fSBarry Smith   if (scall == MAT_INITIAL_MATRIX) {
1600854ce69bSBarry Smith     ierr = PetscMalloc1(n+1,B);CHKERRQ(ierr);
1601905e6a2fSBarry Smith   }
1602905e6a2fSBarry Smith 
1603905e6a2fSBarry Smith   for (i=0; i<n; i++) {
16046a6a5d1dSBarry Smith     ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr);
1605905e6a2fSBarry Smith   }
16063a40ed3dSBarry Smith   PetscFunctionReturn(0);
1607905e6a2fSBarry Smith }
1608905e6a2fSBarry Smith 
16094a2ae208SSatish Balay #undef __FUNCT__
1610c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense"
1611c0aa2d19SHong Zhang PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode)
1612c0aa2d19SHong Zhang {
1613c0aa2d19SHong Zhang   PetscFunctionBegin;
1614c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1615c0aa2d19SHong Zhang }
1616c0aa2d19SHong Zhang 
1617c0aa2d19SHong Zhang #undef __FUNCT__
1618c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense"
1619c0aa2d19SHong Zhang PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode)
1620c0aa2d19SHong Zhang {
1621c0aa2d19SHong Zhang   PetscFunctionBegin;
1622c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1623c0aa2d19SHong Zhang }
1624c0aa2d19SHong Zhang 
1625c0aa2d19SHong Zhang #undef __FUNCT__
16264a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense"
1627dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str)
16284b0e389bSBarry Smith {
16294b0e389bSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data;
16306849ba73SBarry Smith   PetscErrorCode ierr;
1631d0f46423SBarry Smith   PetscInt       lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j;
16323a40ed3dSBarry Smith 
16333a40ed3dSBarry Smith   PetscFunctionBegin;
163433f4a19fSKris Buschelman   /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */
163533f4a19fSKris Buschelman   if (A->ops->copy != B->ops->copy) {
1636cb5b572fSBarry Smith     ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr);
16373a40ed3dSBarry Smith     PetscFunctionReturn(0);
16383a40ed3dSBarry Smith   }
1639e32f2f54SBarry Smith   if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)");
1640a5ce6ee0Svictorle   if (lda1>m || lda2>m) {
16410dbb7854Svictorle     for (j=0; j<n; j++) {
1642a5ce6ee0Svictorle       ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr);
1643a5ce6ee0Svictorle     }
1644a5ce6ee0Svictorle   } else {
1645d0f46423SBarry Smith     ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1646a5ce6ee0Svictorle   }
1647273d9f13SBarry Smith   PetscFunctionReturn(0);
1648273d9f13SBarry Smith }
1649273d9f13SBarry Smith 
16504a2ae208SSatish Balay #undef __FUNCT__
16514994cf47SJed Brown #define __FUNCT__ "MatSetUp_SeqDense"
16524994cf47SJed Brown PetscErrorCode MatSetUp_SeqDense(Mat A)
1653273d9f13SBarry Smith {
1654dfbe8321SBarry Smith   PetscErrorCode ierr;
1655273d9f13SBarry Smith 
1656273d9f13SBarry Smith   PetscFunctionBegin;
1657273d9f13SBarry Smith   ierr =  MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr);
16583a40ed3dSBarry Smith   PetscFunctionReturn(0);
16594b0e389bSBarry Smith }
16604b0e389bSBarry Smith 
1661284134d9SBarry Smith #undef __FUNCT__
1662ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense"
1663ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A)
1664ba337c44SJed Brown {
1665ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1666ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1667ba337c44SJed Brown   PetscScalar  *aa = a->v;
1668ba337c44SJed Brown 
1669ba337c44SJed Brown   PetscFunctionBegin;
1670ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]);
1671ba337c44SJed Brown   PetscFunctionReturn(0);
1672ba337c44SJed Brown }
1673ba337c44SJed Brown 
1674ba337c44SJed Brown #undef __FUNCT__
1675ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense"
1676ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A)
1677ba337c44SJed Brown {
1678ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1679ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1680ba337c44SJed Brown   PetscScalar  *aa = a->v;
1681ba337c44SJed Brown 
1682ba337c44SJed Brown   PetscFunctionBegin;
1683ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]);
1684ba337c44SJed Brown   PetscFunctionReturn(0);
1685ba337c44SJed Brown }
1686ba337c44SJed Brown 
1687ba337c44SJed Brown #undef __FUNCT__
1688ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense"
1689ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A)
1690ba337c44SJed Brown {
1691ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1692ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1693ba337c44SJed Brown   PetscScalar  *aa = a->v;
1694ba337c44SJed Brown 
1695ba337c44SJed Brown   PetscFunctionBegin;
1696ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]);
1697ba337c44SJed Brown   PetscFunctionReturn(0);
1698ba337c44SJed Brown }
1699284134d9SBarry Smith 
1700a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/
1701a9fe9ddaSSatish Balay #undef __FUNCT__
1702a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense"
1703a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1704a9fe9ddaSSatish Balay {
1705a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1706a9fe9ddaSSatish Balay 
1707a9fe9ddaSSatish Balay   PetscFunctionBegin;
1708a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
17093ff4c91cSHong Zhang     ierr = PetscLogEventBegin(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1710a9fe9ddaSSatish Balay     ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
17113ff4c91cSHong Zhang     ierr = PetscLogEventEnd(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1712a9fe9ddaSSatish Balay   }
17133ff4c91cSHong Zhang   ierr = PetscLogEventBegin(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1714a9fe9ddaSSatish Balay   ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
17153ff4c91cSHong Zhang   ierr = PetscLogEventEnd(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1716a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1717a9fe9ddaSSatish Balay }
1718a9fe9ddaSSatish Balay 
1719a9fe9ddaSSatish Balay #undef __FUNCT__
1720a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense"
1721a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1722a9fe9ddaSSatish Balay {
1723ee16a9a1SHong Zhang   PetscErrorCode ierr;
1724d0f46423SBarry Smith   PetscInt       m=A->rmap->n,n=B->cmap->n;
1725ee16a9a1SHong Zhang   Mat            Cmat;
1726a9fe9ddaSSatish Balay 
1727ee16a9a1SHong Zhang   PetscFunctionBegin;
1728e32f2f54SBarry 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);
1729ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1730ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1731ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
17320298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr);
1733d73949e8SHong Zhang 
1734ee16a9a1SHong Zhang   *C = Cmat;
1735ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1736ee16a9a1SHong Zhang }
1737a9fe9ddaSSatish Balay 
173898a3b096SSatish Balay #undef __FUNCT__
1739a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense"
1740a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1741a9fe9ddaSSatish Balay {
1742a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1743a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1744a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
17450805154bSBarry Smith   PetscBLASInt   m,n,k;
1746a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1747c5df96a5SBarry Smith   PetscErrorCode ierr;
1748a9fe9ddaSSatish Balay 
1749a9fe9ddaSSatish Balay   PetscFunctionBegin;
1750c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
1751c5df96a5SBarry Smith   ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr);
1752c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr);
17538b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
1754a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1755a9fe9ddaSSatish Balay }
1756a9fe9ddaSSatish Balay 
1757a9fe9ddaSSatish Balay #undef __FUNCT__
175875648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqDense_SeqDense"
175975648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1760a9fe9ddaSSatish Balay {
1761a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1762a9fe9ddaSSatish Balay 
1763a9fe9ddaSSatish Balay   PetscFunctionBegin;
1764a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
17653ff4c91cSHong Zhang     ierr = PetscLogEventBegin(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
176675648e8dSHong Zhang     ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
17673ff4c91cSHong Zhang     ierr = PetscLogEventEnd(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1768a9fe9ddaSSatish Balay   }
17693ff4c91cSHong Zhang   ierr = PetscLogEventBegin(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr);
177075648e8dSHong Zhang   ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
17713ff4c91cSHong Zhang   ierr = PetscLogEventEnd(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1772a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1773a9fe9ddaSSatish Balay }
1774a9fe9ddaSSatish Balay 
1775a9fe9ddaSSatish Balay #undef __FUNCT__
177675648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqDense_SeqDense"
177775648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1778a9fe9ddaSSatish Balay {
1779ee16a9a1SHong Zhang   PetscErrorCode ierr;
1780d0f46423SBarry Smith   PetscInt       m=A->cmap->n,n=B->cmap->n;
1781ee16a9a1SHong Zhang   Mat            Cmat;
1782a9fe9ddaSSatish Balay 
1783ee16a9a1SHong Zhang   PetscFunctionBegin;
1784e32f2f54SBarry 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);
1785ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1786ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1787ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
17880298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr);
17892205254eSKarl Rupp 
1790ee16a9a1SHong Zhang   Cmat->assembled = PETSC_TRUE;
17912205254eSKarl Rupp 
1792ee16a9a1SHong Zhang   *C = Cmat;
1793ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1794ee16a9a1SHong Zhang }
1795a9fe9ddaSSatish Balay 
1796a9fe9ddaSSatish Balay #undef __FUNCT__
179775648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqDense_SeqDense"
179875648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1799a9fe9ddaSSatish Balay {
1800a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1801a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1802a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
18030805154bSBarry Smith   PetscBLASInt   m,n,k;
1804a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1805c5df96a5SBarry Smith   PetscErrorCode ierr;
1806a9fe9ddaSSatish Balay 
1807a9fe9ddaSSatish Balay   PetscFunctionBegin;
1808c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&m);CHKERRQ(ierr);
1809c5df96a5SBarry Smith   ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr);
1810c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr);
18112fbe02b9SBarry Smith   /*
18122fbe02b9SBarry Smith      Note the m and n arguments below are the number rows and columns of A', not A!
18132fbe02b9SBarry Smith   */
18148b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
1815a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1816a9fe9ddaSSatish Balay }
1817985db425SBarry Smith 
1818985db425SBarry Smith #undef __FUNCT__
1819985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense"
1820985db425SBarry Smith PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[])
1821985db425SBarry Smith {
1822985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1823985db425SBarry Smith   PetscErrorCode ierr;
1824d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1825985db425SBarry Smith   PetscScalar    *x;
1826985db425SBarry Smith   MatScalar      *aa = a->v;
1827985db425SBarry Smith 
1828985db425SBarry Smith   PetscFunctionBegin;
1829e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1830985db425SBarry Smith 
1831985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1832985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1833985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1834e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1835985db425SBarry Smith   for (i=0; i<m; i++) {
1836985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1837985db425SBarry Smith     for (j=1; j<n; j++) {
1838985db425SBarry Smith       if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1839985db425SBarry Smith     }
1840985db425SBarry Smith   }
1841985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1842985db425SBarry Smith   PetscFunctionReturn(0);
1843985db425SBarry Smith }
1844985db425SBarry Smith 
1845985db425SBarry Smith #undef __FUNCT__
1846985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense"
1847985db425SBarry Smith PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[])
1848985db425SBarry Smith {
1849985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1850985db425SBarry Smith   PetscErrorCode ierr;
1851d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1852985db425SBarry Smith   PetscScalar    *x;
1853985db425SBarry Smith   PetscReal      atmp;
1854985db425SBarry Smith   MatScalar      *aa = a->v;
1855985db425SBarry Smith 
1856985db425SBarry Smith   PetscFunctionBegin;
1857e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1858985db425SBarry Smith 
1859985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1860985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1861985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1862e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1863985db425SBarry Smith   for (i=0; i<m; i++) {
18649189402eSHong Zhang     x[i] = PetscAbsScalar(aa[i]);
1865985db425SBarry Smith     for (j=1; j<n; j++) {
1866985db425SBarry Smith       atmp = PetscAbsScalar(aa[i+m*j]);
1867985db425SBarry Smith       if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;}
1868985db425SBarry Smith     }
1869985db425SBarry Smith   }
1870985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1871985db425SBarry Smith   PetscFunctionReturn(0);
1872985db425SBarry Smith }
1873985db425SBarry Smith 
1874985db425SBarry Smith #undef __FUNCT__
1875985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense"
1876985db425SBarry Smith PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[])
1877985db425SBarry Smith {
1878985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1879985db425SBarry Smith   PetscErrorCode ierr;
1880d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1881985db425SBarry Smith   PetscScalar    *x;
1882985db425SBarry Smith   MatScalar      *aa = a->v;
1883985db425SBarry Smith 
1884985db425SBarry Smith   PetscFunctionBegin;
1885e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1886985db425SBarry Smith 
1887985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1888985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1889985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1890e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1891985db425SBarry Smith   for (i=0; i<m; i++) {
1892985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1893985db425SBarry Smith     for (j=1; j<n; j++) {
1894985db425SBarry Smith       if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1895985db425SBarry Smith     }
1896985db425SBarry Smith   }
1897985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1898985db425SBarry Smith   PetscFunctionReturn(0);
1899985db425SBarry Smith }
1900985db425SBarry Smith 
19018d0534beSBarry Smith #undef __FUNCT__
19028d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense"
19038d0534beSBarry Smith PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col)
19048d0534beSBarry Smith {
19058d0534beSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
19068d0534beSBarry Smith   PetscErrorCode ierr;
19078d0534beSBarry Smith   PetscScalar    *x;
19088d0534beSBarry Smith 
19098d0534beSBarry Smith   PetscFunctionBegin;
1910e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
19118d0534beSBarry Smith 
19128d0534beSBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1913d0f46423SBarry Smith   ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
19148d0534beSBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
19158d0534beSBarry Smith   PetscFunctionReturn(0);
19168d0534beSBarry Smith }
19178d0534beSBarry Smith 
19180716a85fSBarry Smith 
19190716a85fSBarry Smith #undef __FUNCT__
19200716a85fSBarry Smith #define __FUNCT__ "MatGetColumnNorms_SeqDense"
19210716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms)
19220716a85fSBarry Smith {
19230716a85fSBarry Smith   PetscErrorCode ierr;
19240716a85fSBarry Smith   PetscInt       i,j,m,n;
19250716a85fSBarry Smith   PetscScalar    *a;
19260716a85fSBarry Smith 
19270716a85fSBarry Smith   PetscFunctionBegin;
19280716a85fSBarry Smith   ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr);
19290716a85fSBarry Smith   ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr);
19308c778c55SBarry Smith   ierr = MatDenseGetArray(A,&a);CHKERRQ(ierr);
19310716a85fSBarry Smith   if (type == NORM_2) {
19320716a85fSBarry Smith     for (i=0; i<n; i++) {
19330716a85fSBarry Smith       for (j=0; j<m; j++) {
19340716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]*a[j]);
19350716a85fSBarry Smith       }
19360716a85fSBarry Smith       a += m;
19370716a85fSBarry Smith     }
19380716a85fSBarry Smith   } else if (type == NORM_1) {
19390716a85fSBarry Smith     for (i=0; i<n; i++) {
19400716a85fSBarry Smith       for (j=0; j<m; j++) {
19410716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]);
19420716a85fSBarry Smith       }
19430716a85fSBarry Smith       a += m;
19440716a85fSBarry Smith     }
19450716a85fSBarry Smith   } else if (type == NORM_INFINITY) {
19460716a85fSBarry Smith     for (i=0; i<n; i++) {
19470716a85fSBarry Smith       for (j=0; j<m; j++) {
19480716a85fSBarry Smith         norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]);
19490716a85fSBarry Smith       }
19500716a85fSBarry Smith       a += m;
19510716a85fSBarry Smith     }
1952ce94432eSBarry Smith   } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType");
19538c778c55SBarry Smith   ierr = MatDenseRestoreArray(A,&a);CHKERRQ(ierr);
19540716a85fSBarry Smith   if (type == NORM_2) {
19558f1a2a5eSBarry Smith     for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]);
19560716a85fSBarry Smith   }
19570716a85fSBarry Smith   PetscFunctionReturn(0);
19580716a85fSBarry Smith }
19590716a85fSBarry Smith 
196073a71a0fSBarry Smith #undef __FUNCT__
196173a71a0fSBarry Smith #define __FUNCT__ "MatSetRandom_SeqDense"
196273a71a0fSBarry Smith static PetscErrorCode  MatSetRandom_SeqDense(Mat x,PetscRandom rctx)
196373a71a0fSBarry Smith {
196473a71a0fSBarry Smith   PetscErrorCode ierr;
196573a71a0fSBarry Smith   PetscScalar    *a;
196673a71a0fSBarry Smith   PetscInt       m,n,i;
196773a71a0fSBarry Smith 
196873a71a0fSBarry Smith   PetscFunctionBegin;
196973a71a0fSBarry Smith   ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr);
19708c778c55SBarry Smith   ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr);
197173a71a0fSBarry Smith   for (i=0; i<m*n; i++) {
197273a71a0fSBarry Smith     ierr = PetscRandomGetValue(rctx,a+i);CHKERRQ(ierr);
197373a71a0fSBarry Smith   }
19748c778c55SBarry Smith   ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr);
197573a71a0fSBarry Smith   PetscFunctionReturn(0);
197673a71a0fSBarry Smith }
197773a71a0fSBarry Smith 
197873a71a0fSBarry Smith 
1979289bc588SBarry Smith /* -------------------------------------------------------------------*/
1980a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense,
1981905e6a2fSBarry Smith                                         MatGetRow_SeqDense,
1982905e6a2fSBarry Smith                                         MatRestoreRow_SeqDense,
1983905e6a2fSBarry Smith                                         MatMult_SeqDense,
198497304618SKris Buschelman                                 /*  4*/ MatMultAdd_SeqDense,
19857c922b88SBarry Smith                                         MatMultTranspose_SeqDense,
19867c922b88SBarry Smith                                         MatMultTransposeAdd_SeqDense,
1987db4efbfdSBarry Smith                                         0,
1988db4efbfdSBarry Smith                                         0,
1989db4efbfdSBarry Smith                                         0,
1990db4efbfdSBarry Smith                                 /* 10*/ 0,
1991905e6a2fSBarry Smith                                         MatLUFactor_SeqDense,
1992905e6a2fSBarry Smith                                         MatCholeskyFactor_SeqDense,
199341f059aeSBarry Smith                                         MatSOR_SeqDense,
1994ec8511deSBarry Smith                                         MatTranspose_SeqDense,
199597304618SKris Buschelman                                 /* 15*/ MatGetInfo_SeqDense,
1996905e6a2fSBarry Smith                                         MatEqual_SeqDense,
1997905e6a2fSBarry Smith                                         MatGetDiagonal_SeqDense,
1998905e6a2fSBarry Smith                                         MatDiagonalScale_SeqDense,
1999905e6a2fSBarry Smith                                         MatNorm_SeqDense,
2000c0aa2d19SHong Zhang                                 /* 20*/ MatAssemblyBegin_SeqDense,
2001c0aa2d19SHong Zhang                                         MatAssemblyEnd_SeqDense,
2002905e6a2fSBarry Smith                                         MatSetOption_SeqDense,
2003905e6a2fSBarry Smith                                         MatZeroEntries_SeqDense,
2004d519adbfSMatthew Knepley                                 /* 24*/ MatZeroRows_SeqDense,
2005db4efbfdSBarry Smith                                         0,
2006db4efbfdSBarry Smith                                         0,
2007db4efbfdSBarry Smith                                         0,
2008db4efbfdSBarry Smith                                         0,
20094994cf47SJed Brown                                 /* 29*/ MatSetUp_SeqDense,
2010273d9f13SBarry Smith                                         0,
2011905e6a2fSBarry Smith                                         0,
201273a71a0fSBarry Smith                                         0,
201373a71a0fSBarry Smith                                         0,
2014d519adbfSMatthew Knepley                                 /* 34*/ MatDuplicate_SeqDense,
2015a5ae1ecdSBarry Smith                                         0,
2016a5ae1ecdSBarry Smith                                         0,
2017a5ae1ecdSBarry Smith                                         0,
2018a5ae1ecdSBarry Smith                                         0,
2019d519adbfSMatthew Knepley                                 /* 39*/ MatAXPY_SeqDense,
2020a5ae1ecdSBarry Smith                                         MatGetSubMatrices_SeqDense,
2021a5ae1ecdSBarry Smith                                         0,
20224b0e389bSBarry Smith                                         MatGetValues_SeqDense,
2023a5ae1ecdSBarry Smith                                         MatCopy_SeqDense,
2024d519adbfSMatthew Knepley                                 /* 44*/ MatGetRowMax_SeqDense,
2025a5ae1ecdSBarry Smith                                         MatScale_SeqDense,
2026a5ae1ecdSBarry Smith                                         0,
2027a5ae1ecdSBarry Smith                                         0,
2028a5ae1ecdSBarry Smith                                         0,
202973a71a0fSBarry Smith                                 /* 49*/ MatSetRandom_SeqDense,
2030a5ae1ecdSBarry Smith                                         0,
2031a5ae1ecdSBarry Smith                                         0,
2032a5ae1ecdSBarry Smith                                         0,
2033a5ae1ecdSBarry Smith                                         0,
2034d519adbfSMatthew Knepley                                 /* 54*/ 0,
2035a5ae1ecdSBarry Smith                                         0,
2036a5ae1ecdSBarry Smith                                         0,
2037a5ae1ecdSBarry Smith                                         0,
2038a5ae1ecdSBarry Smith                                         0,
2039d519adbfSMatthew Knepley                                 /* 59*/ 0,
2040e03a110bSBarry Smith                                         MatDestroy_SeqDense,
2041e03a110bSBarry Smith                                         MatView_SeqDense,
2042357abbc8SBarry Smith                                         0,
204397304618SKris Buschelman                                         0,
2044d519adbfSMatthew Knepley                                 /* 64*/ 0,
204597304618SKris Buschelman                                         0,
204697304618SKris Buschelman                                         0,
204797304618SKris Buschelman                                         0,
204897304618SKris Buschelman                                         0,
2049d519adbfSMatthew Knepley                                 /* 69*/ MatGetRowMaxAbs_SeqDense,
205097304618SKris Buschelman                                         0,
205197304618SKris Buschelman                                         0,
205297304618SKris Buschelman                                         0,
205397304618SKris Buschelman                                         0,
2054d519adbfSMatthew Knepley                                 /* 74*/ 0,
205597304618SKris Buschelman                                         0,
205697304618SKris Buschelman                                         0,
205797304618SKris Buschelman                                         0,
205897304618SKris Buschelman                                         0,
2059d519adbfSMatthew Knepley                                 /* 79*/ 0,
206097304618SKris Buschelman                                         0,
206197304618SKris Buschelman                                         0,
206297304618SKris Buschelman                                         0,
20635bba2384SShri Abhyankar                                 /* 83*/ MatLoad_SeqDense,
2064865e5f61SKris Buschelman                                         0,
20651cbb95d3SBarry Smith                                         MatIsHermitian_SeqDense,
2066865e5f61SKris Buschelman                                         0,
2067865e5f61SKris Buschelman                                         0,
2068865e5f61SKris Buschelman                                         0,
2069d519adbfSMatthew Knepley                                 /* 89*/ MatMatMult_SeqDense_SeqDense,
2070a9fe9ddaSSatish Balay                                         MatMatMultSymbolic_SeqDense_SeqDense,
2071a9fe9ddaSSatish Balay                                         MatMatMultNumeric_SeqDense_SeqDense,
2072865e5f61SKris Buschelman                                         0,
2073865e5f61SKris Buschelman                                         0,
2074d519adbfSMatthew Knepley                                 /* 94*/ 0,
20755df89d91SHong Zhang                                         0,
20765df89d91SHong Zhang                                         0,
20775df89d91SHong Zhang                                         0,
2078284134d9SBarry Smith                                         0,
2079d519adbfSMatthew Knepley                                 /* 99*/ 0,
2080284134d9SBarry Smith                                         0,
2081284134d9SBarry Smith                                         0,
2082ba337c44SJed Brown                                         MatConjugate_SeqDense,
2083f73d5cc4SBarry Smith                                         0,
2084ba337c44SJed Brown                                 /*104*/ 0,
2085ba337c44SJed Brown                                         MatRealPart_SeqDense,
2086ba337c44SJed Brown                                         MatImaginaryPart_SeqDense,
2087985db425SBarry Smith                                         0,
2088985db425SBarry Smith                                         0,
208985e2c93fSHong Zhang                                 /*109*/ MatMatSolve_SeqDense,
2090985db425SBarry Smith                                         0,
20918d0534beSBarry Smith                                         MatGetRowMin_SeqDense,
2092aabbc4fbSShri Abhyankar                                         MatGetColumnVector_SeqDense,
2093aabbc4fbSShri Abhyankar                                         0,
2094aabbc4fbSShri Abhyankar                                 /*114*/ 0,
2095aabbc4fbSShri Abhyankar                                         0,
2096aabbc4fbSShri Abhyankar                                         0,
2097aabbc4fbSShri Abhyankar                                         0,
2098aabbc4fbSShri Abhyankar                                         0,
2099aabbc4fbSShri Abhyankar                                 /*119*/ 0,
2100aabbc4fbSShri Abhyankar                                         0,
2101aabbc4fbSShri Abhyankar                                         0,
21020716a85fSBarry Smith                                         0,
21030716a85fSBarry Smith                                         0,
21040716a85fSBarry Smith                                 /*124*/ 0,
21055df89d91SHong Zhang                                         MatGetColumnNorms_SeqDense,
21065df89d91SHong Zhang                                         0,
21075df89d91SHong Zhang                                         0,
21085df89d91SHong Zhang                                         0,
21095df89d91SHong Zhang                                 /*129*/ 0,
211075648e8dSHong Zhang                                         MatTransposeMatMult_SeqDense_SeqDense,
211175648e8dSHong Zhang                                         MatTransposeMatMultSymbolic_SeqDense_SeqDense,
211275648e8dSHong Zhang                                         MatTransposeMatMultNumeric_SeqDense_SeqDense,
21133964eb88SJed Brown                                         0,
21143964eb88SJed Brown                                 /*134*/ 0,
21153964eb88SJed Brown                                         0,
21163964eb88SJed Brown                                         0,
21173964eb88SJed Brown                                         0,
21183964eb88SJed Brown                                         0,
21193964eb88SJed Brown                                 /*139*/ 0,
2120f9426fe0SMark Adams                                         0,
21213964eb88SJed Brown                                         0
2122985db425SBarry Smith };
212390ace30eSBarry Smith 
21244a2ae208SSatish Balay #undef __FUNCT__
21254a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense"
21264b828684SBarry Smith /*@C
2127fafbff53SBarry Smith    MatCreateSeqDense - Creates a sequential dense matrix that
2128d65003e9SLois Curfman McInnes    is stored in column major order (the usual Fortran 77 manner). Many
2129d65003e9SLois Curfman McInnes    of the matrix operations use the BLAS and LAPACK routines.
2130289bc588SBarry Smith 
2131db81eaa0SLois Curfman McInnes    Collective on MPI_Comm
2132db81eaa0SLois Curfman McInnes 
213320563c6bSBarry Smith    Input Parameters:
2134db81eaa0SLois Curfman McInnes +  comm - MPI communicator, set to PETSC_COMM_SELF
21350c775827SLois Curfman McInnes .  m - number of rows
213618f449edSLois Curfman McInnes .  n - number of columns
21370298fd71SBarry Smith -  data - optional location of matrix data in column major order.  Set data=NULL for PETSc
2138dfc5480cSLois Curfman McInnes    to control all matrix memory allocation.
213920563c6bSBarry Smith 
214020563c6bSBarry Smith    Output Parameter:
214144cd7ae7SLois Curfman McInnes .  A - the matrix
214220563c6bSBarry Smith 
2143b259b22eSLois Curfman McInnes    Notes:
214418f449edSLois Curfman McInnes    The data input variable is intended primarily for Fortran programmers
214518f449edSLois Curfman McInnes    who wish to allocate their own matrix memory space.  Most users should
21460298fd71SBarry Smith    set data=NULL.
214718f449edSLois Curfman McInnes 
2148027ccd11SLois Curfman McInnes    Level: intermediate
2149027ccd11SLois Curfman McInnes 
2150dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS
2151d65003e9SLois Curfman McInnes 
215269b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues()
215320563c6bSBarry Smith @*/
21547087cfbeSBarry Smith PetscErrorCode  MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A)
2155289bc588SBarry Smith {
2156dfbe8321SBarry Smith   PetscErrorCode ierr;
21573b2fbd54SBarry Smith 
21583a40ed3dSBarry Smith   PetscFunctionBegin;
2159f69a0ea3SMatthew Knepley   ierr = MatCreate(comm,A);CHKERRQ(ierr);
2160f69a0ea3SMatthew Knepley   ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr);
2161273d9f13SBarry Smith   ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr);
2162273d9f13SBarry Smith   ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr);
2163273d9f13SBarry Smith   PetscFunctionReturn(0);
2164273d9f13SBarry Smith }
2165273d9f13SBarry Smith 
21664a2ae208SSatish Balay #undef __FUNCT__
2167afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation"
2168273d9f13SBarry Smith /*@C
2169273d9f13SBarry Smith    MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements
2170273d9f13SBarry Smith 
2171273d9f13SBarry Smith    Collective on MPI_Comm
2172273d9f13SBarry Smith 
2173273d9f13SBarry Smith    Input Parameters:
21741c4f3114SJed Brown +  B - the matrix
21750298fd71SBarry Smith -  data - the array (or NULL)
2176273d9f13SBarry Smith 
2177273d9f13SBarry Smith    Notes:
2178273d9f13SBarry Smith    The data input variable is intended primarily for Fortran programmers
2179273d9f13SBarry Smith    who wish to allocate their own matrix memory space.  Most users should
2180284134d9SBarry Smith    need not call this routine.
2181273d9f13SBarry Smith 
2182273d9f13SBarry Smith    Level: intermediate
2183273d9f13SBarry Smith 
2184273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS
2185273d9f13SBarry Smith 
218669b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA()
2187867c911aSBarry Smith 
2188273d9f13SBarry Smith @*/
21897087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation(Mat B,PetscScalar data[])
2190273d9f13SBarry Smith {
21914ac538c5SBarry Smith   PetscErrorCode ierr;
2192a23d5eceSKris Buschelman 
2193a23d5eceSKris Buschelman   PetscFunctionBegin;
21944ac538c5SBarry Smith   ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr);
2195a23d5eceSKris Buschelman   PetscFunctionReturn(0);
2196a23d5eceSKris Buschelman }
2197a23d5eceSKris Buschelman 
2198a23d5eceSKris Buschelman #undef __FUNCT__
2199afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense"
22007087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data)
2201a23d5eceSKris Buschelman {
2202273d9f13SBarry Smith   Mat_SeqDense   *b;
2203dfbe8321SBarry Smith   PetscErrorCode ierr;
2204273d9f13SBarry Smith 
2205273d9f13SBarry Smith   PetscFunctionBegin;
2206273d9f13SBarry Smith   B->preallocated = PETSC_TRUE;
2207a868139aSShri Abhyankar 
220834ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr);
220934ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr);
221034ef9618SShri Abhyankar 
2211273d9f13SBarry Smith   b       = (Mat_SeqDense*)B->data;
221286d161a7SShri Abhyankar   b->Mmax = B->rmap->n;
221386d161a7SShri Abhyankar   b->Nmax = B->cmap->n;
221486d161a7SShri Abhyankar   if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n;
221586d161a7SShri Abhyankar 
22169e8f95c4SLisandro Dalcin   if (!data) { /* petsc-allocated storage */
22179e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2218e92229d0SSatish Balay     ierr = PetscCalloc1((size_t)b->lda*b->Nmax,&b->v);CHKERRQ(ierr);
22193bb1ff40SBarry Smith     ierr = PetscLogObjectMemory((PetscObject)B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
22202205254eSKarl Rupp 
22219e8f95c4SLisandro Dalcin     b->user_alloc = PETSC_FALSE;
2222273d9f13SBarry Smith   } else { /* user-allocated storage */
22239e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2224273d9f13SBarry Smith     b->v          = data;
2225273d9f13SBarry Smith     b->user_alloc = PETSC_TRUE;
2226273d9f13SBarry Smith   }
22270450473dSBarry Smith   B->assembled = PETSC_TRUE;
2228273d9f13SBarry Smith   PetscFunctionReturn(0);
2229273d9f13SBarry Smith }
2230273d9f13SBarry Smith 
223165b80a83SHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
22321b807ce4Svictorle #undef __FUNCT__
22338baccfbdSHong Zhang #define __FUNCT__ "MatConvert_SeqDense_Elemental"
22348baccfbdSHong Zhang PETSC_EXTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat)
22358baccfbdSHong Zhang {
2236d77f618aSHong Zhang   Mat            mat_elemental;
2237d77f618aSHong Zhang   PetscErrorCode ierr;
2238d77f618aSHong Zhang   PetscScalar    *array,*v_colwise;
2239d77f618aSHong Zhang   PetscInt       M=A->rmap->N,N=A->cmap->N,i,j,k,*rows,*cols;
2240d77f618aSHong Zhang 
22418baccfbdSHong Zhang   PetscFunctionBegin;
2242d77f618aSHong Zhang   ierr = PetscMalloc3(M*N,&v_colwise,M,&rows,N,&cols);CHKERRQ(ierr);
2243d77f618aSHong Zhang   ierr = MatDenseGetArray(A,&array);CHKERRQ(ierr);
2244d77f618aSHong Zhang   /* convert column-wise array into row-wise v_colwise, see MatSetValues_Elemental() */
2245d77f618aSHong Zhang   k = 0;
2246d77f618aSHong Zhang   for (j=0; j<N; j++) {
2247d77f618aSHong Zhang     cols[j] = j;
2248d77f618aSHong Zhang     for (i=0; i<M; i++) {
2249d77f618aSHong Zhang       v_colwise[j*M+i] = array[k++];
2250d77f618aSHong Zhang     }
2251d77f618aSHong Zhang   }
2252d77f618aSHong Zhang   for (i=0; i<M; i++) {
2253d77f618aSHong Zhang     rows[i] = i;
2254d77f618aSHong Zhang   }
2255d77f618aSHong Zhang   ierr = MatDenseRestoreArray(A,&array);CHKERRQ(ierr);
2256d77f618aSHong Zhang 
2257d77f618aSHong Zhang   ierr = MatCreate(PetscObjectComm((PetscObject)A), &mat_elemental);CHKERRQ(ierr);
2258d77f618aSHong Zhang   ierr = MatSetSizes(mat_elemental,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr);
2259d77f618aSHong Zhang   ierr = MatSetType(mat_elemental,MATELEMENTAL);CHKERRQ(ierr);
2260d77f618aSHong Zhang   ierr = MatSetUp(mat_elemental);CHKERRQ(ierr);
2261d77f618aSHong Zhang 
2262d77f618aSHong Zhang   /* PETSc-Elemental interaface uses axpy for setting off-processor entries, only ADD_VALUES is allowed */
2263d77f618aSHong Zhang   ierr = MatSetValues(mat_elemental,M,rows,N,cols,v_colwise,ADD_VALUES);CHKERRQ(ierr);
2264d77f618aSHong Zhang   ierr = MatAssemblyBegin(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2265d77f618aSHong Zhang   ierr = MatAssemblyEnd(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2266d77f618aSHong Zhang   ierr = PetscFree3(v_colwise,rows,cols);CHKERRQ(ierr);
2267d77f618aSHong Zhang 
2268d77f618aSHong Zhang   if (reuse == MAT_REUSE_MATRIX) {
2269d77f618aSHong Zhang     ierr = MatHeaderReplace(A,mat_elemental);CHKERRQ(ierr);
2270d77f618aSHong Zhang   } else {
2271d77f618aSHong Zhang     *newmat = mat_elemental;
2272d77f618aSHong Zhang   }
22738baccfbdSHong Zhang   PetscFunctionReturn(0);
22748baccfbdSHong Zhang }
227565b80a83SHong Zhang #endif
22768baccfbdSHong Zhang 
22778baccfbdSHong Zhang #undef __FUNCT__
22781b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA"
22791b807ce4Svictorle /*@C
22801b807ce4Svictorle   MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array
22811b807ce4Svictorle 
22821b807ce4Svictorle   Input parameter:
22831b807ce4Svictorle + A - the matrix
22841b807ce4Svictorle - lda - the leading dimension
22851b807ce4Svictorle 
22861b807ce4Svictorle   Notes:
2287867c911aSBarry Smith   This routine is to be used in conjunction with MatSeqDenseSetPreallocation();
22881b807ce4Svictorle   it asserts that the preallocation has a leading dimension (the LDA parameter
22891b807ce4Svictorle   of Blas and Lapack fame) larger than M, the first dimension of the matrix.
22901b807ce4Svictorle 
22911b807ce4Svictorle   Level: intermediate
22921b807ce4Svictorle 
22931b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS
22941b807ce4Svictorle 
2295284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize()
2296867c911aSBarry Smith 
22971b807ce4Svictorle @*/
22987087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetLDA(Mat B,PetscInt lda)
22991b807ce4Svictorle {
23001b807ce4Svictorle   Mat_SeqDense *b = (Mat_SeqDense*)B->data;
230121a2c019SBarry Smith 
23021b807ce4Svictorle   PetscFunctionBegin;
2303e32f2f54SBarry 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);
23041b807ce4Svictorle   b->lda       = lda;
230521a2c019SBarry Smith   b->changelda = PETSC_FALSE;
230621a2c019SBarry Smith   b->Mmax      = PetscMax(b->Mmax,lda);
23071b807ce4Svictorle   PetscFunctionReturn(0);
23081b807ce4Svictorle }
23091b807ce4Svictorle 
23100bad9183SKris Buschelman /*MC
2311fafad747SKris Buschelman    MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices.
23120bad9183SKris Buschelman 
23130bad9183SKris Buschelman    Options Database Keys:
23140bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions()
23150bad9183SKris Buschelman 
23160bad9183SKris Buschelman   Level: beginner
23170bad9183SKris Buschelman 
231889665df3SBarry Smith .seealso: MatCreateSeqDense()
231989665df3SBarry Smith 
23200bad9183SKris Buschelman M*/
23210bad9183SKris Buschelman 
23224a2ae208SSatish Balay #undef __FUNCT__
23234a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense"
23248cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatCreate_SeqDense(Mat B)
2325273d9f13SBarry Smith {
2326273d9f13SBarry Smith   Mat_SeqDense   *b;
2327dfbe8321SBarry Smith   PetscErrorCode ierr;
23287c334f02SBarry Smith   PetscMPIInt    size;
2329273d9f13SBarry Smith 
2330273d9f13SBarry Smith   PetscFunctionBegin;
2331ce94432eSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr);
2332e32f2f54SBarry Smith   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1");
233355659b69SBarry Smith 
2334b00a9115SJed Brown   ierr    = PetscNewLog(B,&b);CHKERRQ(ierr);
2335549d3d68SSatish Balay   ierr    = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr);
233644cd7ae7SLois Curfman McInnes   B->data = (void*)b;
233718f449edSLois Curfman McInnes 
233844cd7ae7SLois Curfman McInnes   b->pivots      = 0;
2339273d9f13SBarry Smith   b->roworiented = PETSC_TRUE;
2340273d9f13SBarry Smith   b->v           = 0;
234121a2c019SBarry Smith   b->changelda   = PETSC_FALSE;
23424e220ebcSLois Curfman McInnes 
2343bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr);
2344bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr);
2345bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr);
23468baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
23478baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr);
23488baccfbdSHong Zhang #endif
2349bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr);
2350bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaij_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
2351bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
2352bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
23533bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaij_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
23543bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
23553bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaij_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
235617667f90SBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr);
23573a40ed3dSBarry Smith   PetscFunctionReturn(0);
2358289bc588SBarry Smith }
2359