xref: /petsc/src/mat/impls/dense/seq/dense.c (revision d9ca1df42eda25bc875149d6d493aad6e204c9ff)
1be1d678aSKris Buschelman 
267e560aaSBarry Smith /*
367e560aaSBarry Smith      Defines the basic matrix operations for sequential dense.
467e560aaSBarry Smith */
5289bc588SBarry Smith 
6dec5eb66SMatthew G Knepley #include <../src/mat/impls/dense/seq/dense.h> /*I "petscmat.h" I*/
7c6db04a5SJed Brown #include <petscblaslapack.h>
8289bc588SBarry Smith 
96a63e612SBarry Smith #include <../src/mat/impls/aij/seq/aij.h>
10b2573a8aSBarry Smith 
116a63e612SBarry Smith #undef __FUNCT__
126a63e612SBarry Smith #define __FUNCT__ "MatConvert_SeqDense_SeqAIJ"
138cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatConvert_SeqDense_SeqAIJ(Mat A, MatType newtype,MatReuse reuse,Mat *newmat)
146a63e612SBarry Smith {
156a63e612SBarry Smith   Mat            B;
166a63e612SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
176a63e612SBarry Smith   PetscErrorCode ierr;
189399e1b8SMatthew G. Knepley   PetscInt       i, j;
199399e1b8SMatthew G. Knepley   PetscInt       *rows, *nnz;
209399e1b8SMatthew G. Knepley   MatScalar      *aa = a->v, *vals;
216a63e612SBarry Smith 
226a63e612SBarry Smith   PetscFunctionBegin;
23ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr);
246a63e612SBarry Smith   ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr);
256a63e612SBarry Smith   ierr = MatSetType(B,MATSEQAIJ);CHKERRQ(ierr);
269399e1b8SMatthew G. Knepley   ierr = PetscCalloc3(A->rmap->n,&rows,A->rmap->n,&nnz,A->rmap->n,&vals);CHKERRQ(ierr);
279399e1b8SMatthew G. Knepley   for (j=0; j<A->cmap->n; j++) {
289399e1b8SMatthew G. Knepley     for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) ++nnz[i];
296a63e612SBarry Smith     aa += a->lda;
306a63e612SBarry Smith   }
319399e1b8SMatthew G. Knepley   ierr = MatSeqAIJSetPreallocation(B,PETSC_DETERMINE,nnz);CHKERRQ(ierr);
329399e1b8SMatthew G. Knepley   aa = a->v;
339399e1b8SMatthew G. Knepley   for (j=0; j<A->cmap->n; j++) {
349399e1b8SMatthew G. Knepley     PetscInt numRows = 0;
359399e1b8SMatthew G. Knepley     for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) {rows[numRows] = i; vals[numRows++] = aa[i];}
369399e1b8SMatthew G. Knepley     ierr = MatSetValues(B,numRows,rows,1,&j,vals,INSERT_VALUES);CHKERRQ(ierr);
379399e1b8SMatthew G. Knepley     aa  += a->lda;
389399e1b8SMatthew G. Knepley   }
399399e1b8SMatthew G. Knepley   ierr = PetscFree3(rows,nnz,vals);CHKERRQ(ierr);
406a63e612SBarry Smith   ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
416a63e612SBarry Smith   ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
426a63e612SBarry Smith 
436a63e612SBarry Smith   if (reuse == MAT_REUSE_MATRIX) {
446a63e612SBarry Smith     ierr = MatHeaderReplace(A,B);CHKERRQ(ierr);
456a63e612SBarry Smith   } else {
466a63e612SBarry Smith     *newmat = B;
476a63e612SBarry Smith   }
486a63e612SBarry Smith   PetscFunctionReturn(0);
496a63e612SBarry Smith }
506a63e612SBarry Smith 
514a2ae208SSatish Balay #undef __FUNCT__
524a2ae208SSatish Balay #define __FUNCT__ "MatAXPY_SeqDense"
53f4df32b1SMatthew Knepley PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str)
541987afe7SBarry Smith {
551987afe7SBarry Smith   Mat_SeqDense   *x     = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data;
56f4df32b1SMatthew Knepley   PetscScalar    oalpha = alpha;
5713f74950SBarry Smith   PetscInt       j;
580805154bSBarry Smith   PetscBLASInt   N,m,ldax,lday,one = 1;
59efee365bSSatish Balay   PetscErrorCode ierr;
603a40ed3dSBarry Smith 
613a40ed3dSBarry Smith   PetscFunctionBegin;
62c5df96a5SBarry Smith   ierr = PetscBLASIntCast(X->rmap->n*X->cmap->n,&N);CHKERRQ(ierr);
63c5df96a5SBarry Smith   ierr = PetscBLASIntCast(X->rmap->n,&m);CHKERRQ(ierr);
64c5df96a5SBarry Smith   ierr = PetscBLASIntCast(x->lda,&ldax);CHKERRQ(ierr);
65c5df96a5SBarry Smith   ierr = PetscBLASIntCast(y->lda,&lday);CHKERRQ(ierr);
66a5ce6ee0Svictorle   if (ldax>m || lday>m) {
67d0f46423SBarry Smith     for (j=0; j<X->cmap->n; j++) {
688b83055fSJed Brown       PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&m,&oalpha,x->v+j*ldax,&one,y->v+j*lday,&one));
69a5ce6ee0Svictorle     }
70a5ce6ee0Svictorle   } else {
718b83055fSJed Brown     PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&N,&oalpha,x->v,&one,y->v,&one));
72a5ce6ee0Svictorle   }
73a3fa217bSJose E. Roman   ierr = PetscObjectStateIncrease((PetscObject)Y);CHKERRQ(ierr);
740450473dSBarry Smith   ierr = PetscLogFlops(PetscMax(2*N-1,0));CHKERRQ(ierr);
753a40ed3dSBarry Smith   PetscFunctionReturn(0);
761987afe7SBarry Smith }
771987afe7SBarry Smith 
784a2ae208SSatish Balay #undef __FUNCT__
794a2ae208SSatish Balay #define __FUNCT__ "MatGetInfo_SeqDense"
80dfbe8321SBarry Smith PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info)
81289bc588SBarry Smith {
82d0f46423SBarry Smith   PetscInt N = A->rmap->n*A->cmap->n;
833a40ed3dSBarry Smith 
843a40ed3dSBarry Smith   PetscFunctionBegin;
854e220ebcSLois Curfman McInnes   info->block_size        = 1.0;
864e220ebcSLois Curfman McInnes   info->nz_allocated      = (double)N;
876de62eeeSBarry Smith   info->nz_used           = (double)N;
886de62eeeSBarry Smith   info->nz_unneeded       = (double)0;
894e220ebcSLois Curfman McInnes   info->assemblies        = (double)A->num_ass;
904e220ebcSLois Curfman McInnes   info->mallocs           = 0;
917adad957SLisandro Dalcin   info->memory            = ((PetscObject)A)->mem;
924e220ebcSLois Curfman McInnes   info->fill_ratio_given  = 0;
934e220ebcSLois Curfman McInnes   info->fill_ratio_needed = 0;
944e220ebcSLois Curfman McInnes   info->factor_mallocs    = 0;
953a40ed3dSBarry Smith   PetscFunctionReturn(0);
96289bc588SBarry Smith }
97289bc588SBarry Smith 
984a2ae208SSatish Balay #undef __FUNCT__
994a2ae208SSatish Balay #define __FUNCT__ "MatScale_SeqDense"
100f4df32b1SMatthew Knepley PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha)
10180cd9d93SLois Curfman McInnes {
102273d9f13SBarry Smith   Mat_SeqDense   *a     = (Mat_SeqDense*)A->data;
103f4df32b1SMatthew Knepley   PetscScalar    oalpha = alpha;
104efee365bSSatish Balay   PetscErrorCode ierr;
105c5df96a5SBarry Smith   PetscBLASInt   one = 1,j,nz,lda;
10680cd9d93SLois Curfman McInnes 
1073a40ed3dSBarry Smith   PetscFunctionBegin;
108c5df96a5SBarry Smith   ierr = PetscBLASIntCast(a->lda,&lda);CHKERRQ(ierr);
109d0f46423SBarry Smith   if (lda>A->rmap->n) {
110c5df96a5SBarry Smith     ierr = PetscBLASIntCast(A->rmap->n,&nz);CHKERRQ(ierr);
111d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1128b83055fSJed Brown       PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v+j*lda,&one));
113a5ce6ee0Svictorle     }
114a5ce6ee0Svictorle   } else {
115c5df96a5SBarry Smith     ierr = PetscBLASIntCast(A->rmap->n*A->cmap->n,&nz);CHKERRQ(ierr);
1168b83055fSJed Brown     PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v,&one));
117a5ce6ee0Svictorle   }
118efee365bSSatish Balay   ierr = PetscLogFlops(nz);CHKERRQ(ierr);
1193a40ed3dSBarry Smith   PetscFunctionReturn(0);
12080cd9d93SLois Curfman McInnes }
12180cd9d93SLois Curfman McInnes 
1221cbb95d3SBarry Smith #undef __FUNCT__
1231cbb95d3SBarry Smith #define __FUNCT__ "MatIsHermitian_SeqDense"
124ace3abfcSBarry Smith PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscBool  *fl)
1251cbb95d3SBarry Smith {
1261cbb95d3SBarry Smith   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
127d0f46423SBarry Smith   PetscInt     i,j,m = A->rmap->n,N;
1281cbb95d3SBarry Smith   PetscScalar  *v = a->v;
1291cbb95d3SBarry Smith 
1301cbb95d3SBarry Smith   PetscFunctionBegin;
1311cbb95d3SBarry Smith   *fl = PETSC_FALSE;
132d0f46423SBarry Smith   if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0);
1331cbb95d3SBarry Smith   N = a->lda;
1341cbb95d3SBarry Smith 
1351cbb95d3SBarry Smith   for (i=0; i<m; i++) {
1361cbb95d3SBarry Smith     for (j=i+1; j<m; j++) {
1371cbb95d3SBarry Smith       if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) PetscFunctionReturn(0);
1381cbb95d3SBarry Smith     }
1391cbb95d3SBarry Smith   }
1401cbb95d3SBarry Smith   *fl = PETSC_TRUE;
1411cbb95d3SBarry Smith   PetscFunctionReturn(0);
1421cbb95d3SBarry Smith }
1431cbb95d3SBarry Smith 
144b24902e0SBarry Smith #undef __FUNCT__
145b24902e0SBarry Smith #define __FUNCT__ "MatDuplicateNoCreate_SeqDense"
146719d5645SBarry Smith PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat newi,Mat A,MatDuplicateOption cpvalues)
147b24902e0SBarry Smith {
148b24902e0SBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data,*l;
149b24902e0SBarry Smith   PetscErrorCode ierr;
150b24902e0SBarry Smith   PetscInt       lda = (PetscInt)mat->lda,j,m;
151b24902e0SBarry Smith 
152b24902e0SBarry Smith   PetscFunctionBegin;
153aa5ea44dSBarry Smith   ierr = PetscLayoutReference(A->rmap,&newi->rmap);CHKERRQ(ierr);
154aa5ea44dSBarry Smith   ierr = PetscLayoutReference(A->cmap,&newi->cmap);CHKERRQ(ierr);
1550298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(newi,NULL);CHKERRQ(ierr);
156b24902e0SBarry Smith   if (cpvalues == MAT_COPY_VALUES) {
157b24902e0SBarry Smith     l = (Mat_SeqDense*)newi->data;
158d0f46423SBarry Smith     if (lda>A->rmap->n) {
159d0f46423SBarry Smith       m = A->rmap->n;
160d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
161b24902e0SBarry Smith         ierr = PetscMemcpy(l->v+j*m,mat->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
162b24902e0SBarry Smith       }
163b24902e0SBarry Smith     } else {
164d0f46423SBarry Smith       ierr = PetscMemcpy(l->v,mat->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
165b24902e0SBarry Smith     }
166b24902e0SBarry Smith   }
167b24902e0SBarry Smith   newi->assembled = PETSC_TRUE;
168b24902e0SBarry Smith   PetscFunctionReturn(0);
169b24902e0SBarry Smith }
170b24902e0SBarry Smith 
1714a2ae208SSatish Balay #undef __FUNCT__
1724a2ae208SSatish Balay #define __FUNCT__ "MatDuplicate_SeqDense"
173dfbe8321SBarry Smith PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat)
17402cad45dSBarry Smith {
1756849ba73SBarry Smith   PetscErrorCode ierr;
17602cad45dSBarry Smith 
1773a40ed3dSBarry Smith   PetscFunctionBegin;
178ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),newmat);CHKERRQ(ierr);
179d0f46423SBarry Smith   ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
1805c9eb25fSBarry Smith   ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
181719d5645SBarry Smith   ierr = MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues);CHKERRQ(ierr);
182b24902e0SBarry Smith   PetscFunctionReturn(0);
183b24902e0SBarry Smith }
184b24902e0SBarry Smith 
1856ee01492SSatish Balay 
1860481f469SBarry Smith extern PetscErrorCode MatLUFactor_SeqDense(Mat,IS,IS,const MatFactorInfo*);
187719d5645SBarry Smith 
1884a2ae208SSatish Balay #undef __FUNCT__
1894a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorNumeric_SeqDense"
1900481f469SBarry Smith PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
191289bc588SBarry Smith {
1924482741eSBarry Smith   MatFactorInfo  info;
193a093e273SMatthew Knepley   PetscErrorCode ierr;
1943a40ed3dSBarry Smith 
1953a40ed3dSBarry Smith   PetscFunctionBegin;
196c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
197719d5645SBarry Smith   ierr = MatLUFactor_SeqDense(fact,0,0,&info);CHKERRQ(ierr);
1983a40ed3dSBarry Smith   PetscFunctionReturn(0);
199289bc588SBarry Smith }
2006ee01492SSatish Balay 
2010b4b3355SBarry Smith #undef __FUNCT__
2024a2ae208SSatish Balay #define __FUNCT__ "MatSolve_SeqDense"
203dfbe8321SBarry Smith PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy)
204289bc588SBarry Smith {
205c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
2066849ba73SBarry Smith   PetscErrorCode ierr;
20787828ca2SBarry Smith   PetscScalar    *x,*y;
208c5df96a5SBarry Smith   PetscBLASInt   one = 1,info,m;
20967e560aaSBarry Smith 
2103a40ed3dSBarry Smith   PetscFunctionBegin;
211c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
2121ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
2131ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
214d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
215d5f3da31SBarry Smith   if (A->factortype == MAT_FACTOR_LU) {
216ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
217e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
218ae7cfcebSSatish Balay #else
2198b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
220e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
221ae7cfcebSSatish Balay #endif
222d5f3da31SBarry Smith   } else if (A->factortype == MAT_FACTOR_CHOLESKY) {
223ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
224e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
225ae7cfcebSSatish Balay #else
2268b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
227e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
228ae7cfcebSSatish Balay #endif
2292205254eSKarl Rupp   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
2301ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
2311ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
232dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
2333a40ed3dSBarry Smith   PetscFunctionReturn(0);
234289bc588SBarry Smith }
2356ee01492SSatish Balay 
2364a2ae208SSatish Balay #undef __FUNCT__
23785e2c93fSHong Zhang #define __FUNCT__ "MatMatSolve_SeqDense"
23885e2c93fSHong Zhang PetscErrorCode MatMatSolve_SeqDense(Mat A,Mat B,Mat X)
23985e2c93fSHong Zhang {
24085e2c93fSHong Zhang   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
24185e2c93fSHong Zhang   PetscErrorCode ierr;
24285e2c93fSHong Zhang   PetscScalar    *b,*x;
243efb80c78SLisandro Dalcin   PetscInt       n;
244783b601eSJed Brown   PetscBLASInt   nrhs,info,m;
245bda8bf91SBarry Smith   PetscBool      flg;
24685e2c93fSHong Zhang 
24785e2c93fSHong Zhang   PetscFunctionBegin;
248c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
2490298fd71SBarry Smith   ierr = PetscObjectTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr);
250ce94432eSBarry Smith   if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix B must be MATDENSE matrix");
2510298fd71SBarry Smith   ierr = PetscObjectTypeCompareAny((PetscObject)X,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr);
252ce94432eSBarry Smith   if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix X must be MATDENSE matrix");
253bda8bf91SBarry Smith 
2540298fd71SBarry Smith   ierr = MatGetSize(B,NULL,&n);CHKERRQ(ierr);
255c5df96a5SBarry Smith   ierr = PetscBLASIntCast(n,&nrhs);CHKERRQ(ierr);
2568c778c55SBarry Smith   ierr = MatDenseGetArray(B,&b);CHKERRQ(ierr);
2578c778c55SBarry Smith   ierr = MatDenseGetArray(X,&x);CHKERRQ(ierr);
25885e2c93fSHong Zhang 
259f272c775SHong Zhang   ierr = PetscMemcpy(x,b,m*nrhs*sizeof(PetscScalar));CHKERRQ(ierr);
26085e2c93fSHong Zhang 
26185e2c93fSHong Zhang   if (A->factortype == MAT_FACTOR_LU) {
26285e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_GETRS)
26385e2c93fSHong Zhang     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
26485e2c93fSHong Zhang #else
2658b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info));
26685e2c93fSHong Zhang     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
26785e2c93fSHong Zhang #endif
26885e2c93fSHong Zhang   } else if (A->factortype == MAT_FACTOR_CHOLESKY) {
26985e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_POTRS)
27085e2c93fSHong Zhang     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
27185e2c93fSHong Zhang #else
2728b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info));
27385e2c93fSHong Zhang     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
27485e2c93fSHong Zhang #endif
2752205254eSKarl Rupp   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
27685e2c93fSHong Zhang 
2778c778c55SBarry Smith   ierr = MatDenseRestoreArray(B,&b);CHKERRQ(ierr);
2788c778c55SBarry Smith   ierr = MatDenseRestoreArray(X,&x);CHKERRQ(ierr);
27985e2c93fSHong Zhang   ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr);
28085e2c93fSHong Zhang   PetscFunctionReturn(0);
28185e2c93fSHong Zhang }
28285e2c93fSHong Zhang 
28385e2c93fSHong Zhang #undef __FUNCT__
2844a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense"
285dfbe8321SBarry Smith PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy)
286da3a660dSBarry Smith {
287c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
288dfbe8321SBarry Smith   PetscErrorCode ierr;
28987828ca2SBarry Smith   PetscScalar    *x,*y;
290c5df96a5SBarry Smith   PetscBLASInt   one = 1,info,m;
29167e560aaSBarry Smith 
2923a40ed3dSBarry Smith   PetscFunctionBegin;
293c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
2941ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
2951ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
296d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
297752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
298da3a660dSBarry Smith   if (mat->pivots) {
299ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
300e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
301ae7cfcebSSatish Balay #else
3028b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
303e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve");
304ae7cfcebSSatish Balay #endif
3057a97a34bSBarry Smith   } else {
306ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
307e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
308ae7cfcebSSatish Balay #else
3098b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
310e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve");
311ae7cfcebSSatish Balay #endif
312da3a660dSBarry Smith   }
3131ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
3141ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
315dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
3163a40ed3dSBarry Smith   PetscFunctionReturn(0);
317da3a660dSBarry Smith }
3186ee01492SSatish Balay 
3194a2ae208SSatish Balay #undef __FUNCT__
3204a2ae208SSatish Balay #define __FUNCT__ "MatSolveAdd_SeqDense"
321dfbe8321SBarry Smith PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
322da3a660dSBarry Smith {
323c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
324dfbe8321SBarry Smith   PetscErrorCode ierr;
32587828ca2SBarry Smith   PetscScalar    *x,*y,sone = 1.0;
326da3a660dSBarry Smith   Vec            tmp = 0;
327c5df96a5SBarry Smith   PetscBLASInt   one = 1,info,m;
32867e560aaSBarry Smith 
3293a40ed3dSBarry Smith   PetscFunctionBegin;
330c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
3311ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
3321ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
333d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
334da3a660dSBarry Smith   if (yy == zz) {
33578b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
3363bb1ff40SBarry Smith     ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr);
33778b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
338da3a660dSBarry Smith   }
339d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
340752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
341da3a660dSBarry Smith   if (mat->pivots) {
342ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
343e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
344ae7cfcebSSatish Balay #else
3458b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
346e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
347ae7cfcebSSatish Balay #endif
348a8c6a408SBarry Smith   } else {
349ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
350e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
351ae7cfcebSSatish Balay #else
3528b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
353e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
354ae7cfcebSSatish Balay #endif
355da3a660dSBarry Smith   }
3566bf464f9SBarry Smith   if (tmp) {
3576bf464f9SBarry Smith     ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr);
3586bf464f9SBarry Smith     ierr = VecDestroy(&tmp);CHKERRQ(ierr);
3596bf464f9SBarry Smith   } else {
3606bf464f9SBarry Smith     ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);
3616bf464f9SBarry Smith   }
3621ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
3631ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
364dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
3653a40ed3dSBarry Smith   PetscFunctionReturn(0);
366da3a660dSBarry Smith }
36767e560aaSBarry Smith 
3684a2ae208SSatish Balay #undef __FUNCT__
3694a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense"
370dfbe8321SBarry Smith PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
371da3a660dSBarry Smith {
372c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
3736849ba73SBarry Smith   PetscErrorCode ierr;
37487828ca2SBarry Smith   PetscScalar    *x,*y,sone = 1.0;
375da3a660dSBarry Smith   Vec            tmp;
376c5df96a5SBarry Smith   PetscBLASInt   one = 1,info,m;
37767e560aaSBarry Smith 
3783a40ed3dSBarry Smith   PetscFunctionBegin;
379c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
380d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
3811ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
3821ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
383da3a660dSBarry Smith   if (yy == zz) {
38478b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
3853bb1ff40SBarry Smith     ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr);
38678b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
387da3a660dSBarry Smith   }
388d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
389752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
390da3a660dSBarry Smith   if (mat->pivots) {
391ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
392e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
393ae7cfcebSSatish Balay #else
3948b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
395e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
396ae7cfcebSSatish Balay #endif
3973a40ed3dSBarry Smith   } else {
398ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
399e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
400ae7cfcebSSatish Balay #else
4018b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
402e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
403ae7cfcebSSatish Balay #endif
404da3a660dSBarry Smith   }
40590f02eecSBarry Smith   if (tmp) {
4062dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr);
4076bf464f9SBarry Smith     ierr = VecDestroy(&tmp);CHKERRQ(ierr);
4083a40ed3dSBarry Smith   } else {
4092dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);
41090f02eecSBarry Smith   }
4111ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
4121ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
413dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
4143a40ed3dSBarry Smith   PetscFunctionReturn(0);
415da3a660dSBarry Smith }
416db4efbfdSBarry Smith 
417db4efbfdSBarry Smith /* ---------------------------------------------------------------*/
418db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots,
419db4efbfdSBarry Smith    rather than put it in the Mat->row slot.*/
420db4efbfdSBarry Smith #undef __FUNCT__
421db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactor_SeqDense"
4220481f469SBarry Smith PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo)
423db4efbfdSBarry Smith {
424db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF)
425db4efbfdSBarry Smith   PetscFunctionBegin;
426e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable.");
427db4efbfdSBarry Smith #else
428db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
429db4efbfdSBarry Smith   PetscErrorCode ierr;
430db4efbfdSBarry Smith   PetscBLASInt   n,m,info;
431db4efbfdSBarry Smith 
432db4efbfdSBarry Smith   PetscFunctionBegin;
433c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
434c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
435db4efbfdSBarry Smith   if (!mat->pivots) {
436854ce69bSBarry Smith     ierr = PetscMalloc1(A->rmap->n+1,&mat->pivots);CHKERRQ(ierr);
4373bb1ff40SBarry Smith     ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr);
438db4efbfdSBarry Smith   }
439db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
4408e57ea43SSatish Balay   ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
4418b83055fSJed Brown   PetscStackCallBLAS("LAPACKgetrf",LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info));
4428e57ea43SSatish Balay   ierr = PetscFPTrapPop();CHKERRQ(ierr);
4438e57ea43SSatish Balay 
444e32f2f54SBarry Smith   if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization");
445e32f2f54SBarry Smith   if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization");
446db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
447db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
448db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
449db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
450d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_LU;
451db4efbfdSBarry Smith 
452dc0b31edSSatish Balay   ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr);
453db4efbfdSBarry Smith #endif
454db4efbfdSBarry Smith   PetscFunctionReturn(0);
455db4efbfdSBarry Smith }
456db4efbfdSBarry Smith 
457db4efbfdSBarry Smith #undef __FUNCT__
458db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactor_SeqDense"
4590481f469SBarry Smith PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo)
460db4efbfdSBarry Smith {
461db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF)
462db4efbfdSBarry Smith   PetscFunctionBegin;
463e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable.");
464db4efbfdSBarry Smith #else
465db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
466db4efbfdSBarry Smith   PetscErrorCode ierr;
467c5df96a5SBarry Smith   PetscBLASInt   info,n;
468db4efbfdSBarry Smith 
469db4efbfdSBarry Smith   PetscFunctionBegin;
470c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
471db4efbfdSBarry Smith   ierr = PetscFree(mat->pivots);CHKERRQ(ierr);
472db4efbfdSBarry Smith 
473db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
4748b83055fSJed Brown   PetscStackCallBLAS("LAPACKpotrf",LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info));
475e32f2f54SBarry Smith   if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1);
476db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
477db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
478db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
479db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
480d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_CHOLESKY;
4812205254eSKarl Rupp 
482dc0b31edSSatish Balay   ierr = PetscLogFlops((A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr);
483db4efbfdSBarry Smith #endif
484db4efbfdSBarry Smith   PetscFunctionReturn(0);
485db4efbfdSBarry Smith }
486db4efbfdSBarry Smith 
487db4efbfdSBarry Smith 
488db4efbfdSBarry Smith #undef __FUNCT__
489db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense"
4900481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
491db4efbfdSBarry Smith {
492db4efbfdSBarry Smith   PetscErrorCode ierr;
493db4efbfdSBarry Smith   MatFactorInfo  info;
494db4efbfdSBarry Smith 
495db4efbfdSBarry Smith   PetscFunctionBegin;
496db4efbfdSBarry Smith   info.fill = 1.0;
4972205254eSKarl Rupp 
498c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
499719d5645SBarry Smith   ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr);
500db4efbfdSBarry Smith   PetscFunctionReturn(0);
501db4efbfdSBarry Smith }
502db4efbfdSBarry Smith 
503db4efbfdSBarry Smith #undef __FUNCT__
504db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense"
5050481f469SBarry Smith PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info)
506db4efbfdSBarry Smith {
507db4efbfdSBarry Smith   PetscFunctionBegin;
508c3ef05f6SHong Zhang   fact->assembled                  = PETSC_TRUE;
5091bbcc794SSatish Balay   fact->preallocated               = PETSC_TRUE;
510719d5645SBarry Smith   fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense;
511db4efbfdSBarry Smith   PetscFunctionReturn(0);
512db4efbfdSBarry Smith }
513db4efbfdSBarry Smith 
514db4efbfdSBarry Smith #undef __FUNCT__
515db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactorSymbolic_SeqDense"
5160481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info)
517db4efbfdSBarry Smith {
518db4efbfdSBarry Smith   PetscFunctionBegin;
519b66fe19dSMatthew G Knepley   fact->preallocated         = PETSC_TRUE;
520c3ef05f6SHong Zhang   fact->assembled            = PETSC_TRUE;
521719d5645SBarry Smith   fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense;
522db4efbfdSBarry Smith   PetscFunctionReturn(0);
523db4efbfdSBarry Smith }
524db4efbfdSBarry Smith 
525db4efbfdSBarry Smith #undef __FUNCT__
526db4efbfdSBarry Smith #define __FUNCT__ "MatGetFactor_seqdense_petsc"
5278cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact)
528db4efbfdSBarry Smith {
529db4efbfdSBarry Smith   PetscErrorCode ierr;
530db4efbfdSBarry Smith 
531db4efbfdSBarry Smith   PetscFunctionBegin;
532ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),fact);CHKERRQ(ierr);
533db4efbfdSBarry Smith   ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
534db4efbfdSBarry Smith   ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr);
535db4efbfdSBarry Smith   if (ftype == MAT_FACTOR_LU) {
536db4efbfdSBarry Smith     (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense;
537db4efbfdSBarry Smith   } else {
538db4efbfdSBarry Smith     (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense;
539db4efbfdSBarry Smith   }
540d5f3da31SBarry Smith   (*fact)->factortype = ftype;
541db4efbfdSBarry Smith   PetscFunctionReturn(0);
542db4efbfdSBarry Smith }
543db4efbfdSBarry Smith 
544289bc588SBarry Smith /* ------------------------------------------------------------------*/
5454a2ae208SSatish Balay #undef __FUNCT__
54641f059aeSBarry Smith #define __FUNCT__ "MatSOR_SeqDense"
54741f059aeSBarry Smith PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx)
548289bc588SBarry Smith {
549c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
550*d9ca1df4SBarry Smith   PetscScalar       *x,*v = mat->v,zero = 0.0,xt;
551*d9ca1df4SBarry Smith   const PetscScalar *b;
552dfbe8321SBarry Smith   PetscErrorCode    ierr;
553d0f46423SBarry Smith   PetscInt          m = A->rmap->n,i;
554c5df96a5SBarry Smith   PetscBLASInt      o = 1,bm;
555289bc588SBarry Smith 
5563a40ed3dSBarry Smith   PetscFunctionBegin;
557c5df96a5SBarry Smith   ierr = PetscBLASIntCast(m,&bm);CHKERRQ(ierr);
558289bc588SBarry Smith   if (flag & SOR_ZERO_INITIAL_GUESS) {
55971044d3cSBarry Smith     /* this is a hack fix, should have another version without the second BLASdot */
5602dcb1b2aSMatthew Knepley     ierr = VecSet(xx,zero);CHKERRQ(ierr);
561289bc588SBarry Smith   }
5621ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
563*d9ca1df4SBarry Smith   ierr = VecGetArrayRead(bb,&b);CHKERRQ(ierr);
564b965ef7fSBarry Smith   its  = its*lits;
565e32f2f54SBarry 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);
566289bc588SBarry Smith   while (its--) {
567fccaa45eSBarry Smith     if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) {
568289bc588SBarry Smith       for (i=0; i<m; i++) {
5698b83055fSJed Brown         PetscStackCallBLAS("BLASdot",xt   = b[i] - BLASdot_(&bm,v+i,&bm,x,&o));
57055a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
571289bc588SBarry Smith       }
572289bc588SBarry Smith     }
573fccaa45eSBarry Smith     if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) {
574289bc588SBarry Smith       for (i=m-1; i>=0; i--) {
5758b83055fSJed Brown         PetscStackCallBLAS("BLASdot",xt   = b[i] - BLASdot_(&bm,v+i,&bm,x,&o));
57655a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
577289bc588SBarry Smith       }
578289bc588SBarry Smith     }
579289bc588SBarry Smith   }
580*d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(bb,&b);CHKERRQ(ierr);
5811ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
5823a40ed3dSBarry Smith   PetscFunctionReturn(0);
583289bc588SBarry Smith }
584289bc588SBarry Smith 
585289bc588SBarry Smith /* -----------------------------------------------------------------*/
5864a2ae208SSatish Balay #undef __FUNCT__
5874a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense"
588dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy)
589289bc588SBarry Smith {
590c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
591*d9ca1df4SBarry Smith   const PetscScalar *v   = mat->v,*x;
592*d9ca1df4SBarry Smith   PetscScalar       *y;
593dfbe8321SBarry Smith   PetscErrorCode    ierr;
5940805154bSBarry Smith   PetscBLASInt      m, n,_One=1;
595ea709b57SSatish Balay   PetscScalar       _DOne=1.0,_DZero=0.0;
5963a40ed3dSBarry Smith 
5973a40ed3dSBarry Smith   PetscFunctionBegin;
598c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
599c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
600d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
601*d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
6021ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
6038b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One));
604*d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
6051ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
606dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
6073a40ed3dSBarry Smith   PetscFunctionReturn(0);
608289bc588SBarry Smith }
609800995b7SMatthew Knepley 
6104a2ae208SSatish Balay #undef __FUNCT__
6114a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense"
612dfbe8321SBarry Smith PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy)
613289bc588SBarry Smith {
614c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
615*d9ca1df4SBarry Smith   PetscScalar       *y,_DOne=1.0,_DZero=0.0;
616dfbe8321SBarry Smith   PetscErrorCode    ierr;
6170805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
618*d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
6193a40ed3dSBarry Smith 
6203a40ed3dSBarry Smith   PetscFunctionBegin;
621c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
622c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
623d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
624*d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
6251ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
6268b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One));
627*d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
6281ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
629dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr);
6303a40ed3dSBarry Smith   PetscFunctionReturn(0);
631289bc588SBarry Smith }
6326ee01492SSatish Balay 
6334a2ae208SSatish Balay #undef __FUNCT__
6344a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense"
635dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
636289bc588SBarry Smith {
637c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
638*d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
639*d9ca1df4SBarry Smith   PetscScalar       *y,_DOne=1.0;
640dfbe8321SBarry Smith   PetscErrorCode    ierr;
6410805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
6423a40ed3dSBarry Smith 
6433a40ed3dSBarry Smith   PetscFunctionBegin;
644c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
645c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
646d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
647600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
648*d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
6491ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
6508b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
651*d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
6521ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
653dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
6543a40ed3dSBarry Smith   PetscFunctionReturn(0);
655289bc588SBarry Smith }
6566ee01492SSatish Balay 
6574a2ae208SSatish Balay #undef __FUNCT__
6584a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense"
659dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
660289bc588SBarry Smith {
661c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
662*d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
663*d9ca1df4SBarry Smith   PetscScalar       *y;
664dfbe8321SBarry Smith   PetscErrorCode    ierr;
6650805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
66687828ca2SBarry Smith   PetscScalar       _DOne=1.0;
6673a40ed3dSBarry Smith 
6683a40ed3dSBarry Smith   PetscFunctionBegin;
669c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
670c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
671d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
672600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
673*d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
6741ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
6758b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
676*d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
6771ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
678dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
6793a40ed3dSBarry Smith   PetscFunctionReturn(0);
680289bc588SBarry Smith }
681289bc588SBarry Smith 
682289bc588SBarry Smith /* -----------------------------------------------------------------*/
6834a2ae208SSatish Balay #undef __FUNCT__
6844a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense"
68513f74950SBarry Smith PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
686289bc588SBarry Smith {
687c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
68887828ca2SBarry Smith   PetscScalar    *v;
6896849ba73SBarry Smith   PetscErrorCode ierr;
69013f74950SBarry Smith   PetscInt       i;
69167e560aaSBarry Smith 
6923a40ed3dSBarry Smith   PetscFunctionBegin;
693d0f46423SBarry Smith   *ncols = A->cmap->n;
694289bc588SBarry Smith   if (cols) {
695854ce69bSBarry Smith     ierr = PetscMalloc1(A->cmap->n+1,cols);CHKERRQ(ierr);
696d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) (*cols)[i] = i;
697289bc588SBarry Smith   }
698289bc588SBarry Smith   if (vals) {
699854ce69bSBarry Smith     ierr = PetscMalloc1(A->cmap->n+1,vals);CHKERRQ(ierr);
700289bc588SBarry Smith     v    = mat->v + row;
701d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;}
702289bc588SBarry Smith   }
7033a40ed3dSBarry Smith   PetscFunctionReturn(0);
704289bc588SBarry Smith }
7056ee01492SSatish Balay 
7064a2ae208SSatish Balay #undef __FUNCT__
7074a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense"
70813f74950SBarry Smith PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
709289bc588SBarry Smith {
710dfbe8321SBarry Smith   PetscErrorCode ierr;
7116e111a19SKarl Rupp 
712606d414cSSatish Balay   PetscFunctionBegin;
713606d414cSSatish Balay   if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);}
714606d414cSSatish Balay   if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); }
7153a40ed3dSBarry Smith   PetscFunctionReturn(0);
716289bc588SBarry Smith }
717289bc588SBarry Smith /* ----------------------------------------------------------------*/
7184a2ae208SSatish Balay #undef __FUNCT__
7194a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense"
72013f74950SBarry Smith PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv)
721289bc588SBarry Smith {
722c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
72313f74950SBarry Smith   PetscInt     i,j,idx=0;
724d6dfbf8fSBarry Smith 
7253a40ed3dSBarry Smith   PetscFunctionBegin;
726289bc588SBarry Smith   if (!mat->roworiented) {
727dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
728289bc588SBarry Smith       for (j=0; j<n; j++) {
729cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
7302515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
731e32f2f54SBarry 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);
73258804f6dSBarry Smith #endif
733289bc588SBarry Smith         for (i=0; i<m; i++) {
734cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
7352515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
736e32f2f54SBarry 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);
73758804f6dSBarry Smith #endif
738cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
739289bc588SBarry Smith         }
740289bc588SBarry Smith       }
7413a40ed3dSBarry Smith     } else {
742289bc588SBarry Smith       for (j=0; j<n; j++) {
743cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
7442515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
745e32f2f54SBarry 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);
74658804f6dSBarry Smith #endif
747289bc588SBarry Smith         for (i=0; i<m; i++) {
748cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
7492515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
750e32f2f54SBarry 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);
75158804f6dSBarry Smith #endif
752cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
753289bc588SBarry Smith         }
754289bc588SBarry Smith       }
755289bc588SBarry Smith     }
7563a40ed3dSBarry Smith   } else {
757dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
758e8d4e0b9SBarry Smith       for (i=0; i<m; i++) {
759cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
7602515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
761e32f2f54SBarry 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);
76258804f6dSBarry Smith #endif
763e8d4e0b9SBarry Smith         for (j=0; j<n; j++) {
764cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
7652515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
766e32f2f54SBarry 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);
76758804f6dSBarry Smith #endif
768cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
769e8d4e0b9SBarry Smith         }
770e8d4e0b9SBarry Smith       }
7713a40ed3dSBarry Smith     } else {
772289bc588SBarry Smith       for (i=0; i<m; i++) {
773cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
7742515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
775e32f2f54SBarry 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);
77658804f6dSBarry Smith #endif
777289bc588SBarry Smith         for (j=0; j<n; j++) {
778cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
7792515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
780e32f2f54SBarry 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);
78158804f6dSBarry Smith #endif
782cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
783289bc588SBarry Smith         }
784289bc588SBarry Smith       }
785289bc588SBarry Smith     }
786e8d4e0b9SBarry Smith   }
7873a40ed3dSBarry Smith   PetscFunctionReturn(0);
788289bc588SBarry Smith }
789e8d4e0b9SBarry Smith 
7904a2ae208SSatish Balay #undef __FUNCT__
7914a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense"
79213f74950SBarry Smith PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[])
793ae80bb75SLois Curfman McInnes {
794ae80bb75SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
79513f74950SBarry Smith   PetscInt     i,j;
796ae80bb75SLois Curfman McInnes 
7973a40ed3dSBarry Smith   PetscFunctionBegin;
798ae80bb75SLois Curfman McInnes   /* row-oriented output */
799ae80bb75SLois Curfman McInnes   for (i=0; i<m; i++) {
80097e567efSBarry Smith     if (indexm[i] < 0) {v += n;continue;}
801e32f2f54SBarry 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);
802ae80bb75SLois Curfman McInnes     for (j=0; j<n; j++) {
8036f31f424SBarry Smith       if (indexn[j] < 0) {v++; continue;}
804e32f2f54SBarry 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);
80597e567efSBarry Smith       *v++ = mat->v[indexn[j]*mat->lda + indexm[i]];
806ae80bb75SLois Curfman McInnes     }
807ae80bb75SLois Curfman McInnes   }
8083a40ed3dSBarry Smith   PetscFunctionReturn(0);
809ae80bb75SLois Curfman McInnes }
810ae80bb75SLois Curfman McInnes 
811289bc588SBarry Smith /* -----------------------------------------------------------------*/
812289bc588SBarry Smith 
8134a2ae208SSatish Balay #undef __FUNCT__
8145bba2384SShri Abhyankar #define __FUNCT__ "MatLoad_SeqDense"
815112444f4SShri Abhyankar PetscErrorCode MatLoad_SeqDense(Mat newmat,PetscViewer viewer)
816aabbc4fbSShri Abhyankar {
817aabbc4fbSShri Abhyankar   Mat_SeqDense   *a;
818aabbc4fbSShri Abhyankar   PetscErrorCode ierr;
819aabbc4fbSShri Abhyankar   PetscInt       *scols,i,j,nz,header[4];
820aabbc4fbSShri Abhyankar   int            fd;
821aabbc4fbSShri Abhyankar   PetscMPIInt    size;
822aabbc4fbSShri Abhyankar   PetscInt       *rowlengths = 0,M,N,*cols,grows,gcols;
823aabbc4fbSShri Abhyankar   PetscScalar    *vals,*svals,*v,*w;
824ce94432eSBarry Smith   MPI_Comm       comm;
825aabbc4fbSShri Abhyankar 
826aabbc4fbSShri Abhyankar   PetscFunctionBegin;
827ce94432eSBarry Smith   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
828aabbc4fbSShri Abhyankar   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
829aabbc4fbSShri Abhyankar   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor");
830aabbc4fbSShri Abhyankar   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
831aabbc4fbSShri Abhyankar   ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr);
832aabbc4fbSShri Abhyankar   if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object");
833aabbc4fbSShri Abhyankar   M = header[1]; N = header[2]; nz = header[3];
834aabbc4fbSShri Abhyankar 
835aabbc4fbSShri Abhyankar   /* set global size if not set already*/
836aabbc4fbSShri Abhyankar   if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) {
837aabbc4fbSShri Abhyankar     ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr);
838aabbc4fbSShri Abhyankar   } else {
839aabbc4fbSShri Abhyankar     /* if sizes and type are already set, check if the vector global sizes are correct */
840aabbc4fbSShri Abhyankar     ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr);
841aabbc4fbSShri 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);
842aabbc4fbSShri Abhyankar   }
8430298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr);
844aabbc4fbSShri Abhyankar 
845aabbc4fbSShri Abhyankar   if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */
846aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
847aabbc4fbSShri Abhyankar     v = a->v;
848aabbc4fbSShri Abhyankar     /* Allocate some temp space to read in the values and then flip them
849aabbc4fbSShri Abhyankar        from row major to column major */
850854ce69bSBarry Smith     ierr = PetscMalloc1(M*N > 0 ? M*N : 1,&w);CHKERRQ(ierr);
851aabbc4fbSShri Abhyankar     /* read in nonzero values */
852aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr);
853aabbc4fbSShri Abhyankar     /* now flip the values and store them in the matrix*/
854aabbc4fbSShri Abhyankar     for (j=0; j<N; j++) {
855aabbc4fbSShri Abhyankar       for (i=0; i<M; i++) {
856aabbc4fbSShri Abhyankar         *v++ =w[i*N+j];
857aabbc4fbSShri Abhyankar       }
858aabbc4fbSShri Abhyankar     }
859aabbc4fbSShri Abhyankar     ierr = PetscFree(w);CHKERRQ(ierr);
860aabbc4fbSShri Abhyankar   } else {
861aabbc4fbSShri Abhyankar     /* read row lengths */
862854ce69bSBarry Smith     ierr = PetscMalloc1(M+1,&rowlengths);CHKERRQ(ierr);
863aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr);
864aabbc4fbSShri Abhyankar 
865aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
866aabbc4fbSShri Abhyankar     v = a->v;
867aabbc4fbSShri Abhyankar 
868aabbc4fbSShri Abhyankar     /* read column indices and nonzeros */
869854ce69bSBarry Smith     ierr = PetscMalloc1(nz+1,&scols);CHKERRQ(ierr);
870aabbc4fbSShri Abhyankar     cols = scols;
871aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr);
872854ce69bSBarry Smith     ierr = PetscMalloc1(nz+1,&svals);CHKERRQ(ierr);
873aabbc4fbSShri Abhyankar     vals = svals;
874aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr);
875aabbc4fbSShri Abhyankar 
876aabbc4fbSShri Abhyankar     /* insert into matrix */
877aabbc4fbSShri Abhyankar     for (i=0; i<M; i++) {
878aabbc4fbSShri Abhyankar       for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j];
879aabbc4fbSShri Abhyankar       svals += rowlengths[i]; scols += rowlengths[i];
880aabbc4fbSShri Abhyankar     }
881aabbc4fbSShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
882aabbc4fbSShri Abhyankar     ierr = PetscFree(cols);CHKERRQ(ierr);
883aabbc4fbSShri Abhyankar     ierr = PetscFree(rowlengths);CHKERRQ(ierr);
884aabbc4fbSShri Abhyankar   }
885aabbc4fbSShri Abhyankar   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
886aabbc4fbSShri Abhyankar   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
887aabbc4fbSShri Abhyankar   PetscFunctionReturn(0);
888aabbc4fbSShri Abhyankar }
889aabbc4fbSShri Abhyankar 
890aabbc4fbSShri Abhyankar #undef __FUNCT__
8914a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII"
8926849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer)
893289bc588SBarry Smith {
894932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
895dfbe8321SBarry Smith   PetscErrorCode    ierr;
89613f74950SBarry Smith   PetscInt          i,j;
8972dcb1b2aSMatthew Knepley   const char        *name;
89887828ca2SBarry Smith   PetscScalar       *v;
899f3ef73ceSBarry Smith   PetscViewerFormat format;
9005f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX)
901ace3abfcSBarry Smith   PetscBool         allreal = PETSC_TRUE;
9025f481a85SSatish Balay #endif
903932b0c3eSLois Curfman McInnes 
9043a40ed3dSBarry Smith   PetscFunctionBegin;
905b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
906456192e2SBarry Smith   if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
9073a40ed3dSBarry Smith     PetscFunctionReturn(0);  /* do nothing for now */
908fb9695e5SSatish Balay   } else if (format == PETSC_VIEWER_ASCII_COMMON) {
909d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
910d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
91144cd7ae7SLois Curfman McInnes       v    = a->v + i;
91277431f27SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr);
913d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
914aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
915329f5518SBarry Smith         if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) {
91657622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g + %g i) ",j,(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr);
917329f5518SBarry Smith         } else if (PetscRealPart(*v)) {
91857622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)PetscRealPart(*v));CHKERRQ(ierr);
9196831982aSBarry Smith         }
92080cd9d93SLois Curfman McInnes #else
9216831982aSBarry Smith         if (*v) {
92257622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)*v);CHKERRQ(ierr);
9236831982aSBarry Smith         }
92480cd9d93SLois Curfman McInnes #endif
9251b807ce4Svictorle         v += a->lda;
92680cd9d93SLois Curfman McInnes       }
927b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
92880cd9d93SLois Curfman McInnes     }
929d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
9303a40ed3dSBarry Smith   } else {
931d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
932aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
93347989497SBarry Smith     /* determine if matrix has all real values */
93447989497SBarry Smith     v = a->v;
935d0f46423SBarry Smith     for (i=0; i<A->rmap->n*A->cmap->n; i++) {
936ffac6cdbSBarry Smith       if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break;}
93747989497SBarry Smith     }
93847989497SBarry Smith #endif
939fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
9403a7fca6bSBarry Smith       ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr);
941d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr);
942d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
943fb9695e5SSatish Balay       ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr);
944ffac6cdbSBarry Smith     }
945ffac6cdbSBarry Smith 
946d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
947932b0c3eSLois Curfman McInnes       v = a->v + i;
948d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
949aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
95047989497SBarry Smith         if (allreal) {
951c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr);
95247989497SBarry Smith         } else {
953c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr);
95447989497SBarry Smith         }
955289bc588SBarry Smith #else
956c61cd2faSJed Brown         ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr);
957289bc588SBarry Smith #endif
9581b807ce4Svictorle         v += a->lda;
959289bc588SBarry Smith       }
960b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
961289bc588SBarry Smith     }
962fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
963b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr);
964ffac6cdbSBarry Smith     }
965d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
966da3a660dSBarry Smith   }
967b0a32e0cSBarry Smith   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
9683a40ed3dSBarry Smith   PetscFunctionReturn(0);
969289bc588SBarry Smith }
970289bc588SBarry Smith 
9714a2ae208SSatish Balay #undef __FUNCT__
9724a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary"
9736849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer)
974932b0c3eSLois Curfman McInnes {
975932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
9766849ba73SBarry Smith   PetscErrorCode    ierr;
97713f74950SBarry Smith   int               fd;
978d0f46423SBarry Smith   PetscInt          ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n;
979f4403165SShri Abhyankar   PetscScalar       *v,*anonz,*vals;
980f4403165SShri Abhyankar   PetscViewerFormat format;
981932b0c3eSLois Curfman McInnes 
9823a40ed3dSBarry Smith   PetscFunctionBegin;
983b0a32e0cSBarry Smith   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
98490ace30eSBarry Smith 
985f4403165SShri Abhyankar   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
986f4403165SShri Abhyankar   if (format == PETSC_VIEWER_NATIVE) {
987f4403165SShri Abhyankar     /* store the matrix as a dense matrix */
988785e854fSJed Brown     ierr = PetscMalloc1(4,&col_lens);CHKERRQ(ierr);
9892205254eSKarl Rupp 
990f4403165SShri Abhyankar     col_lens[0] = MAT_FILE_CLASSID;
991f4403165SShri Abhyankar     col_lens[1] = m;
992f4403165SShri Abhyankar     col_lens[2] = n;
993f4403165SShri Abhyankar     col_lens[3] = MATRIX_BINARY_FORMAT_DENSE;
9942205254eSKarl Rupp 
995f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
996f4403165SShri Abhyankar     ierr = PetscFree(col_lens);CHKERRQ(ierr);
997f4403165SShri Abhyankar 
998f4403165SShri Abhyankar     /* write out matrix, by rows */
999854ce69bSBarry Smith     ierr = PetscMalloc1(m*n+1,&vals);CHKERRQ(ierr);
1000f4403165SShri Abhyankar     v    = a->v;
1001f4403165SShri Abhyankar     for (j=0; j<n; j++) {
1002f4403165SShri Abhyankar       for (i=0; i<m; i++) {
1003f4403165SShri Abhyankar         vals[j + i*n] = *v++;
1004f4403165SShri Abhyankar       }
1005f4403165SShri Abhyankar     }
1006f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
1007f4403165SShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
1008f4403165SShri Abhyankar   } else {
1009854ce69bSBarry Smith     ierr = PetscMalloc1(4+nz,&col_lens);CHKERRQ(ierr);
10102205254eSKarl Rupp 
10110700a824SBarry Smith     col_lens[0] = MAT_FILE_CLASSID;
1012932b0c3eSLois Curfman McInnes     col_lens[1] = m;
1013932b0c3eSLois Curfman McInnes     col_lens[2] = n;
1014932b0c3eSLois Curfman McInnes     col_lens[3] = nz;
1015932b0c3eSLois Curfman McInnes 
1016932b0c3eSLois Curfman McInnes     /* store lengths of each row and write (including header) to file */
1017932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) col_lens[4+i] = n;
10186f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
1019932b0c3eSLois Curfman McInnes 
1020932b0c3eSLois Curfman McInnes     /* Possibly should write in smaller increments, not whole matrix at once? */
1021932b0c3eSLois Curfman McInnes     /* store column indices (zero start index) */
1022932b0c3eSLois Curfman McInnes     ict = 0;
1023932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1024932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) col_lens[ict++] = j;
1025932b0c3eSLois Curfman McInnes     }
10266f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
1027606d414cSSatish Balay     ierr = PetscFree(col_lens);CHKERRQ(ierr);
1028932b0c3eSLois Curfman McInnes 
1029932b0c3eSLois Curfman McInnes     /* store nonzero values */
1030854ce69bSBarry Smith     ierr = PetscMalloc1(nz+1,&anonz);CHKERRQ(ierr);
1031932b0c3eSLois Curfman McInnes     ict  = 0;
1032932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1033932b0c3eSLois Curfman McInnes       v = a->v + i;
1034932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) {
10351b807ce4Svictorle         anonz[ict++] = *v; v += a->lda;
1036932b0c3eSLois Curfman McInnes       }
1037932b0c3eSLois Curfman McInnes     }
10386f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
1039606d414cSSatish Balay     ierr = PetscFree(anonz);CHKERRQ(ierr);
1040f4403165SShri Abhyankar   }
10413a40ed3dSBarry Smith   PetscFunctionReturn(0);
1042932b0c3eSLois Curfman McInnes }
1043932b0c3eSLois Curfman McInnes 
10449804daf3SBarry Smith #include <petscdraw.h>
10454a2ae208SSatish Balay #undef __FUNCT__
10464a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom"
1047dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa)
1048f1af5d2fSBarry Smith {
1049f1af5d2fSBarry Smith   Mat               A  = (Mat) Aa;
1050f1af5d2fSBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
10516849ba73SBarry Smith   PetscErrorCode    ierr;
1052d0f46423SBarry Smith   PetscInt          m  = A->rmap->n,n = A->cmap->n,color,i,j;
105387828ca2SBarry Smith   PetscScalar       *v = a->v;
1054b0a32e0cSBarry Smith   PetscViewer       viewer;
1055b0a32e0cSBarry Smith   PetscDraw         popup;
1056329f5518SBarry Smith   PetscReal         xl,yl,xr,yr,x_l,x_r,y_l,y_r,scale,maxv = 0.0;
1057f3ef73ceSBarry Smith   PetscViewerFormat format;
1058f1af5d2fSBarry Smith 
1059f1af5d2fSBarry Smith   PetscFunctionBegin;
1060f1af5d2fSBarry Smith   ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr);
1061b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1062b0a32e0cSBarry Smith   ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr);
1063f1af5d2fSBarry Smith 
1064f1af5d2fSBarry Smith   /* Loop over matrix elements drawing boxes */
1065fb9695e5SSatish Balay   if (format != PETSC_VIEWER_DRAW_CONTOUR) {
1066f1af5d2fSBarry Smith     /* Blue for negative and Red for positive */
1067b0a32e0cSBarry Smith     color = PETSC_DRAW_BLUE;
1068f1af5d2fSBarry Smith     for (j = 0; j < n; j++) {
1069f1af5d2fSBarry Smith       x_l = j;
1070f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1071f1af5d2fSBarry Smith       for (i = 0; i < m; i++) {
1072f1af5d2fSBarry Smith         y_l = m - i - 1.0;
1073f1af5d2fSBarry Smith         y_r = y_l + 1.0;
1074329f5518SBarry Smith         if (PetscRealPart(v[j*m+i]) >  0.) {
1075b0a32e0cSBarry Smith           color = PETSC_DRAW_RED;
1076329f5518SBarry Smith         } else if (PetscRealPart(v[j*m+i]) <  0.) {
1077b0a32e0cSBarry Smith           color = PETSC_DRAW_BLUE;
1078f1af5d2fSBarry Smith         } else {
1079f1af5d2fSBarry Smith           continue;
1080f1af5d2fSBarry Smith         }
1081b0a32e0cSBarry Smith         ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1082f1af5d2fSBarry Smith       }
1083f1af5d2fSBarry Smith     }
1084f1af5d2fSBarry Smith   } else {
1085f1af5d2fSBarry Smith     /* use contour shading to indicate magnitude of values */
1086f1af5d2fSBarry Smith     /* first determine max of all nonzero values */
1087f1af5d2fSBarry Smith     for (i = 0; i < m*n; i++) {
1088f1af5d2fSBarry Smith       if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]);
1089f1af5d2fSBarry Smith     }
1090b0a32e0cSBarry Smith     scale = (245.0 - PETSC_DRAW_BASIC_COLORS)/maxv;
1091b0a32e0cSBarry Smith     ierr  = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr);
1092b0a32e0cSBarry Smith     if (popup) {ierr = PetscDrawScalePopup(popup,0.0,maxv);CHKERRQ(ierr);}
1093f1af5d2fSBarry Smith     for (j = 0; j < n; j++) {
1094f1af5d2fSBarry Smith       x_l = j;
1095f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1096f1af5d2fSBarry Smith       for (i = 0; i < m; i++) {
1097f1af5d2fSBarry Smith         y_l   = m - i - 1.0;
1098f1af5d2fSBarry Smith         y_r   = y_l + 1.0;
1099b0a32e0cSBarry Smith         color = PETSC_DRAW_BASIC_COLORS + (int)(scale*PetscAbsScalar(v[j*m+i]));
1100b0a32e0cSBarry Smith         ierr  = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1101f1af5d2fSBarry Smith       }
1102f1af5d2fSBarry Smith     }
1103f1af5d2fSBarry Smith   }
1104f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1105f1af5d2fSBarry Smith }
1106f1af5d2fSBarry Smith 
11074a2ae208SSatish Balay #undef __FUNCT__
11084a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw"
1109dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer)
1110f1af5d2fSBarry Smith {
1111b0a32e0cSBarry Smith   PetscDraw      draw;
1112ace3abfcSBarry Smith   PetscBool      isnull;
1113329f5518SBarry Smith   PetscReal      xr,yr,xl,yl,h,w;
1114dfbe8321SBarry Smith   PetscErrorCode ierr;
1115f1af5d2fSBarry Smith 
1116f1af5d2fSBarry Smith   PetscFunctionBegin;
1117b0a32e0cSBarry Smith   ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
1118b0a32e0cSBarry Smith   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
1119abc0a331SBarry Smith   if (isnull) PetscFunctionReturn(0);
1120f1af5d2fSBarry Smith 
1121f1af5d2fSBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr);
1122d0f46423SBarry Smith   xr   = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0;
1123f1af5d2fSBarry Smith   xr  += w;    yr += h;  xl = -w;     yl = -h;
1124b0a32e0cSBarry Smith   ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr);
1125b0a32e0cSBarry Smith   ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr);
11260298fd71SBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr);
1127f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1128f1af5d2fSBarry Smith }
1129f1af5d2fSBarry Smith 
11304a2ae208SSatish Balay #undef __FUNCT__
11314a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense"
1132dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer)
1133932b0c3eSLois Curfman McInnes {
1134dfbe8321SBarry Smith   PetscErrorCode ierr;
1135ace3abfcSBarry Smith   PetscBool      iascii,isbinary,isdraw;
1136932b0c3eSLois Curfman McInnes 
11373a40ed3dSBarry Smith   PetscFunctionBegin;
1138251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
1139251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
1140251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
11410f5bd95cSBarry Smith 
1142c45a1595SBarry Smith   if (iascii) {
1143c45a1595SBarry Smith     ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr);
11440f5bd95cSBarry Smith   } else if (isbinary) {
11453a40ed3dSBarry Smith     ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr);
1146f1af5d2fSBarry Smith   } else if (isdraw) {
1147f1af5d2fSBarry Smith     ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr);
1148932b0c3eSLois Curfman McInnes   }
11493a40ed3dSBarry Smith   PetscFunctionReturn(0);
1150932b0c3eSLois Curfman McInnes }
1151289bc588SBarry Smith 
11524a2ae208SSatish Balay #undef __FUNCT__
11534a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense"
1154dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqDense(Mat mat)
1155289bc588SBarry Smith {
1156ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)mat->data;
1157dfbe8321SBarry Smith   PetscErrorCode ierr;
115890f02eecSBarry Smith 
11593a40ed3dSBarry Smith   PetscFunctionBegin;
1160aa482453SBarry Smith #if defined(PETSC_USE_LOG)
1161d0f46423SBarry Smith   PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n);
1162a5a9c739SBarry Smith #endif
116305b42c5fSBarry Smith   ierr = PetscFree(l->pivots);CHKERRQ(ierr);
11646857c123SSatish Balay   if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);}
1165bf0cc555SLisandro Dalcin   ierr = PetscFree(mat->data);CHKERRQ(ierr);
1166dbd8c25aSHong Zhang 
1167dbd8c25aSHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr);
1168bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL);CHKERRQ(ierr);
1169bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL);CHKERRQ(ierr);
11708baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL);CHKERRQ(ierr);
11718baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
11728baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL);CHKERRQ(ierr);
11738baccfbdSHong Zhang #endif
1174bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL);CHKERRQ(ierr);
1175bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1176bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1177bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
11783bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
11793bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
11803bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
11813a40ed3dSBarry Smith   PetscFunctionReturn(0);
1182289bc588SBarry Smith }
1183289bc588SBarry Smith 
11844a2ae208SSatish Balay #undef __FUNCT__
11854a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense"
1186fc4dec0aSBarry Smith PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout)
1187289bc588SBarry Smith {
1188c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
11896849ba73SBarry Smith   PetscErrorCode ierr;
119013f74950SBarry Smith   PetscInt       k,j,m,n,M;
119187828ca2SBarry Smith   PetscScalar    *v,tmp;
119248b35521SBarry Smith 
11933a40ed3dSBarry Smith   PetscFunctionBegin;
1194d0f46423SBarry Smith   v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n;
1195e9695a30SBarry Smith   if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */
1196e7e72b3dSBarry Smith     if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place");
1197e7e72b3dSBarry Smith     else {
1198d3e5ee88SLois Curfman McInnes       for (j=0; j<m; j++) {
1199289bc588SBarry Smith         for (k=0; k<j; k++) {
12001b807ce4Svictorle           tmp        = v[j + k*M];
12011b807ce4Svictorle           v[j + k*M] = v[k + j*M];
12021b807ce4Svictorle           v[k + j*M] = tmp;
1203289bc588SBarry Smith         }
1204289bc588SBarry Smith       }
1205d64ed03dSBarry Smith     }
12063a40ed3dSBarry Smith   } else { /* out-of-place transpose */
1207d3e5ee88SLois Curfman McInnes     Mat          tmat;
1208ec8511deSBarry Smith     Mat_SeqDense *tmatd;
120987828ca2SBarry Smith     PetscScalar  *v2;
1210ea709b57SSatish Balay 
1211fc4dec0aSBarry Smith     if (reuse == MAT_INITIAL_MATRIX) {
1212ce94432eSBarry Smith       ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr);
1213d0f46423SBarry Smith       ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr);
12147adad957SLisandro Dalcin       ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
12150298fd71SBarry Smith       ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr);
1216fc4dec0aSBarry Smith     } else {
1217fc4dec0aSBarry Smith       tmat = *matout;
1218fc4dec0aSBarry Smith     }
1219ec8511deSBarry Smith     tmatd = (Mat_SeqDense*)tmat->data;
12200de55854SLois Curfman McInnes     v = mat->v; v2 = tmatd->v;
1221d3e5ee88SLois Curfman McInnes     for (j=0; j<n; j++) {
12221b807ce4Svictorle       for (k=0; k<m; k++) v2[j + k*n] = v[k + j*M];
1223d3e5ee88SLois Curfman McInnes     }
12246d4a8577SBarry Smith     ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
12256d4a8577SBarry Smith     ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1226d3e5ee88SLois Curfman McInnes     *matout = tmat;
122748b35521SBarry Smith   }
12283a40ed3dSBarry Smith   PetscFunctionReturn(0);
1229289bc588SBarry Smith }
1230289bc588SBarry Smith 
12314a2ae208SSatish Balay #undef __FUNCT__
12324a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense"
1233ace3abfcSBarry Smith PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool  *flg)
1234289bc588SBarry Smith {
1235c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data;
1236c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data;
123713f74950SBarry Smith   PetscInt     i,j;
1238a2ea699eSBarry Smith   PetscScalar  *v1,*v2;
12399ea5d5aeSSatish Balay 
12403a40ed3dSBarry Smith   PetscFunctionBegin;
1241d0f46423SBarry Smith   if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1242d0f46423SBarry Smith   if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1243d0f46423SBarry Smith   for (i=0; i<A1->rmap->n; i++) {
12441b807ce4Svictorle     v1 = mat1->v+i; v2 = mat2->v+i;
1245d0f46423SBarry Smith     for (j=0; j<A1->cmap->n; j++) {
12463a40ed3dSBarry Smith       if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
12471b807ce4Svictorle       v1 += mat1->lda; v2 += mat2->lda;
12481b807ce4Svictorle     }
1249289bc588SBarry Smith   }
125077c4ece6SBarry Smith   *flg = PETSC_TRUE;
12513a40ed3dSBarry Smith   PetscFunctionReturn(0);
1252289bc588SBarry Smith }
1253289bc588SBarry Smith 
12544a2ae208SSatish Balay #undef __FUNCT__
12554a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense"
1256dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v)
1257289bc588SBarry Smith {
1258c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
1259dfbe8321SBarry Smith   PetscErrorCode ierr;
126013f74950SBarry Smith   PetscInt       i,n,len;
126187828ca2SBarry Smith   PetscScalar    *x,zero = 0.0;
126244cd7ae7SLois Curfman McInnes 
12633a40ed3dSBarry Smith   PetscFunctionBegin;
12642dcb1b2aSMatthew Knepley   ierr = VecSet(v,zero);CHKERRQ(ierr);
12657a97a34bSBarry Smith   ierr = VecGetSize(v,&n);CHKERRQ(ierr);
12661ebc52fbSHong Zhang   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1267d0f46423SBarry Smith   len  = PetscMin(A->rmap->n,A->cmap->n);
1268e32f2f54SBarry Smith   if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec");
126944cd7ae7SLois Curfman McInnes   for (i=0; i<len; i++) {
12701b807ce4Svictorle     x[i] = mat->v[i*mat->lda + i];
1271289bc588SBarry Smith   }
12721ebc52fbSHong Zhang   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
12733a40ed3dSBarry Smith   PetscFunctionReturn(0);
1274289bc588SBarry Smith }
1275289bc588SBarry Smith 
12764a2ae208SSatish Balay #undef __FUNCT__
12774a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense"
1278dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr)
1279289bc588SBarry Smith {
1280c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
128187828ca2SBarry Smith   PetscScalar    *l,*r,x,*v;
1282dfbe8321SBarry Smith   PetscErrorCode ierr;
1283d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n;
128455659b69SBarry Smith 
12853a40ed3dSBarry Smith   PetscFunctionBegin;
128628988994SBarry Smith   if (ll) {
12877a97a34bSBarry Smith     ierr = VecGetSize(ll,&m);CHKERRQ(ierr);
12881ebc52fbSHong Zhang     ierr = VecGetArray(ll,&l);CHKERRQ(ierr);
1289e32f2f54SBarry Smith     if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size");
1290da3a660dSBarry Smith     for (i=0; i<m; i++) {
1291da3a660dSBarry Smith       x = l[i];
1292da3a660dSBarry Smith       v = mat->v + i;
1293da3a660dSBarry Smith       for (j=0; j<n; j++) { (*v) *= x; v+= m;}
1294da3a660dSBarry Smith     }
12951ebc52fbSHong Zhang     ierr = VecRestoreArray(ll,&l);CHKERRQ(ierr);
1296efee365bSSatish Balay     ierr = PetscLogFlops(n*m);CHKERRQ(ierr);
1297da3a660dSBarry Smith   }
129828988994SBarry Smith   if (rr) {
12997a97a34bSBarry Smith     ierr = VecGetSize(rr,&n);CHKERRQ(ierr);
13001ebc52fbSHong Zhang     ierr = VecGetArray(rr,&r);CHKERRQ(ierr);
1301e32f2f54SBarry Smith     if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size");
1302da3a660dSBarry Smith     for (i=0; i<n; i++) {
1303da3a660dSBarry Smith       x = r[i];
1304da3a660dSBarry Smith       v = mat->v + i*m;
13052205254eSKarl Rupp       for (j=0; j<m; j++) (*v++) *= x;
1306da3a660dSBarry Smith     }
13071ebc52fbSHong Zhang     ierr = VecRestoreArray(rr,&r);CHKERRQ(ierr);
1308efee365bSSatish Balay     ierr = PetscLogFlops(n*m);CHKERRQ(ierr);
1309da3a660dSBarry Smith   }
13103a40ed3dSBarry Smith   PetscFunctionReturn(0);
1311289bc588SBarry Smith }
1312289bc588SBarry Smith 
13134a2ae208SSatish Balay #undef __FUNCT__
13144a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense"
1315dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm)
1316289bc588SBarry Smith {
1317c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
131887828ca2SBarry Smith   PetscScalar    *v   = mat->v;
1319329f5518SBarry Smith   PetscReal      sum  = 0.0;
1320d0f46423SBarry Smith   PetscInt       lda  =mat->lda,m=A->rmap->n,i,j;
1321efee365bSSatish Balay   PetscErrorCode ierr;
132255659b69SBarry Smith 
13233a40ed3dSBarry Smith   PetscFunctionBegin;
1324289bc588SBarry Smith   if (type == NORM_FROBENIUS) {
1325a5ce6ee0Svictorle     if (lda>m) {
1326d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1327a5ce6ee0Svictorle         v = mat->v+j*lda;
1328a5ce6ee0Svictorle         for (i=0; i<m; i++) {
1329a5ce6ee0Svictorle           sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1330a5ce6ee0Svictorle         }
1331a5ce6ee0Svictorle       }
1332a5ce6ee0Svictorle     } else {
1333d0f46423SBarry Smith       for (i=0; i<A->cmap->n*A->rmap->n; i++) {
1334329f5518SBarry Smith         sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1335289bc588SBarry Smith       }
1336a5ce6ee0Svictorle     }
13378f1a2a5eSBarry Smith     *nrm = PetscSqrtReal(sum);
1338dc0b31edSSatish Balay     ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
13393a40ed3dSBarry Smith   } else if (type == NORM_1) {
1340064f8208SBarry Smith     *nrm = 0.0;
1341d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
13421b807ce4Svictorle       v   = mat->v + j*mat->lda;
1343289bc588SBarry Smith       sum = 0.0;
1344d0f46423SBarry Smith       for (i=0; i<A->rmap->n; i++) {
134533a8263dSBarry Smith         sum += PetscAbsScalar(*v);  v++;
1346289bc588SBarry Smith       }
1347064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1348289bc588SBarry Smith     }
1349d0f46423SBarry Smith     ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr);
13503a40ed3dSBarry Smith   } else if (type == NORM_INFINITY) {
1351064f8208SBarry Smith     *nrm = 0.0;
1352d0f46423SBarry Smith     for (j=0; j<A->rmap->n; j++) {
1353289bc588SBarry Smith       v   = mat->v + j;
1354289bc588SBarry Smith       sum = 0.0;
1355d0f46423SBarry Smith       for (i=0; i<A->cmap->n; i++) {
13561b807ce4Svictorle         sum += PetscAbsScalar(*v); v += mat->lda;
1357289bc588SBarry Smith       }
1358064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1359289bc588SBarry Smith     }
1360d0f46423SBarry Smith     ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr);
1361e7e72b3dSBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm");
13623a40ed3dSBarry Smith   PetscFunctionReturn(0);
1363289bc588SBarry Smith }
1364289bc588SBarry Smith 
13654a2ae208SSatish Balay #undef __FUNCT__
13664a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense"
1367ace3abfcSBarry Smith PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg)
1368289bc588SBarry Smith {
1369c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *aij = (Mat_SeqDense*)A->data;
137063ba0a88SBarry Smith   PetscErrorCode ierr;
137167e560aaSBarry Smith 
13723a40ed3dSBarry Smith   PetscFunctionBegin;
1373b5a2b587SKris Buschelman   switch (op) {
1374b5a2b587SKris Buschelman   case MAT_ROW_ORIENTED:
13754e0d8c25SBarry Smith     aij->roworiented = flg;
1376b5a2b587SKris Buschelman     break;
1377512a5fc5SBarry Smith   case MAT_NEW_NONZERO_LOCATIONS:
1378b5a2b587SKris Buschelman   case MAT_NEW_NONZERO_LOCATION_ERR:
13793971808eSMatthew Knepley   case MAT_NEW_NONZERO_ALLOCATION_ERR:
13804e0d8c25SBarry Smith   case MAT_NEW_DIAGONALS:
138113fa8e87SLisandro Dalcin   case MAT_KEEP_NONZERO_PATTERN:
1382b5a2b587SKris Buschelman   case MAT_IGNORE_OFF_PROC_ENTRIES:
1383b5a2b587SKris Buschelman   case MAT_USE_HASH_TABLE:
13845021d80fSJed Brown   case MAT_IGNORE_LOWER_TRIANGULAR:
13855021d80fSJed Brown     ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr);
13865021d80fSJed Brown     break;
13875021d80fSJed Brown   case MAT_SPD:
138877e54ba9SKris Buschelman   case MAT_SYMMETRIC:
138977e54ba9SKris Buschelman   case MAT_STRUCTURALLY_SYMMETRIC:
13909a4540c5SBarry Smith   case MAT_HERMITIAN:
13919a4540c5SBarry Smith   case MAT_SYMMETRY_ETERNAL:
13925021d80fSJed Brown     /* These options are handled directly by MatSetOption() */
139377e54ba9SKris Buschelman     break;
1394b5a2b587SKris Buschelman   default:
1395e32f2f54SBarry Smith     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]);
13963a40ed3dSBarry Smith   }
13973a40ed3dSBarry Smith   PetscFunctionReturn(0);
1398289bc588SBarry Smith }
1399289bc588SBarry Smith 
14004a2ae208SSatish Balay #undef __FUNCT__
14014a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense"
1402dfbe8321SBarry Smith PetscErrorCode MatZeroEntries_SeqDense(Mat A)
14036f0a148fSBarry Smith {
1404ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)A->data;
14056849ba73SBarry Smith   PetscErrorCode ierr;
1406d0f46423SBarry Smith   PetscInt       lda=l->lda,m=A->rmap->n,j;
14073a40ed3dSBarry Smith 
14083a40ed3dSBarry Smith   PetscFunctionBegin;
1409a5ce6ee0Svictorle   if (lda>m) {
1410d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1411a5ce6ee0Svictorle       ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
1412a5ce6ee0Svictorle     }
1413a5ce6ee0Svictorle   } else {
1414d0f46423SBarry Smith     ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1415a5ce6ee0Svictorle   }
14163a40ed3dSBarry Smith   PetscFunctionReturn(0);
14176f0a148fSBarry Smith }
14186f0a148fSBarry Smith 
14194a2ae208SSatish Balay #undef __FUNCT__
14204a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense"
14212b40b63fSBarry Smith PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b)
14226f0a148fSBarry Smith {
142397b48c8fSBarry Smith   PetscErrorCode    ierr;
1424ec8511deSBarry Smith   Mat_SeqDense      *l = (Mat_SeqDense*)A->data;
1425b9679d65SBarry Smith   PetscInt          m  = l->lda, n = A->cmap->n, i,j;
142697b48c8fSBarry Smith   PetscScalar       *slot,*bb;
142797b48c8fSBarry Smith   const PetscScalar *xx;
142855659b69SBarry Smith 
14293a40ed3dSBarry Smith   PetscFunctionBegin;
1430b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG)
1431b9679d65SBarry Smith   for (i=0; i<N; i++) {
1432b9679d65SBarry Smith     if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed");
1433b9679d65SBarry 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);
1434b9679d65SBarry Smith   }
1435b9679d65SBarry Smith #endif
1436b9679d65SBarry Smith 
143797b48c8fSBarry Smith   /* fix right hand side if needed */
143897b48c8fSBarry Smith   if (x && b) {
143997b48c8fSBarry Smith     ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr);
144097b48c8fSBarry Smith     ierr = VecGetArray(b,&bb);CHKERRQ(ierr);
14412205254eSKarl Rupp     for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]];
144297b48c8fSBarry Smith     ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr);
144397b48c8fSBarry Smith     ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr);
144497b48c8fSBarry Smith   }
144597b48c8fSBarry Smith 
14466f0a148fSBarry Smith   for (i=0; i<N; i++) {
14476f0a148fSBarry Smith     slot = l->v + rows[i];
1448b9679d65SBarry Smith     for (j=0; j<n; j++) { *slot = 0.0; slot += m;}
14496f0a148fSBarry Smith   }
1450f4df32b1SMatthew Knepley   if (diag != 0.0) {
1451b9679d65SBarry Smith     if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices");
14526f0a148fSBarry Smith     for (i=0; i<N; i++) {
1453b9679d65SBarry Smith       slot  = l->v + (m+1)*rows[i];
1454f4df32b1SMatthew Knepley       *slot = diag;
14556f0a148fSBarry Smith     }
14566f0a148fSBarry Smith   }
14573a40ed3dSBarry Smith   PetscFunctionReturn(0);
14586f0a148fSBarry Smith }
1459557bce09SLois Curfman McInnes 
14604a2ae208SSatish Balay #undef __FUNCT__
14618c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray_SeqDense"
14628c778c55SBarry Smith PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar *array[])
146364e87e97SBarry Smith {
1464c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
14653a40ed3dSBarry Smith 
14663a40ed3dSBarry Smith   PetscFunctionBegin;
1467e32f2f54SBarry 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");
146864e87e97SBarry Smith   *array = mat->v;
14693a40ed3dSBarry Smith   PetscFunctionReturn(0);
147064e87e97SBarry Smith }
14710754003eSLois Curfman McInnes 
14724a2ae208SSatish Balay #undef __FUNCT__
14738c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray_SeqDense"
14748c778c55SBarry Smith PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar *array[])
1475ff14e315SSatish Balay {
14763a40ed3dSBarry Smith   PetscFunctionBegin;
147709b544d4SBarry Smith   *array = 0; /* user cannot accidently use the array later */
14783a40ed3dSBarry Smith   PetscFunctionReturn(0);
1479ff14e315SSatish Balay }
14800754003eSLois Curfman McInnes 
14814a2ae208SSatish Balay #undef __FUNCT__
14828c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray"
1483dec5eb66SMatthew G Knepley /*@C
14848c778c55SBarry Smith    MatDenseGetArray - gives access to the array where the data for a SeqDense matrix is stored
148573a71a0fSBarry Smith 
148673a71a0fSBarry Smith    Not Collective
148773a71a0fSBarry Smith 
148873a71a0fSBarry Smith    Input Parameter:
1489579dbff0SBarry Smith .  mat - a MATSEQDENSE or MATMPIDENSE matrix
149073a71a0fSBarry Smith 
149173a71a0fSBarry Smith    Output Parameter:
149273a71a0fSBarry Smith .   array - pointer to the data
149373a71a0fSBarry Smith 
149473a71a0fSBarry Smith    Level: intermediate
149573a71a0fSBarry Smith 
14968c778c55SBarry Smith .seealso: MatDenseRestoreArray()
149773a71a0fSBarry Smith @*/
14988c778c55SBarry Smith PetscErrorCode  MatDenseGetArray(Mat A,PetscScalar **array)
149973a71a0fSBarry Smith {
150073a71a0fSBarry Smith   PetscErrorCode ierr;
150173a71a0fSBarry Smith 
150273a71a0fSBarry Smith   PetscFunctionBegin;
15038c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
150473a71a0fSBarry Smith   PetscFunctionReturn(0);
150573a71a0fSBarry Smith }
150673a71a0fSBarry Smith 
150773a71a0fSBarry Smith #undef __FUNCT__
15088c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray"
1509dec5eb66SMatthew G Knepley /*@C
1510579dbff0SBarry Smith    MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray()
151173a71a0fSBarry Smith 
151273a71a0fSBarry Smith    Not Collective
151373a71a0fSBarry Smith 
151473a71a0fSBarry Smith    Input Parameters:
1515579dbff0SBarry Smith .  mat - a MATSEQDENSE or MATMPIDENSE matrix
151673a71a0fSBarry Smith .  array - pointer to the data
151773a71a0fSBarry Smith 
151873a71a0fSBarry Smith    Level: intermediate
151973a71a0fSBarry Smith 
15208c778c55SBarry Smith .seealso: MatDenseGetArray()
152173a71a0fSBarry Smith @*/
15228c778c55SBarry Smith PetscErrorCode  MatDenseRestoreArray(Mat A,PetscScalar **array)
152373a71a0fSBarry Smith {
152473a71a0fSBarry Smith   PetscErrorCode ierr;
152573a71a0fSBarry Smith 
152673a71a0fSBarry Smith   PetscFunctionBegin;
15278c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
152873a71a0fSBarry Smith   PetscFunctionReturn(0);
152973a71a0fSBarry Smith }
153073a71a0fSBarry Smith 
153173a71a0fSBarry Smith #undef __FUNCT__
15324a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense"
153313f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B)
15340754003eSLois Curfman McInnes {
1535c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
15366849ba73SBarry Smith   PetscErrorCode ierr;
15375d0c19d7SBarry Smith   PetscInt       i,j,nrows,ncols;
15385d0c19d7SBarry Smith   const PetscInt *irow,*icol;
153987828ca2SBarry Smith   PetscScalar    *av,*bv,*v = mat->v;
15400754003eSLois Curfman McInnes   Mat            newmat;
15410754003eSLois Curfman McInnes 
15423a40ed3dSBarry Smith   PetscFunctionBegin;
154378b31e54SBarry Smith   ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr);
154478b31e54SBarry Smith   ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr);
1545e03a110bSBarry Smith   ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr);
1546e03a110bSBarry Smith   ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr);
15470754003eSLois Curfman McInnes 
1548182d2002SSatish Balay   /* Check submatrixcall */
1549182d2002SSatish Balay   if (scall == MAT_REUSE_MATRIX) {
155013f74950SBarry Smith     PetscInt n_cols,n_rows;
1551182d2002SSatish Balay     ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr);
155221a2c019SBarry Smith     if (n_rows != nrows || n_cols != ncols) {
1553f746d493SDmitry Karpeev       /* resize the result matrix to match number of requested rows/columns */
1554c61587bbSBarry Smith       ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
155521a2c019SBarry Smith     }
1556182d2002SSatish Balay     newmat = *B;
1557182d2002SSatish Balay   } else {
15580754003eSLois Curfman McInnes     /* Create and fill new matrix */
1559ce94432eSBarry Smith     ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr);
1560f69a0ea3SMatthew Knepley     ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
15617adad957SLisandro Dalcin     ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
15620298fd71SBarry Smith     ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr);
1563182d2002SSatish Balay   }
1564182d2002SSatish Balay 
1565182d2002SSatish Balay   /* Now extract the data pointers and do the copy,column at a time */
1566182d2002SSatish Balay   bv = ((Mat_SeqDense*)newmat->data)->v;
1567182d2002SSatish Balay 
1568182d2002SSatish Balay   for (i=0; i<ncols; i++) {
15696de62eeeSBarry Smith     av = v + mat->lda*icol[i];
15702205254eSKarl Rupp     for (j=0; j<nrows; j++) *bv++ = av[irow[j]];
15710754003eSLois Curfman McInnes   }
1572182d2002SSatish Balay 
1573182d2002SSatish Balay   /* Assemble the matrices so that the correct flags are set */
15746d4a8577SBarry Smith   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
15756d4a8577SBarry Smith   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
15760754003eSLois Curfman McInnes 
15770754003eSLois Curfman McInnes   /* Free work space */
157878b31e54SBarry Smith   ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr);
157978b31e54SBarry Smith   ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr);
1580182d2002SSatish Balay   *B   = newmat;
15813a40ed3dSBarry Smith   PetscFunctionReturn(0);
15820754003eSLois Curfman McInnes }
15830754003eSLois Curfman McInnes 
15844a2ae208SSatish Balay #undef __FUNCT__
15854a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense"
158613f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[])
1587905e6a2fSBarry Smith {
15886849ba73SBarry Smith   PetscErrorCode ierr;
158913f74950SBarry Smith   PetscInt       i;
1590905e6a2fSBarry Smith 
15913a40ed3dSBarry Smith   PetscFunctionBegin;
1592905e6a2fSBarry Smith   if (scall == MAT_INITIAL_MATRIX) {
1593854ce69bSBarry Smith     ierr = PetscMalloc1(n+1,B);CHKERRQ(ierr);
1594905e6a2fSBarry Smith   }
1595905e6a2fSBarry Smith 
1596905e6a2fSBarry Smith   for (i=0; i<n; i++) {
15976a6a5d1dSBarry Smith     ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr);
1598905e6a2fSBarry Smith   }
15993a40ed3dSBarry Smith   PetscFunctionReturn(0);
1600905e6a2fSBarry Smith }
1601905e6a2fSBarry Smith 
16024a2ae208SSatish Balay #undef __FUNCT__
1603c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense"
1604c0aa2d19SHong Zhang PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode)
1605c0aa2d19SHong Zhang {
1606c0aa2d19SHong Zhang   PetscFunctionBegin;
1607c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1608c0aa2d19SHong Zhang }
1609c0aa2d19SHong Zhang 
1610c0aa2d19SHong Zhang #undef __FUNCT__
1611c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense"
1612c0aa2d19SHong Zhang PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode)
1613c0aa2d19SHong Zhang {
1614c0aa2d19SHong Zhang   PetscFunctionBegin;
1615c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1616c0aa2d19SHong Zhang }
1617c0aa2d19SHong Zhang 
1618c0aa2d19SHong Zhang #undef __FUNCT__
16194a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense"
1620dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str)
16214b0e389bSBarry Smith {
16224b0e389bSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data;
16236849ba73SBarry Smith   PetscErrorCode ierr;
1624d0f46423SBarry Smith   PetscInt       lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j;
16253a40ed3dSBarry Smith 
16263a40ed3dSBarry Smith   PetscFunctionBegin;
162733f4a19fSKris Buschelman   /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */
162833f4a19fSKris Buschelman   if (A->ops->copy != B->ops->copy) {
1629cb5b572fSBarry Smith     ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr);
16303a40ed3dSBarry Smith     PetscFunctionReturn(0);
16313a40ed3dSBarry Smith   }
1632e32f2f54SBarry Smith   if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)");
1633a5ce6ee0Svictorle   if (lda1>m || lda2>m) {
16340dbb7854Svictorle     for (j=0; j<n; j++) {
1635a5ce6ee0Svictorle       ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr);
1636a5ce6ee0Svictorle     }
1637a5ce6ee0Svictorle   } else {
1638d0f46423SBarry Smith     ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1639a5ce6ee0Svictorle   }
1640273d9f13SBarry Smith   PetscFunctionReturn(0);
1641273d9f13SBarry Smith }
1642273d9f13SBarry Smith 
16434a2ae208SSatish Balay #undef __FUNCT__
16444994cf47SJed Brown #define __FUNCT__ "MatSetUp_SeqDense"
16454994cf47SJed Brown PetscErrorCode MatSetUp_SeqDense(Mat A)
1646273d9f13SBarry Smith {
1647dfbe8321SBarry Smith   PetscErrorCode ierr;
1648273d9f13SBarry Smith 
1649273d9f13SBarry Smith   PetscFunctionBegin;
1650273d9f13SBarry Smith   ierr =  MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr);
16513a40ed3dSBarry Smith   PetscFunctionReturn(0);
16524b0e389bSBarry Smith }
16534b0e389bSBarry Smith 
1654284134d9SBarry Smith #undef __FUNCT__
1655ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense"
1656ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A)
1657ba337c44SJed Brown {
1658ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1659ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1660ba337c44SJed Brown   PetscScalar  *aa = a->v;
1661ba337c44SJed Brown 
1662ba337c44SJed Brown   PetscFunctionBegin;
1663ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]);
1664ba337c44SJed Brown   PetscFunctionReturn(0);
1665ba337c44SJed Brown }
1666ba337c44SJed Brown 
1667ba337c44SJed Brown #undef __FUNCT__
1668ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense"
1669ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A)
1670ba337c44SJed Brown {
1671ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1672ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1673ba337c44SJed Brown   PetscScalar  *aa = a->v;
1674ba337c44SJed Brown 
1675ba337c44SJed Brown   PetscFunctionBegin;
1676ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]);
1677ba337c44SJed Brown   PetscFunctionReturn(0);
1678ba337c44SJed Brown }
1679ba337c44SJed Brown 
1680ba337c44SJed Brown #undef __FUNCT__
1681ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense"
1682ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A)
1683ba337c44SJed Brown {
1684ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1685ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1686ba337c44SJed Brown   PetscScalar  *aa = a->v;
1687ba337c44SJed Brown 
1688ba337c44SJed Brown   PetscFunctionBegin;
1689ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]);
1690ba337c44SJed Brown   PetscFunctionReturn(0);
1691ba337c44SJed Brown }
1692284134d9SBarry Smith 
1693a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/
1694a9fe9ddaSSatish Balay #undef __FUNCT__
1695a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense"
1696a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1697a9fe9ddaSSatish Balay {
1698a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1699a9fe9ddaSSatish Balay 
1700a9fe9ddaSSatish Balay   PetscFunctionBegin;
1701a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
17023ff4c91cSHong Zhang     ierr = PetscLogEventBegin(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1703a9fe9ddaSSatish Balay     ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
17043ff4c91cSHong Zhang     ierr = PetscLogEventEnd(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1705a9fe9ddaSSatish Balay   }
17063ff4c91cSHong Zhang   ierr = PetscLogEventBegin(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1707a9fe9ddaSSatish Balay   ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
17083ff4c91cSHong Zhang   ierr = PetscLogEventEnd(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1709a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1710a9fe9ddaSSatish Balay }
1711a9fe9ddaSSatish Balay 
1712a9fe9ddaSSatish Balay #undef __FUNCT__
1713a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense"
1714a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1715a9fe9ddaSSatish Balay {
1716ee16a9a1SHong Zhang   PetscErrorCode ierr;
1717d0f46423SBarry Smith   PetscInt       m=A->rmap->n,n=B->cmap->n;
1718ee16a9a1SHong Zhang   Mat            Cmat;
1719a9fe9ddaSSatish Balay 
1720ee16a9a1SHong Zhang   PetscFunctionBegin;
1721e32f2f54SBarry 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);
1722ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1723ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1724ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
17250298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr);
1726d73949e8SHong Zhang 
1727ee16a9a1SHong Zhang   *C = Cmat;
1728ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1729ee16a9a1SHong Zhang }
1730a9fe9ddaSSatish Balay 
173198a3b096SSatish Balay #undef __FUNCT__
1732a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense"
1733a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1734a9fe9ddaSSatish Balay {
1735a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1736a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1737a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
17380805154bSBarry Smith   PetscBLASInt   m,n,k;
1739a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1740c5df96a5SBarry Smith   PetscErrorCode ierr;
1741a9fe9ddaSSatish Balay 
1742a9fe9ddaSSatish Balay   PetscFunctionBegin;
1743c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
1744c5df96a5SBarry Smith   ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr);
1745c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr);
17468b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
1747a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1748a9fe9ddaSSatish Balay }
1749a9fe9ddaSSatish Balay 
1750a9fe9ddaSSatish Balay #undef __FUNCT__
175175648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqDense_SeqDense"
175275648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1753a9fe9ddaSSatish Balay {
1754a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1755a9fe9ddaSSatish Balay 
1756a9fe9ddaSSatish Balay   PetscFunctionBegin;
1757a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
17583ff4c91cSHong Zhang     ierr = PetscLogEventBegin(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
175975648e8dSHong Zhang     ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
17603ff4c91cSHong Zhang     ierr = PetscLogEventEnd(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1761a9fe9ddaSSatish Balay   }
17623ff4c91cSHong Zhang   ierr = PetscLogEventBegin(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr);
176375648e8dSHong Zhang   ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
17643ff4c91cSHong Zhang   ierr = PetscLogEventEnd(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1765a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1766a9fe9ddaSSatish Balay }
1767a9fe9ddaSSatish Balay 
1768a9fe9ddaSSatish Balay #undef __FUNCT__
176975648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqDense_SeqDense"
177075648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1771a9fe9ddaSSatish Balay {
1772ee16a9a1SHong Zhang   PetscErrorCode ierr;
1773d0f46423SBarry Smith   PetscInt       m=A->cmap->n,n=B->cmap->n;
1774ee16a9a1SHong Zhang   Mat            Cmat;
1775a9fe9ddaSSatish Balay 
1776ee16a9a1SHong Zhang   PetscFunctionBegin;
1777e32f2f54SBarry 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);
1778ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1779ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1780ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
17810298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr);
17822205254eSKarl Rupp 
1783ee16a9a1SHong Zhang   Cmat->assembled = PETSC_TRUE;
17842205254eSKarl Rupp 
1785ee16a9a1SHong Zhang   *C = Cmat;
1786ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1787ee16a9a1SHong Zhang }
1788a9fe9ddaSSatish Balay 
1789a9fe9ddaSSatish Balay #undef __FUNCT__
179075648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqDense_SeqDense"
179175648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1792a9fe9ddaSSatish Balay {
1793a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1794a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1795a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
17960805154bSBarry Smith   PetscBLASInt   m,n,k;
1797a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1798c5df96a5SBarry Smith   PetscErrorCode ierr;
1799a9fe9ddaSSatish Balay 
1800a9fe9ddaSSatish Balay   PetscFunctionBegin;
1801c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&m);CHKERRQ(ierr);
1802c5df96a5SBarry Smith   ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr);
1803c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr);
18042fbe02b9SBarry Smith   /*
18052fbe02b9SBarry Smith      Note the m and n arguments below are the number rows and columns of A', not A!
18062fbe02b9SBarry Smith   */
18078b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
1808a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1809a9fe9ddaSSatish Balay }
1810985db425SBarry Smith 
1811985db425SBarry Smith #undef __FUNCT__
1812985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense"
1813985db425SBarry Smith PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[])
1814985db425SBarry Smith {
1815985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1816985db425SBarry Smith   PetscErrorCode ierr;
1817d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1818985db425SBarry Smith   PetscScalar    *x;
1819985db425SBarry Smith   MatScalar      *aa = a->v;
1820985db425SBarry Smith 
1821985db425SBarry Smith   PetscFunctionBegin;
1822e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1823985db425SBarry Smith 
1824985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1825985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1826985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1827e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1828985db425SBarry Smith   for (i=0; i<m; i++) {
1829985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1830985db425SBarry Smith     for (j=1; j<n; j++) {
1831985db425SBarry Smith       if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1832985db425SBarry Smith     }
1833985db425SBarry Smith   }
1834985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1835985db425SBarry Smith   PetscFunctionReturn(0);
1836985db425SBarry Smith }
1837985db425SBarry Smith 
1838985db425SBarry Smith #undef __FUNCT__
1839985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense"
1840985db425SBarry Smith PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[])
1841985db425SBarry Smith {
1842985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1843985db425SBarry Smith   PetscErrorCode ierr;
1844d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1845985db425SBarry Smith   PetscScalar    *x;
1846985db425SBarry Smith   PetscReal      atmp;
1847985db425SBarry Smith   MatScalar      *aa = a->v;
1848985db425SBarry Smith 
1849985db425SBarry Smith   PetscFunctionBegin;
1850e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1851985db425SBarry Smith 
1852985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1853985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1854985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1855e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1856985db425SBarry Smith   for (i=0; i<m; i++) {
18579189402eSHong Zhang     x[i] = PetscAbsScalar(aa[i]);
1858985db425SBarry Smith     for (j=1; j<n; j++) {
1859985db425SBarry Smith       atmp = PetscAbsScalar(aa[i+m*j]);
1860985db425SBarry Smith       if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;}
1861985db425SBarry Smith     }
1862985db425SBarry Smith   }
1863985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1864985db425SBarry Smith   PetscFunctionReturn(0);
1865985db425SBarry Smith }
1866985db425SBarry Smith 
1867985db425SBarry Smith #undef __FUNCT__
1868985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense"
1869985db425SBarry Smith PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[])
1870985db425SBarry Smith {
1871985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1872985db425SBarry Smith   PetscErrorCode ierr;
1873d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1874985db425SBarry Smith   PetscScalar    *x;
1875985db425SBarry Smith   MatScalar      *aa = a->v;
1876985db425SBarry Smith 
1877985db425SBarry Smith   PetscFunctionBegin;
1878e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1879985db425SBarry Smith 
1880985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1881985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1882985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1883e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1884985db425SBarry Smith   for (i=0; i<m; i++) {
1885985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1886985db425SBarry Smith     for (j=1; j<n; j++) {
1887985db425SBarry Smith       if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1888985db425SBarry Smith     }
1889985db425SBarry Smith   }
1890985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1891985db425SBarry Smith   PetscFunctionReturn(0);
1892985db425SBarry Smith }
1893985db425SBarry Smith 
18948d0534beSBarry Smith #undef __FUNCT__
18958d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense"
18968d0534beSBarry Smith PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col)
18978d0534beSBarry Smith {
18988d0534beSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
18998d0534beSBarry Smith   PetscErrorCode ierr;
19008d0534beSBarry Smith   PetscScalar    *x;
19018d0534beSBarry Smith 
19028d0534beSBarry Smith   PetscFunctionBegin;
1903e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
19048d0534beSBarry Smith 
19058d0534beSBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1906d0f46423SBarry Smith   ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
19078d0534beSBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
19088d0534beSBarry Smith   PetscFunctionReturn(0);
19098d0534beSBarry Smith }
19108d0534beSBarry Smith 
19110716a85fSBarry Smith 
19120716a85fSBarry Smith #undef __FUNCT__
19130716a85fSBarry Smith #define __FUNCT__ "MatGetColumnNorms_SeqDense"
19140716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms)
19150716a85fSBarry Smith {
19160716a85fSBarry Smith   PetscErrorCode ierr;
19170716a85fSBarry Smith   PetscInt       i,j,m,n;
19180716a85fSBarry Smith   PetscScalar    *a;
19190716a85fSBarry Smith 
19200716a85fSBarry Smith   PetscFunctionBegin;
19210716a85fSBarry Smith   ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr);
19220716a85fSBarry Smith   ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr);
19238c778c55SBarry Smith   ierr = MatDenseGetArray(A,&a);CHKERRQ(ierr);
19240716a85fSBarry Smith   if (type == NORM_2) {
19250716a85fSBarry Smith     for (i=0; i<n; i++) {
19260716a85fSBarry Smith       for (j=0; j<m; j++) {
19270716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]*a[j]);
19280716a85fSBarry Smith       }
19290716a85fSBarry Smith       a += m;
19300716a85fSBarry Smith     }
19310716a85fSBarry Smith   } else if (type == NORM_1) {
19320716a85fSBarry Smith     for (i=0; i<n; i++) {
19330716a85fSBarry Smith       for (j=0; j<m; j++) {
19340716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]);
19350716a85fSBarry Smith       }
19360716a85fSBarry Smith       a += m;
19370716a85fSBarry Smith     }
19380716a85fSBarry Smith   } else if (type == NORM_INFINITY) {
19390716a85fSBarry Smith     for (i=0; i<n; i++) {
19400716a85fSBarry Smith       for (j=0; j<m; j++) {
19410716a85fSBarry Smith         norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]);
19420716a85fSBarry Smith       }
19430716a85fSBarry Smith       a += m;
19440716a85fSBarry Smith     }
1945ce94432eSBarry Smith   } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType");
19468c778c55SBarry Smith   ierr = MatDenseRestoreArray(A,&a);CHKERRQ(ierr);
19470716a85fSBarry Smith   if (type == NORM_2) {
19488f1a2a5eSBarry Smith     for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]);
19490716a85fSBarry Smith   }
19500716a85fSBarry Smith   PetscFunctionReturn(0);
19510716a85fSBarry Smith }
19520716a85fSBarry Smith 
195373a71a0fSBarry Smith #undef __FUNCT__
195473a71a0fSBarry Smith #define __FUNCT__ "MatSetRandom_SeqDense"
195573a71a0fSBarry Smith static PetscErrorCode  MatSetRandom_SeqDense(Mat x,PetscRandom rctx)
195673a71a0fSBarry Smith {
195773a71a0fSBarry Smith   PetscErrorCode ierr;
195873a71a0fSBarry Smith   PetscScalar    *a;
195973a71a0fSBarry Smith   PetscInt       m,n,i;
196073a71a0fSBarry Smith 
196173a71a0fSBarry Smith   PetscFunctionBegin;
196273a71a0fSBarry Smith   ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr);
19638c778c55SBarry Smith   ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr);
196473a71a0fSBarry Smith   for (i=0; i<m*n; i++) {
196573a71a0fSBarry Smith     ierr = PetscRandomGetValue(rctx,a+i);CHKERRQ(ierr);
196673a71a0fSBarry Smith   }
19678c778c55SBarry Smith   ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr);
196873a71a0fSBarry Smith   PetscFunctionReturn(0);
196973a71a0fSBarry Smith }
197073a71a0fSBarry Smith 
197173a71a0fSBarry Smith 
1972289bc588SBarry Smith /* -------------------------------------------------------------------*/
1973a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense,
1974905e6a2fSBarry Smith                                         MatGetRow_SeqDense,
1975905e6a2fSBarry Smith                                         MatRestoreRow_SeqDense,
1976905e6a2fSBarry Smith                                         MatMult_SeqDense,
197797304618SKris Buschelman                                 /*  4*/ MatMultAdd_SeqDense,
19787c922b88SBarry Smith                                         MatMultTranspose_SeqDense,
19797c922b88SBarry Smith                                         MatMultTransposeAdd_SeqDense,
1980db4efbfdSBarry Smith                                         0,
1981db4efbfdSBarry Smith                                         0,
1982db4efbfdSBarry Smith                                         0,
1983db4efbfdSBarry Smith                                 /* 10*/ 0,
1984905e6a2fSBarry Smith                                         MatLUFactor_SeqDense,
1985905e6a2fSBarry Smith                                         MatCholeskyFactor_SeqDense,
198641f059aeSBarry Smith                                         MatSOR_SeqDense,
1987ec8511deSBarry Smith                                         MatTranspose_SeqDense,
198897304618SKris Buschelman                                 /* 15*/ MatGetInfo_SeqDense,
1989905e6a2fSBarry Smith                                         MatEqual_SeqDense,
1990905e6a2fSBarry Smith                                         MatGetDiagonal_SeqDense,
1991905e6a2fSBarry Smith                                         MatDiagonalScale_SeqDense,
1992905e6a2fSBarry Smith                                         MatNorm_SeqDense,
1993c0aa2d19SHong Zhang                                 /* 20*/ MatAssemblyBegin_SeqDense,
1994c0aa2d19SHong Zhang                                         MatAssemblyEnd_SeqDense,
1995905e6a2fSBarry Smith                                         MatSetOption_SeqDense,
1996905e6a2fSBarry Smith                                         MatZeroEntries_SeqDense,
1997d519adbfSMatthew Knepley                                 /* 24*/ MatZeroRows_SeqDense,
1998db4efbfdSBarry Smith                                         0,
1999db4efbfdSBarry Smith                                         0,
2000db4efbfdSBarry Smith                                         0,
2001db4efbfdSBarry Smith                                         0,
20024994cf47SJed Brown                                 /* 29*/ MatSetUp_SeqDense,
2003273d9f13SBarry Smith                                         0,
2004905e6a2fSBarry Smith                                         0,
200573a71a0fSBarry Smith                                         0,
200673a71a0fSBarry Smith                                         0,
2007d519adbfSMatthew Knepley                                 /* 34*/ MatDuplicate_SeqDense,
2008a5ae1ecdSBarry Smith                                         0,
2009a5ae1ecdSBarry Smith                                         0,
2010a5ae1ecdSBarry Smith                                         0,
2011a5ae1ecdSBarry Smith                                         0,
2012d519adbfSMatthew Knepley                                 /* 39*/ MatAXPY_SeqDense,
2013a5ae1ecdSBarry Smith                                         MatGetSubMatrices_SeqDense,
2014a5ae1ecdSBarry Smith                                         0,
20154b0e389bSBarry Smith                                         MatGetValues_SeqDense,
2016a5ae1ecdSBarry Smith                                         MatCopy_SeqDense,
2017d519adbfSMatthew Knepley                                 /* 44*/ MatGetRowMax_SeqDense,
2018a5ae1ecdSBarry Smith                                         MatScale_SeqDense,
2019a5ae1ecdSBarry Smith                                         0,
2020a5ae1ecdSBarry Smith                                         0,
2021a5ae1ecdSBarry Smith                                         0,
202273a71a0fSBarry Smith                                 /* 49*/ MatSetRandom_SeqDense,
2023a5ae1ecdSBarry Smith                                         0,
2024a5ae1ecdSBarry Smith                                         0,
2025a5ae1ecdSBarry Smith                                         0,
2026a5ae1ecdSBarry Smith                                         0,
2027d519adbfSMatthew Knepley                                 /* 54*/ 0,
2028a5ae1ecdSBarry Smith                                         0,
2029a5ae1ecdSBarry Smith                                         0,
2030a5ae1ecdSBarry Smith                                         0,
2031a5ae1ecdSBarry Smith                                         0,
2032d519adbfSMatthew Knepley                                 /* 59*/ 0,
2033e03a110bSBarry Smith                                         MatDestroy_SeqDense,
2034e03a110bSBarry Smith                                         MatView_SeqDense,
2035357abbc8SBarry Smith                                         0,
203697304618SKris Buschelman                                         0,
2037d519adbfSMatthew Knepley                                 /* 64*/ 0,
203897304618SKris Buschelman                                         0,
203997304618SKris Buschelman                                         0,
204097304618SKris Buschelman                                         0,
204197304618SKris Buschelman                                         0,
2042d519adbfSMatthew Knepley                                 /* 69*/ MatGetRowMaxAbs_SeqDense,
204397304618SKris Buschelman                                         0,
204497304618SKris Buschelman                                         0,
204597304618SKris Buschelman                                         0,
204697304618SKris Buschelman                                         0,
2047d519adbfSMatthew Knepley                                 /* 74*/ 0,
204897304618SKris Buschelman                                         0,
204997304618SKris Buschelman                                         0,
205097304618SKris Buschelman                                         0,
205197304618SKris Buschelman                                         0,
2052d519adbfSMatthew Knepley                                 /* 79*/ 0,
205397304618SKris Buschelman                                         0,
205497304618SKris Buschelman                                         0,
205597304618SKris Buschelman                                         0,
20565bba2384SShri Abhyankar                                 /* 83*/ MatLoad_SeqDense,
2057865e5f61SKris Buschelman                                         0,
20581cbb95d3SBarry Smith                                         MatIsHermitian_SeqDense,
2059865e5f61SKris Buschelman                                         0,
2060865e5f61SKris Buschelman                                         0,
2061865e5f61SKris Buschelman                                         0,
2062d519adbfSMatthew Knepley                                 /* 89*/ MatMatMult_SeqDense_SeqDense,
2063a9fe9ddaSSatish Balay                                         MatMatMultSymbolic_SeqDense_SeqDense,
2064a9fe9ddaSSatish Balay                                         MatMatMultNumeric_SeqDense_SeqDense,
2065865e5f61SKris Buschelman                                         0,
2066865e5f61SKris Buschelman                                         0,
2067d519adbfSMatthew Knepley                                 /* 94*/ 0,
20685df89d91SHong Zhang                                         0,
20695df89d91SHong Zhang                                         0,
20705df89d91SHong Zhang                                         0,
2071284134d9SBarry Smith                                         0,
2072d519adbfSMatthew Knepley                                 /* 99*/ 0,
2073284134d9SBarry Smith                                         0,
2074284134d9SBarry Smith                                         0,
2075ba337c44SJed Brown                                         MatConjugate_SeqDense,
2076f73d5cc4SBarry Smith                                         0,
2077ba337c44SJed Brown                                 /*104*/ 0,
2078ba337c44SJed Brown                                         MatRealPart_SeqDense,
2079ba337c44SJed Brown                                         MatImaginaryPart_SeqDense,
2080985db425SBarry Smith                                         0,
2081985db425SBarry Smith                                         0,
208285e2c93fSHong Zhang                                 /*109*/ MatMatSolve_SeqDense,
2083985db425SBarry Smith                                         0,
20848d0534beSBarry Smith                                         MatGetRowMin_SeqDense,
2085aabbc4fbSShri Abhyankar                                         MatGetColumnVector_SeqDense,
2086aabbc4fbSShri Abhyankar                                         0,
2087aabbc4fbSShri Abhyankar                                 /*114*/ 0,
2088aabbc4fbSShri Abhyankar                                         0,
2089aabbc4fbSShri Abhyankar                                         0,
2090aabbc4fbSShri Abhyankar                                         0,
2091aabbc4fbSShri Abhyankar                                         0,
2092aabbc4fbSShri Abhyankar                                 /*119*/ 0,
2093aabbc4fbSShri Abhyankar                                         0,
2094aabbc4fbSShri Abhyankar                                         0,
20950716a85fSBarry Smith                                         0,
20960716a85fSBarry Smith                                         0,
20970716a85fSBarry Smith                                 /*124*/ 0,
20985df89d91SHong Zhang                                         MatGetColumnNorms_SeqDense,
20995df89d91SHong Zhang                                         0,
21005df89d91SHong Zhang                                         0,
21015df89d91SHong Zhang                                         0,
21025df89d91SHong Zhang                                 /*129*/ 0,
210375648e8dSHong Zhang                                         MatTransposeMatMult_SeqDense_SeqDense,
210475648e8dSHong Zhang                                         MatTransposeMatMultSymbolic_SeqDense_SeqDense,
210575648e8dSHong Zhang                                         MatTransposeMatMultNumeric_SeqDense_SeqDense,
21063964eb88SJed Brown                                         0,
21073964eb88SJed Brown                                 /*134*/ 0,
21083964eb88SJed Brown                                         0,
21093964eb88SJed Brown                                         0,
21103964eb88SJed Brown                                         0,
21113964eb88SJed Brown                                         0,
21123964eb88SJed Brown                                 /*139*/ 0,
2113f9426fe0SMark Adams                                         0,
21143964eb88SJed Brown                                         0
2115985db425SBarry Smith };
211690ace30eSBarry Smith 
21174a2ae208SSatish Balay #undef __FUNCT__
21184a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense"
21194b828684SBarry Smith /*@C
2120fafbff53SBarry Smith    MatCreateSeqDense - Creates a sequential dense matrix that
2121d65003e9SLois Curfman McInnes    is stored in column major order (the usual Fortran 77 manner). Many
2122d65003e9SLois Curfman McInnes    of the matrix operations use the BLAS and LAPACK routines.
2123289bc588SBarry Smith 
2124db81eaa0SLois Curfman McInnes    Collective on MPI_Comm
2125db81eaa0SLois Curfman McInnes 
212620563c6bSBarry Smith    Input Parameters:
2127db81eaa0SLois Curfman McInnes +  comm - MPI communicator, set to PETSC_COMM_SELF
21280c775827SLois Curfman McInnes .  m - number of rows
212918f449edSLois Curfman McInnes .  n - number of columns
21300298fd71SBarry Smith -  data - optional location of matrix data in column major order.  Set data=NULL for PETSc
2131dfc5480cSLois Curfman McInnes    to control all matrix memory allocation.
213220563c6bSBarry Smith 
213320563c6bSBarry Smith    Output Parameter:
213444cd7ae7SLois Curfman McInnes .  A - the matrix
213520563c6bSBarry Smith 
2136b259b22eSLois Curfman McInnes    Notes:
213718f449edSLois Curfman McInnes    The data input variable is intended primarily for Fortran programmers
213818f449edSLois Curfman McInnes    who wish to allocate their own matrix memory space.  Most users should
21390298fd71SBarry Smith    set data=NULL.
214018f449edSLois Curfman McInnes 
2141027ccd11SLois Curfman McInnes    Level: intermediate
2142027ccd11SLois Curfman McInnes 
2143dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS
2144d65003e9SLois Curfman McInnes 
214569b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues()
214620563c6bSBarry Smith @*/
21477087cfbeSBarry Smith PetscErrorCode  MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A)
2148289bc588SBarry Smith {
2149dfbe8321SBarry Smith   PetscErrorCode ierr;
21503b2fbd54SBarry Smith 
21513a40ed3dSBarry Smith   PetscFunctionBegin;
2152f69a0ea3SMatthew Knepley   ierr = MatCreate(comm,A);CHKERRQ(ierr);
2153f69a0ea3SMatthew Knepley   ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr);
2154273d9f13SBarry Smith   ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr);
2155273d9f13SBarry Smith   ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr);
2156273d9f13SBarry Smith   PetscFunctionReturn(0);
2157273d9f13SBarry Smith }
2158273d9f13SBarry Smith 
21594a2ae208SSatish Balay #undef __FUNCT__
2160afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation"
2161273d9f13SBarry Smith /*@C
2162273d9f13SBarry Smith    MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements
2163273d9f13SBarry Smith 
2164273d9f13SBarry Smith    Collective on MPI_Comm
2165273d9f13SBarry Smith 
2166273d9f13SBarry Smith    Input Parameters:
21671c4f3114SJed Brown +  B - the matrix
21680298fd71SBarry Smith -  data - the array (or NULL)
2169273d9f13SBarry Smith 
2170273d9f13SBarry Smith    Notes:
2171273d9f13SBarry Smith    The data input variable is intended primarily for Fortran programmers
2172273d9f13SBarry Smith    who wish to allocate their own matrix memory space.  Most users should
2173284134d9SBarry Smith    need not call this routine.
2174273d9f13SBarry Smith 
2175273d9f13SBarry Smith    Level: intermediate
2176273d9f13SBarry Smith 
2177273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS
2178273d9f13SBarry Smith 
217969b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA()
2180867c911aSBarry Smith 
2181273d9f13SBarry Smith @*/
21827087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation(Mat B,PetscScalar data[])
2183273d9f13SBarry Smith {
21844ac538c5SBarry Smith   PetscErrorCode ierr;
2185a23d5eceSKris Buschelman 
2186a23d5eceSKris Buschelman   PetscFunctionBegin;
21874ac538c5SBarry Smith   ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr);
2188a23d5eceSKris Buschelman   PetscFunctionReturn(0);
2189a23d5eceSKris Buschelman }
2190a23d5eceSKris Buschelman 
2191a23d5eceSKris Buschelman #undef __FUNCT__
2192afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense"
21937087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data)
2194a23d5eceSKris Buschelman {
2195273d9f13SBarry Smith   Mat_SeqDense   *b;
2196dfbe8321SBarry Smith   PetscErrorCode ierr;
2197273d9f13SBarry Smith 
2198273d9f13SBarry Smith   PetscFunctionBegin;
2199273d9f13SBarry Smith   B->preallocated = PETSC_TRUE;
2200a868139aSShri Abhyankar 
220134ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr);
220234ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr);
220334ef9618SShri Abhyankar 
2204273d9f13SBarry Smith   b       = (Mat_SeqDense*)B->data;
220586d161a7SShri Abhyankar   b->Mmax = B->rmap->n;
220686d161a7SShri Abhyankar   b->Nmax = B->cmap->n;
220786d161a7SShri Abhyankar   if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n;
220886d161a7SShri Abhyankar 
22099e8f95c4SLisandro Dalcin   if (!data) { /* petsc-allocated storage */
22109e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2211e92229d0SSatish Balay     ierr = PetscCalloc1((size_t)b->lda*b->Nmax,&b->v);CHKERRQ(ierr);
22123bb1ff40SBarry Smith     ierr = PetscLogObjectMemory((PetscObject)B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
22132205254eSKarl Rupp 
22149e8f95c4SLisandro Dalcin     b->user_alloc = PETSC_FALSE;
2215273d9f13SBarry Smith   } else { /* user-allocated storage */
22169e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2217273d9f13SBarry Smith     b->v          = data;
2218273d9f13SBarry Smith     b->user_alloc = PETSC_TRUE;
2219273d9f13SBarry Smith   }
22200450473dSBarry Smith   B->assembled = PETSC_TRUE;
2221273d9f13SBarry Smith   PetscFunctionReturn(0);
2222273d9f13SBarry Smith }
2223273d9f13SBarry Smith 
22241b807ce4Svictorle #undef __FUNCT__
22258baccfbdSHong Zhang #define __FUNCT__ "MatConvert_SeqDense_Elemental"
22268baccfbdSHong Zhang PETSC_EXTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat)
22278baccfbdSHong Zhang {
2228d77f618aSHong Zhang   Mat            mat_elemental;
2229d77f618aSHong Zhang   PetscErrorCode ierr;
2230d77f618aSHong Zhang   PetscScalar    *array,*v_colwise;
2231d77f618aSHong Zhang   PetscInt       M=A->rmap->N,N=A->cmap->N,i,j,k,*rows,*cols;
2232d77f618aSHong Zhang 
22338baccfbdSHong Zhang   PetscFunctionBegin;
2234d77f618aSHong Zhang   ierr = PetscMalloc3(M*N,&v_colwise,M,&rows,N,&cols);CHKERRQ(ierr);
2235d77f618aSHong Zhang   ierr = MatDenseGetArray(A,&array);CHKERRQ(ierr);
2236d77f618aSHong Zhang   /* convert column-wise array into row-wise v_colwise, see MatSetValues_Elemental() */
2237d77f618aSHong Zhang   k = 0;
2238d77f618aSHong Zhang   for (j=0; j<N; j++) {
2239d77f618aSHong Zhang     cols[j] = j;
2240d77f618aSHong Zhang     for (i=0; i<M; i++) {
2241d77f618aSHong Zhang       v_colwise[j*M+i] = array[k++];
2242d77f618aSHong Zhang     }
2243d77f618aSHong Zhang   }
2244d77f618aSHong Zhang   for (i=0; i<M; i++) {
2245d77f618aSHong Zhang     rows[i] = i;
2246d77f618aSHong Zhang   }
2247d77f618aSHong Zhang   ierr = MatDenseRestoreArray(A,&array);CHKERRQ(ierr);
2248d77f618aSHong Zhang 
2249d77f618aSHong Zhang   ierr = MatCreate(PetscObjectComm((PetscObject)A), &mat_elemental);CHKERRQ(ierr);
2250d77f618aSHong Zhang   ierr = MatSetSizes(mat_elemental,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr);
2251d77f618aSHong Zhang   ierr = MatSetType(mat_elemental,MATELEMENTAL);CHKERRQ(ierr);
2252d77f618aSHong Zhang   ierr = MatSetUp(mat_elemental);CHKERRQ(ierr);
2253d77f618aSHong Zhang 
2254d77f618aSHong Zhang   /* PETSc-Elemental interaface uses axpy for setting off-processor entries, only ADD_VALUES is allowed */
2255d77f618aSHong Zhang   ierr = MatSetValues(mat_elemental,M,rows,N,cols,v_colwise,ADD_VALUES);CHKERRQ(ierr);
2256d77f618aSHong Zhang   ierr = MatAssemblyBegin(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2257d77f618aSHong Zhang   ierr = MatAssemblyEnd(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2258d77f618aSHong Zhang   ierr = PetscFree3(v_colwise,rows,cols);CHKERRQ(ierr);
2259d77f618aSHong Zhang 
2260d77f618aSHong Zhang   if (reuse == MAT_REUSE_MATRIX) {
2261d77f618aSHong Zhang     ierr = MatHeaderReplace(A,mat_elemental);CHKERRQ(ierr);
2262d77f618aSHong Zhang   } else {
2263d77f618aSHong Zhang     *newmat = mat_elemental;
2264d77f618aSHong Zhang   }
22658baccfbdSHong Zhang   PetscFunctionReturn(0);
22668baccfbdSHong Zhang }
22678baccfbdSHong Zhang 
22688baccfbdSHong Zhang #undef __FUNCT__
22691b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA"
22701b807ce4Svictorle /*@C
22711b807ce4Svictorle   MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array
22721b807ce4Svictorle 
22731b807ce4Svictorle   Input parameter:
22741b807ce4Svictorle + A - the matrix
22751b807ce4Svictorle - lda - the leading dimension
22761b807ce4Svictorle 
22771b807ce4Svictorle   Notes:
2278867c911aSBarry Smith   This routine is to be used in conjunction with MatSeqDenseSetPreallocation();
22791b807ce4Svictorle   it asserts that the preallocation has a leading dimension (the LDA parameter
22801b807ce4Svictorle   of Blas and Lapack fame) larger than M, the first dimension of the matrix.
22811b807ce4Svictorle 
22821b807ce4Svictorle   Level: intermediate
22831b807ce4Svictorle 
22841b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS
22851b807ce4Svictorle 
2286284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize()
2287867c911aSBarry Smith 
22881b807ce4Svictorle @*/
22897087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetLDA(Mat B,PetscInt lda)
22901b807ce4Svictorle {
22911b807ce4Svictorle   Mat_SeqDense *b = (Mat_SeqDense*)B->data;
229221a2c019SBarry Smith 
22931b807ce4Svictorle   PetscFunctionBegin;
2294e32f2f54SBarry 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);
22951b807ce4Svictorle   b->lda       = lda;
229621a2c019SBarry Smith   b->changelda = PETSC_FALSE;
229721a2c019SBarry Smith   b->Mmax      = PetscMax(b->Mmax,lda);
22981b807ce4Svictorle   PetscFunctionReturn(0);
22991b807ce4Svictorle }
23001b807ce4Svictorle 
23010bad9183SKris Buschelman /*MC
2302fafad747SKris Buschelman    MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices.
23030bad9183SKris Buschelman 
23040bad9183SKris Buschelman    Options Database Keys:
23050bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions()
23060bad9183SKris Buschelman 
23070bad9183SKris Buschelman   Level: beginner
23080bad9183SKris Buschelman 
230989665df3SBarry Smith .seealso: MatCreateSeqDense()
231089665df3SBarry Smith 
23110bad9183SKris Buschelman M*/
23120bad9183SKris Buschelman 
23134a2ae208SSatish Balay #undef __FUNCT__
23144a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense"
23158cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatCreate_SeqDense(Mat B)
2316273d9f13SBarry Smith {
2317273d9f13SBarry Smith   Mat_SeqDense   *b;
2318dfbe8321SBarry Smith   PetscErrorCode ierr;
23197c334f02SBarry Smith   PetscMPIInt    size;
2320273d9f13SBarry Smith 
2321273d9f13SBarry Smith   PetscFunctionBegin;
2322ce94432eSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr);
2323e32f2f54SBarry Smith   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1");
232455659b69SBarry Smith 
2325b00a9115SJed Brown   ierr    = PetscNewLog(B,&b);CHKERRQ(ierr);
2326549d3d68SSatish Balay   ierr    = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr);
232744cd7ae7SLois Curfman McInnes   B->data = (void*)b;
232818f449edSLois Curfman McInnes 
232944cd7ae7SLois Curfman McInnes   b->pivots      = 0;
2330273d9f13SBarry Smith   b->roworiented = PETSC_TRUE;
2331273d9f13SBarry Smith   b->v           = 0;
233221a2c019SBarry Smith   b->changelda   = PETSC_FALSE;
23334e220ebcSLois Curfman McInnes 
2334bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr);
2335bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr);
2336bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr);
23378baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
23388baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr);
23398baccfbdSHong Zhang #endif
2340bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr);
2341bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaij_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
2342bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
2343bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
23443bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaij_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
23453bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
23463bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaij_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
234717667f90SBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr);
23483a40ed3dSBarry Smith   PetscFunctionReturn(0);
2349289bc588SBarry Smith }
2350