xref: /petsc/src/mat/impls/dense/seq/dense.c (revision ce94432eddcd14845bc7e8083b7f8ea723b9bf7d)
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>
106a63e612SBarry Smith EXTERN_C_BEGIN
116a63e612SBarry Smith #undef __FUNCT__
126a63e612SBarry Smith #define __FUNCT__ "MatConvert_SeqDense_SeqAIJ"
136a63e612SBarry Smith 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;
186a63e612SBarry Smith   PetscInt       i;
196a63e612SBarry Smith   PetscInt       *rows;
206a63e612SBarry Smith   MatScalar      *aa = a->v;
216a63e612SBarry Smith 
226a63e612SBarry Smith   PetscFunctionBegin;
23*ce94432eSBarry 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);
260298fd71SBarry Smith   ierr = MatSeqAIJSetPreallocation(B,A->cmap->n,NULL);CHKERRQ(ierr);
276a63e612SBarry Smith 
286a63e612SBarry Smith   ierr = PetscMalloc(A->rmap->n*sizeof(PetscInt),&rows);CHKERRQ(ierr);
296a63e612SBarry Smith   for (i=0; i<A->rmap->n; i++) rows[i] = i;
306a63e612SBarry Smith 
316a63e612SBarry Smith   for (i=0; i<A->cmap->n; i++) {
326a63e612SBarry Smith     ierr = MatSetValues(B,A->rmap->n,rows,1,&i,aa,INSERT_VALUES);CHKERRQ(ierr);
336a63e612SBarry Smith     aa  += a->lda;
346a63e612SBarry Smith   }
356a63e612SBarry Smith   ierr = PetscFree(rows);CHKERRQ(ierr);
366a63e612SBarry Smith   ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
376a63e612SBarry Smith   ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
386a63e612SBarry Smith 
396a63e612SBarry Smith   if (reuse == MAT_REUSE_MATRIX) {
406a63e612SBarry Smith     ierr = MatHeaderReplace(A,B);CHKERRQ(ierr);
416a63e612SBarry Smith   } else {
426a63e612SBarry Smith     *newmat = B;
436a63e612SBarry Smith   }
446a63e612SBarry Smith   PetscFunctionReturn(0);
456a63e612SBarry Smith }
466a63e612SBarry Smith EXTERN_C_END
476a63e612SBarry Smith 
484a2ae208SSatish Balay #undef __FUNCT__
494a2ae208SSatish Balay #define __FUNCT__ "MatAXPY_SeqDense"
50f4df32b1SMatthew Knepley PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str)
511987afe7SBarry Smith {
521987afe7SBarry Smith   Mat_SeqDense   *x     = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data;
53f4df32b1SMatthew Knepley   PetscScalar    oalpha = alpha;
5413f74950SBarry Smith   PetscInt       j;
550805154bSBarry Smith   PetscBLASInt   N,m,ldax,lday,one = 1;
56efee365bSSatish Balay   PetscErrorCode ierr;
573a40ed3dSBarry Smith 
583a40ed3dSBarry Smith   PetscFunctionBegin;
59c5df96a5SBarry Smith   ierr = PetscBLASIntCast(X->rmap->n*X->cmap->n,&N);CHKERRQ(ierr);
60c5df96a5SBarry Smith   ierr = PetscBLASIntCast(X->rmap->n,&m);CHKERRQ(ierr);
61c5df96a5SBarry Smith   ierr = PetscBLASIntCast(x->lda,&ldax);CHKERRQ(ierr);
62c5df96a5SBarry Smith   ierr = PetscBLASIntCast(y->lda,&lday);CHKERRQ(ierr);
63a5ce6ee0Svictorle   if (ldax>m || lday>m) {
64d0f46423SBarry Smith     for (j=0; j<X->cmap->n; j++) {
65a83cb05cSBarry Smith       PetscStackCall("BLASaxpy",BLASaxpy_(&m,&oalpha,x->v+j*ldax,&one,y->v+j*lday,&one));
66a5ce6ee0Svictorle     }
67a5ce6ee0Svictorle   } else {
68a83cb05cSBarry Smith     PetscStackCall("BLASaxpy",BLASaxpy_(&N,&oalpha,x->v,&one,y->v,&one));
69a5ce6ee0Svictorle   }
700450473dSBarry Smith   ierr = PetscLogFlops(PetscMax(2*N-1,0));CHKERRQ(ierr);
713a40ed3dSBarry Smith   PetscFunctionReturn(0);
721987afe7SBarry Smith }
731987afe7SBarry Smith 
744a2ae208SSatish Balay #undef __FUNCT__
754a2ae208SSatish Balay #define __FUNCT__ "MatGetInfo_SeqDense"
76dfbe8321SBarry Smith PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info)
77289bc588SBarry Smith {
78d0f46423SBarry Smith   PetscInt N = A->rmap->n*A->cmap->n;
793a40ed3dSBarry Smith 
803a40ed3dSBarry Smith   PetscFunctionBegin;
814e220ebcSLois Curfman McInnes   info->block_size        = 1.0;
824e220ebcSLois Curfman McInnes   info->nz_allocated      = (double)N;
836de62eeeSBarry Smith   info->nz_used           = (double)N;
846de62eeeSBarry Smith   info->nz_unneeded       = (double)0;
854e220ebcSLois Curfman McInnes   info->assemblies        = (double)A->num_ass;
864e220ebcSLois Curfman McInnes   info->mallocs           = 0;
877adad957SLisandro Dalcin   info->memory            = ((PetscObject)A)->mem;
884e220ebcSLois Curfman McInnes   info->fill_ratio_given  = 0;
894e220ebcSLois Curfman McInnes   info->fill_ratio_needed = 0;
904e220ebcSLois Curfman McInnes   info->factor_mallocs    = 0;
913a40ed3dSBarry Smith   PetscFunctionReturn(0);
92289bc588SBarry Smith }
93289bc588SBarry Smith 
944a2ae208SSatish Balay #undef __FUNCT__
954a2ae208SSatish Balay #define __FUNCT__ "MatScale_SeqDense"
96f4df32b1SMatthew Knepley PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha)
9780cd9d93SLois Curfman McInnes {
98273d9f13SBarry Smith   Mat_SeqDense   *a     = (Mat_SeqDense*)A->data;
99f4df32b1SMatthew Knepley   PetscScalar    oalpha = alpha;
100efee365bSSatish Balay   PetscErrorCode ierr;
101c5df96a5SBarry Smith   PetscBLASInt   one = 1,j,nz,lda;
10280cd9d93SLois Curfman McInnes 
1033a40ed3dSBarry Smith   PetscFunctionBegin;
104c5df96a5SBarry Smith   ierr = PetscBLASIntCast(a->lda,&lda);CHKERRQ(ierr);
105d0f46423SBarry Smith   if (lda>A->rmap->n) {
106c5df96a5SBarry Smith     ierr = PetscBLASIntCast(A->rmap->n,&nz);CHKERRQ(ierr);
107d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
108a83cb05cSBarry Smith       PetscStackCall("BLASscal",BLASscal_(&nz,&oalpha,a->v+j*lda,&one));
109a5ce6ee0Svictorle     }
110a5ce6ee0Svictorle   } else {
111c5df96a5SBarry Smith     ierr = PetscBLASIntCast(A->rmap->n*A->cmap->n,&nz);CHKERRQ(ierr);
112a83cb05cSBarry Smith     PetscStackCall("BLASscal",BLASscal_(&nz,&oalpha,a->v,&one));
113a5ce6ee0Svictorle   }
114efee365bSSatish Balay   ierr = PetscLogFlops(nz);CHKERRQ(ierr);
1153a40ed3dSBarry Smith   PetscFunctionReturn(0);
11680cd9d93SLois Curfman McInnes }
11780cd9d93SLois Curfman McInnes 
1181cbb95d3SBarry Smith #undef __FUNCT__
1191cbb95d3SBarry Smith #define __FUNCT__ "MatIsHermitian_SeqDense"
120ace3abfcSBarry Smith PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscBool  *fl)
1211cbb95d3SBarry Smith {
1221cbb95d3SBarry Smith   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
123d0f46423SBarry Smith   PetscInt     i,j,m = A->rmap->n,N;
1241cbb95d3SBarry Smith   PetscScalar  *v = a->v;
1251cbb95d3SBarry Smith 
1261cbb95d3SBarry Smith   PetscFunctionBegin;
1271cbb95d3SBarry Smith   *fl = PETSC_FALSE;
128d0f46423SBarry Smith   if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0);
1291cbb95d3SBarry Smith   N = a->lda;
1301cbb95d3SBarry Smith 
1311cbb95d3SBarry Smith   for (i=0; i<m; i++) {
1321cbb95d3SBarry Smith     for (j=i+1; j<m; j++) {
1331cbb95d3SBarry Smith       if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) PetscFunctionReturn(0);
1341cbb95d3SBarry Smith     }
1351cbb95d3SBarry Smith   }
1361cbb95d3SBarry Smith   *fl = PETSC_TRUE;
1371cbb95d3SBarry Smith   PetscFunctionReturn(0);
1381cbb95d3SBarry Smith }
1391cbb95d3SBarry Smith 
140b24902e0SBarry Smith #undef __FUNCT__
141b24902e0SBarry Smith #define __FUNCT__ "MatDuplicateNoCreate_SeqDense"
142719d5645SBarry Smith PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat newi,Mat A,MatDuplicateOption cpvalues)
143b24902e0SBarry Smith {
144b24902e0SBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data,*l;
145b24902e0SBarry Smith   PetscErrorCode ierr;
146b24902e0SBarry Smith   PetscInt       lda = (PetscInt)mat->lda,j,m;
147b24902e0SBarry Smith 
148b24902e0SBarry Smith   PetscFunctionBegin;
149aa5ea44dSBarry Smith   ierr = PetscLayoutReference(A->rmap,&newi->rmap);CHKERRQ(ierr);
150aa5ea44dSBarry Smith   ierr = PetscLayoutReference(A->cmap,&newi->cmap);CHKERRQ(ierr);
1510298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(newi,NULL);CHKERRQ(ierr);
152b24902e0SBarry Smith   if (cpvalues == MAT_COPY_VALUES) {
153b24902e0SBarry Smith     l = (Mat_SeqDense*)newi->data;
154d0f46423SBarry Smith     if (lda>A->rmap->n) {
155d0f46423SBarry Smith       m = A->rmap->n;
156d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
157b24902e0SBarry Smith         ierr = PetscMemcpy(l->v+j*m,mat->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
158b24902e0SBarry Smith       }
159b24902e0SBarry Smith     } else {
160d0f46423SBarry Smith       ierr = PetscMemcpy(l->v,mat->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
161b24902e0SBarry Smith     }
162b24902e0SBarry Smith   }
163b24902e0SBarry Smith   newi->assembled = PETSC_TRUE;
164b24902e0SBarry Smith   PetscFunctionReturn(0);
165b24902e0SBarry Smith }
166b24902e0SBarry Smith 
1674a2ae208SSatish Balay #undef __FUNCT__
1684a2ae208SSatish Balay #define __FUNCT__ "MatDuplicate_SeqDense"
169dfbe8321SBarry Smith PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat)
17002cad45dSBarry Smith {
1716849ba73SBarry Smith   PetscErrorCode ierr;
17202cad45dSBarry Smith 
1733a40ed3dSBarry Smith   PetscFunctionBegin;
174*ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),newmat);CHKERRQ(ierr);
175d0f46423SBarry Smith   ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
1765c9eb25fSBarry Smith   ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
177719d5645SBarry Smith   ierr = MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues);CHKERRQ(ierr);
178b24902e0SBarry Smith   PetscFunctionReturn(0);
179b24902e0SBarry Smith }
180b24902e0SBarry Smith 
1816ee01492SSatish Balay 
1820481f469SBarry Smith extern PetscErrorCode MatLUFactor_SeqDense(Mat,IS,IS,const MatFactorInfo*);
183719d5645SBarry Smith 
1844a2ae208SSatish Balay #undef __FUNCT__
1854a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorNumeric_SeqDense"
1860481f469SBarry Smith PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
187289bc588SBarry Smith {
1884482741eSBarry Smith   MatFactorInfo  info;
189a093e273SMatthew Knepley   PetscErrorCode ierr;
1903a40ed3dSBarry Smith 
1913a40ed3dSBarry Smith   PetscFunctionBegin;
192c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
193719d5645SBarry Smith   ierr = MatLUFactor_SeqDense(fact,0,0,&info);CHKERRQ(ierr);
1943a40ed3dSBarry Smith   PetscFunctionReturn(0);
195289bc588SBarry Smith }
1966ee01492SSatish Balay 
1970b4b3355SBarry Smith #undef __FUNCT__
1984a2ae208SSatish Balay #define __FUNCT__ "MatSolve_SeqDense"
199dfbe8321SBarry Smith PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy)
200289bc588SBarry Smith {
201c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
2026849ba73SBarry Smith   PetscErrorCode ierr;
20387828ca2SBarry Smith   PetscScalar    *x,*y;
204c5df96a5SBarry Smith   PetscBLASInt   one = 1,info,m;
20567e560aaSBarry Smith 
2063a40ed3dSBarry Smith   PetscFunctionBegin;
207c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
2081ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
2091ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
210d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
211d5f3da31SBarry Smith   if (A->factortype == MAT_FACTOR_LU) {
212ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
213e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
214ae7cfcebSSatish Balay #else
215f75e95b9SBarry Smith     PetscStackCall("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
216e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
217ae7cfcebSSatish Balay #endif
218d5f3da31SBarry Smith   } else if (A->factortype == MAT_FACTOR_CHOLESKY) {
219ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
220e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
221ae7cfcebSSatish Balay #else
222f75e95b9SBarry Smith     PetscStackCall("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
223e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
224ae7cfcebSSatish Balay #endif
2252205254eSKarl Rupp   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
2261ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
2271ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
228dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
2293a40ed3dSBarry Smith   PetscFunctionReturn(0);
230289bc588SBarry Smith }
2316ee01492SSatish Balay 
2324a2ae208SSatish Balay #undef __FUNCT__
23385e2c93fSHong Zhang #define __FUNCT__ "MatMatSolve_SeqDense"
23485e2c93fSHong Zhang PetscErrorCode MatMatSolve_SeqDense(Mat A,Mat B,Mat X)
23585e2c93fSHong Zhang {
23685e2c93fSHong Zhang   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
23785e2c93fSHong Zhang   PetscErrorCode ierr;
23885e2c93fSHong Zhang   PetscScalar    *b,*x;
239efb80c78SLisandro Dalcin   PetscInt       n;
240783b601eSJed Brown   PetscBLASInt   nrhs,info,m;
241bda8bf91SBarry Smith   PetscBool      flg;
24285e2c93fSHong Zhang 
24385e2c93fSHong Zhang   PetscFunctionBegin;
244c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
2450298fd71SBarry Smith   ierr = PetscObjectTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr);
246*ce94432eSBarry Smith   if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix B must be MATDENSE matrix");
2470298fd71SBarry Smith   ierr = PetscObjectTypeCompareAny((PetscObject)X,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr);
248*ce94432eSBarry Smith   if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix X must be MATDENSE matrix");
249bda8bf91SBarry Smith 
2500298fd71SBarry Smith   ierr = MatGetSize(B,NULL,&n);CHKERRQ(ierr);
251c5df96a5SBarry Smith   ierr = PetscBLASIntCast(n,&nrhs);CHKERRQ(ierr);
2528c778c55SBarry Smith   ierr = MatDenseGetArray(B,&b);CHKERRQ(ierr);
2538c778c55SBarry Smith   ierr = MatDenseGetArray(X,&x);CHKERRQ(ierr);
25485e2c93fSHong Zhang 
255f272c775SHong Zhang   ierr = PetscMemcpy(x,b,m*nrhs*sizeof(PetscScalar));CHKERRQ(ierr);
25685e2c93fSHong Zhang 
25785e2c93fSHong Zhang   if (A->factortype == MAT_FACTOR_LU) {
25885e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_GETRS)
25985e2c93fSHong Zhang     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
26085e2c93fSHong Zhang #else
261f75e95b9SBarry Smith     PetscStackCall("LAPACKgetrs",LAPACKgetrs_("N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info));
26285e2c93fSHong Zhang     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
26385e2c93fSHong Zhang #endif
26485e2c93fSHong Zhang   } else if (A->factortype == MAT_FACTOR_CHOLESKY) {
26585e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_POTRS)
26685e2c93fSHong Zhang     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
26785e2c93fSHong Zhang #else
268f75e95b9SBarry Smith     PetscStackCall("LAPACKpotrs",LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info));
26985e2c93fSHong Zhang     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
27085e2c93fSHong Zhang #endif
2712205254eSKarl Rupp   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
27285e2c93fSHong Zhang 
2738c778c55SBarry Smith   ierr = MatDenseRestoreArray(B,&b);CHKERRQ(ierr);
2748c778c55SBarry Smith   ierr = MatDenseRestoreArray(X,&x);CHKERRQ(ierr);
27585e2c93fSHong Zhang   ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr);
27685e2c93fSHong Zhang   PetscFunctionReturn(0);
27785e2c93fSHong Zhang }
27885e2c93fSHong Zhang 
27985e2c93fSHong Zhang #undef __FUNCT__
2804a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense"
281dfbe8321SBarry Smith PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy)
282da3a660dSBarry Smith {
283c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
284dfbe8321SBarry Smith   PetscErrorCode ierr;
28587828ca2SBarry Smith   PetscScalar    *x,*y;
286c5df96a5SBarry Smith   PetscBLASInt   one = 1,info,m;
28767e560aaSBarry Smith 
2883a40ed3dSBarry Smith   PetscFunctionBegin;
289c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
2901ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
2911ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
292d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
293752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
294da3a660dSBarry Smith   if (mat->pivots) {
295ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
296e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
297ae7cfcebSSatish Balay #else
298f75e95b9SBarry Smith     PetscStackCall("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
299e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve");
300ae7cfcebSSatish Balay #endif
3017a97a34bSBarry Smith   } else {
302ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
303e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
304ae7cfcebSSatish Balay #else
305f75e95b9SBarry Smith     PetscStackCall("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
306e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve");
307ae7cfcebSSatish Balay #endif
308da3a660dSBarry Smith   }
3091ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
3101ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
311dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
3123a40ed3dSBarry Smith   PetscFunctionReturn(0);
313da3a660dSBarry Smith }
3146ee01492SSatish Balay 
3154a2ae208SSatish Balay #undef __FUNCT__
3164a2ae208SSatish Balay #define __FUNCT__ "MatSolveAdd_SeqDense"
317dfbe8321SBarry Smith PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
318da3a660dSBarry Smith {
319c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
320dfbe8321SBarry Smith   PetscErrorCode ierr;
32187828ca2SBarry Smith   PetscScalar    *x,*y,sone = 1.0;
322da3a660dSBarry Smith   Vec            tmp = 0;
323c5df96a5SBarry Smith   PetscBLASInt   one = 1,info,m;
32467e560aaSBarry Smith 
3253a40ed3dSBarry Smith   PetscFunctionBegin;
326c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
3271ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
3281ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
329d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
330da3a660dSBarry Smith   if (yy == zz) {
33178b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
33252e6d16bSBarry Smith     ierr = PetscLogObjectParent(A,tmp);CHKERRQ(ierr);
33378b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
334da3a660dSBarry Smith   }
335d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
336752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
337da3a660dSBarry Smith   if (mat->pivots) {
338ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
339e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
340ae7cfcebSSatish Balay #else
341f75e95b9SBarry Smith     PetscStackCall("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
342e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
343ae7cfcebSSatish Balay #endif
344a8c6a408SBarry Smith   } else {
345ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
346e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
347ae7cfcebSSatish Balay #else
348f75e95b9SBarry Smith     PetscStackCall("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
349e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
350ae7cfcebSSatish Balay #endif
351da3a660dSBarry Smith   }
3526bf464f9SBarry Smith   if (tmp) {
3536bf464f9SBarry Smith     ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr);
3546bf464f9SBarry Smith     ierr = VecDestroy(&tmp);CHKERRQ(ierr);
3556bf464f9SBarry Smith   } else {
3566bf464f9SBarry Smith     ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);
3576bf464f9SBarry Smith   }
3581ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
3591ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
360dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
3613a40ed3dSBarry Smith   PetscFunctionReturn(0);
362da3a660dSBarry Smith }
36367e560aaSBarry Smith 
3644a2ae208SSatish Balay #undef __FUNCT__
3654a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense"
366dfbe8321SBarry Smith PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
367da3a660dSBarry Smith {
368c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
3696849ba73SBarry Smith   PetscErrorCode ierr;
37087828ca2SBarry Smith   PetscScalar    *x,*y,sone = 1.0;
371da3a660dSBarry Smith   Vec            tmp;
372c5df96a5SBarry Smith   PetscBLASInt   one = 1,info,m;
37367e560aaSBarry Smith 
3743a40ed3dSBarry Smith   PetscFunctionBegin;
375c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
376d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
3771ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
3781ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
379da3a660dSBarry Smith   if (yy == zz) {
38078b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
38152e6d16bSBarry Smith     ierr = PetscLogObjectParent(A,tmp);CHKERRQ(ierr);
38278b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
383da3a660dSBarry Smith   }
384d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
385752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
386da3a660dSBarry Smith   if (mat->pivots) {
387ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
388e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
389ae7cfcebSSatish Balay #else
390f75e95b9SBarry Smith     PetscStackCall("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
391e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
392ae7cfcebSSatish Balay #endif
3933a40ed3dSBarry Smith   } else {
394ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
395e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
396ae7cfcebSSatish Balay #else
397f75e95b9SBarry Smith     PetscStackCall("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
398e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
399ae7cfcebSSatish Balay #endif
400da3a660dSBarry Smith   }
40190f02eecSBarry Smith   if (tmp) {
4022dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr);
4036bf464f9SBarry Smith     ierr = VecDestroy(&tmp);CHKERRQ(ierr);
4043a40ed3dSBarry Smith   } else {
4052dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);
40690f02eecSBarry Smith   }
4071ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
4081ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
409dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
4103a40ed3dSBarry Smith   PetscFunctionReturn(0);
411da3a660dSBarry Smith }
412db4efbfdSBarry Smith 
413db4efbfdSBarry Smith /* ---------------------------------------------------------------*/
414db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots,
415db4efbfdSBarry Smith    rather than put it in the Mat->row slot.*/
416db4efbfdSBarry Smith #undef __FUNCT__
417db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactor_SeqDense"
4180481f469SBarry Smith PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo)
419db4efbfdSBarry Smith {
420db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF)
421db4efbfdSBarry Smith   PetscFunctionBegin;
422e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable.");
423db4efbfdSBarry Smith #else
424db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
425db4efbfdSBarry Smith   PetscErrorCode ierr;
426db4efbfdSBarry Smith   PetscBLASInt   n,m,info;
427db4efbfdSBarry Smith 
428db4efbfdSBarry Smith   PetscFunctionBegin;
429c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
430c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
431db4efbfdSBarry Smith   if (!mat->pivots) {
432db4efbfdSBarry Smith     ierr = PetscMalloc((A->rmap->n+1)*sizeof(PetscBLASInt),&mat->pivots);CHKERRQ(ierr);
433db4efbfdSBarry Smith     ierr = PetscLogObjectMemory(A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr);
434db4efbfdSBarry Smith   }
435db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
4368e57ea43SSatish Balay   ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
437f75e95b9SBarry Smith   PetscStackCall("LAPACKgetrf",LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info));
4388e57ea43SSatish Balay   ierr = PetscFPTrapPop();CHKERRQ(ierr);
4398e57ea43SSatish Balay 
440e32f2f54SBarry Smith   if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization");
441e32f2f54SBarry Smith   if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization");
442db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
443db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
444db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
445db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
446d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_LU;
447db4efbfdSBarry Smith 
448dc0b31edSSatish Balay   ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr);
449db4efbfdSBarry Smith #endif
450db4efbfdSBarry Smith   PetscFunctionReturn(0);
451db4efbfdSBarry Smith }
452db4efbfdSBarry Smith 
453db4efbfdSBarry Smith #undef __FUNCT__
454db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactor_SeqDense"
4550481f469SBarry Smith PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo)
456db4efbfdSBarry Smith {
457db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF)
458db4efbfdSBarry Smith   PetscFunctionBegin;
459e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable.");
460db4efbfdSBarry Smith #else
461db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
462db4efbfdSBarry Smith   PetscErrorCode ierr;
463c5df96a5SBarry Smith   PetscBLASInt   info,n;
464db4efbfdSBarry Smith 
465db4efbfdSBarry Smith   PetscFunctionBegin;
466c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
467db4efbfdSBarry Smith   ierr = PetscFree(mat->pivots);CHKERRQ(ierr);
468db4efbfdSBarry Smith 
469db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
470f75e95b9SBarry Smith   PetscStackCall("LAPACKpotrf",LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info));
471e32f2f54SBarry Smith   if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1);
472db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
473db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
474db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
475db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
476d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_CHOLESKY;
4772205254eSKarl Rupp 
478dc0b31edSSatish Balay   ierr = PetscLogFlops((A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr);
479db4efbfdSBarry Smith #endif
480db4efbfdSBarry Smith   PetscFunctionReturn(0);
481db4efbfdSBarry Smith }
482db4efbfdSBarry Smith 
483db4efbfdSBarry Smith 
484db4efbfdSBarry Smith #undef __FUNCT__
485db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense"
4860481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
487db4efbfdSBarry Smith {
488db4efbfdSBarry Smith   PetscErrorCode ierr;
489db4efbfdSBarry Smith   MatFactorInfo  info;
490db4efbfdSBarry Smith 
491db4efbfdSBarry Smith   PetscFunctionBegin;
492db4efbfdSBarry Smith   info.fill = 1.0;
4932205254eSKarl Rupp 
494c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
495719d5645SBarry Smith   ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr);
496db4efbfdSBarry Smith   PetscFunctionReturn(0);
497db4efbfdSBarry Smith }
498db4efbfdSBarry Smith 
499db4efbfdSBarry Smith #undef __FUNCT__
500db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense"
5010481f469SBarry Smith PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info)
502db4efbfdSBarry Smith {
503db4efbfdSBarry Smith   PetscFunctionBegin;
504c3ef05f6SHong Zhang   fact->assembled                  = PETSC_TRUE;
5051bbcc794SSatish Balay   fact->preallocated               = PETSC_TRUE;
506719d5645SBarry Smith   fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense;
507db4efbfdSBarry Smith   PetscFunctionReturn(0);
508db4efbfdSBarry Smith }
509db4efbfdSBarry Smith 
510db4efbfdSBarry Smith #undef __FUNCT__
511db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactorSymbolic_SeqDense"
5120481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info)
513db4efbfdSBarry Smith {
514db4efbfdSBarry Smith   PetscFunctionBegin;
515b66fe19dSMatthew G Knepley   fact->preallocated         = PETSC_TRUE;
516c3ef05f6SHong Zhang   fact->assembled            = PETSC_TRUE;
517719d5645SBarry Smith   fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense;
518db4efbfdSBarry Smith   PetscFunctionReturn(0);
519db4efbfdSBarry Smith }
520db4efbfdSBarry Smith 
521bb5747d9SMatthew Knepley EXTERN_C_BEGIN
522db4efbfdSBarry Smith #undef __FUNCT__
523db4efbfdSBarry Smith #define __FUNCT__ "MatGetFactor_seqdense_petsc"
524db4efbfdSBarry Smith PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact)
525db4efbfdSBarry Smith {
526db4efbfdSBarry Smith   PetscErrorCode ierr;
527db4efbfdSBarry Smith 
528db4efbfdSBarry Smith   PetscFunctionBegin;
529*ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),fact);CHKERRQ(ierr);
530db4efbfdSBarry Smith   ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
531db4efbfdSBarry Smith   ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr);
532db4efbfdSBarry Smith   if (ftype == MAT_FACTOR_LU) {
533db4efbfdSBarry Smith     (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense;
534db4efbfdSBarry Smith   } else {
535db4efbfdSBarry Smith     (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense;
536db4efbfdSBarry Smith   }
537d5f3da31SBarry Smith   (*fact)->factortype = ftype;
538db4efbfdSBarry Smith   PetscFunctionReturn(0);
539db4efbfdSBarry Smith }
540bb5747d9SMatthew Knepley EXTERN_C_END
541db4efbfdSBarry Smith 
542289bc588SBarry Smith /* ------------------------------------------------------------------*/
5434a2ae208SSatish Balay #undef __FUNCT__
54441f059aeSBarry Smith #define __FUNCT__ "MatSOR_SeqDense"
54541f059aeSBarry Smith PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx)
546289bc588SBarry Smith {
547c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
54887828ca2SBarry Smith   PetscScalar    *x,*b,*v = mat->v,zero = 0.0,xt;
549dfbe8321SBarry Smith   PetscErrorCode ierr;
550d0f46423SBarry Smith   PetscInt       m = A->rmap->n,i;
551c5df96a5SBarry Smith   PetscBLASInt   o = 1,bm;
552289bc588SBarry Smith 
5533a40ed3dSBarry Smith   PetscFunctionBegin;
554c5df96a5SBarry Smith   ierr = PetscBLASIntCast(m,&bm);CHKERRQ(ierr);
555289bc588SBarry Smith   if (flag & SOR_ZERO_INITIAL_GUESS) {
55671044d3cSBarry Smith     /* this is a hack fix, should have another version without the second BLASdot */
5572dcb1b2aSMatthew Knepley     ierr = VecSet(xx,zero);CHKERRQ(ierr);
558289bc588SBarry Smith   }
5591ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
5601ebc52fbSHong Zhang   ierr = VecGetArray(bb,&b);CHKERRQ(ierr);
561b965ef7fSBarry Smith   its  = its*lits;
562e32f2f54SBarry 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);
563289bc588SBarry Smith   while (its--) {
564fccaa45eSBarry Smith     if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) {
565289bc588SBarry Smith       for (i=0; i<m; i++) {
566a83cb05cSBarry Smith         PetscStackCall("BLASdot",xt   = b[i] - BLASdot_(&bm,v+i,&bm,x,&o));
56755a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
568289bc588SBarry Smith       }
569289bc588SBarry Smith     }
570fccaa45eSBarry Smith     if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) {
571289bc588SBarry Smith       for (i=m-1; i>=0; i--) {
572a83cb05cSBarry Smith         PetscStackCall("BLASdot",xt   = b[i] - BLASdot_(&bm,v+i,&bm,x,&o));
57355a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
574289bc588SBarry Smith       }
575289bc588SBarry Smith     }
576289bc588SBarry Smith   }
5771ebc52fbSHong Zhang   ierr = VecRestoreArray(bb,&b);CHKERRQ(ierr);
5781ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
5793a40ed3dSBarry Smith   PetscFunctionReturn(0);
580289bc588SBarry Smith }
581289bc588SBarry Smith 
582289bc588SBarry Smith /* -----------------------------------------------------------------*/
5834a2ae208SSatish Balay #undef __FUNCT__
5844a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense"
585dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy)
586289bc588SBarry Smith {
587c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
58887828ca2SBarry Smith   PetscScalar    *v   = mat->v,*x,*y;
589dfbe8321SBarry Smith   PetscErrorCode ierr;
5900805154bSBarry Smith   PetscBLASInt   m, n,_One=1;
591ea709b57SSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
5923a40ed3dSBarry Smith 
5933a40ed3dSBarry Smith   PetscFunctionBegin;
594c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
595c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
596d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
5971ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
5981ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
599a83cb05cSBarry Smith   PetscStackCall("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One));
6001ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6011ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
602dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
6033a40ed3dSBarry Smith   PetscFunctionReturn(0);
604289bc588SBarry Smith }
605800995b7SMatthew Knepley 
6064a2ae208SSatish Balay #undef __FUNCT__
6074a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense"
608dfbe8321SBarry Smith PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy)
609289bc588SBarry Smith {
610c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
61187828ca2SBarry Smith   PetscScalar    *v   = mat->v,*x,*y,_DOne=1.0,_DZero=0.0;
612dfbe8321SBarry Smith   PetscErrorCode ierr;
6130805154bSBarry Smith   PetscBLASInt   m, n, _One=1;
6143a40ed3dSBarry Smith 
6153a40ed3dSBarry Smith   PetscFunctionBegin;
616c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
617c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
618d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
6191ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
6201ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
621a83cb05cSBarry Smith   PetscStackCall("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One));
6221ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6231ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
624dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr);
6253a40ed3dSBarry Smith   PetscFunctionReturn(0);
626289bc588SBarry Smith }
6276ee01492SSatish Balay 
6284a2ae208SSatish Balay #undef __FUNCT__
6294a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense"
630dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
631289bc588SBarry Smith {
632c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
63387828ca2SBarry Smith   PetscScalar    *v   = mat->v,*x,*y,_DOne=1.0;
634dfbe8321SBarry Smith   PetscErrorCode ierr;
6350805154bSBarry Smith   PetscBLASInt   m, n, _One=1;
6363a40ed3dSBarry Smith 
6373a40ed3dSBarry Smith   PetscFunctionBegin;
638c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
639c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
640d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
641600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
6421ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
6431ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
644a83cb05cSBarry Smith   PetscStackCall("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
6451ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6461ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
647dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
6483a40ed3dSBarry Smith   PetscFunctionReturn(0);
649289bc588SBarry Smith }
6506ee01492SSatish Balay 
6514a2ae208SSatish Balay #undef __FUNCT__
6524a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense"
653dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
654289bc588SBarry Smith {
655c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
65687828ca2SBarry Smith   PetscScalar    *v   = mat->v,*x,*y;
657dfbe8321SBarry Smith   PetscErrorCode ierr;
6580805154bSBarry Smith   PetscBLASInt   m, n, _One=1;
65987828ca2SBarry Smith   PetscScalar    _DOne=1.0;
6603a40ed3dSBarry Smith 
6613a40ed3dSBarry Smith   PetscFunctionBegin;
662c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
663c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
664d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
665600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
6661ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
6671ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
668a83cb05cSBarry Smith   PetscStackCall("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
6691ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6701ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
671dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
6723a40ed3dSBarry Smith   PetscFunctionReturn(0);
673289bc588SBarry Smith }
674289bc588SBarry Smith 
675289bc588SBarry Smith /* -----------------------------------------------------------------*/
6764a2ae208SSatish Balay #undef __FUNCT__
6774a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense"
67813f74950SBarry Smith PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
679289bc588SBarry Smith {
680c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
68187828ca2SBarry Smith   PetscScalar    *v;
6826849ba73SBarry Smith   PetscErrorCode ierr;
68313f74950SBarry Smith   PetscInt       i;
68467e560aaSBarry Smith 
6853a40ed3dSBarry Smith   PetscFunctionBegin;
686d0f46423SBarry Smith   *ncols = A->cmap->n;
687289bc588SBarry Smith   if (cols) {
688d0f46423SBarry Smith     ierr = PetscMalloc((A->cmap->n+1)*sizeof(PetscInt),cols);CHKERRQ(ierr);
689d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) (*cols)[i] = i;
690289bc588SBarry Smith   }
691289bc588SBarry Smith   if (vals) {
692d0f46423SBarry Smith     ierr = PetscMalloc((A->cmap->n+1)*sizeof(PetscScalar),vals);CHKERRQ(ierr);
693289bc588SBarry Smith     v    = mat->v + row;
694d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;}
695289bc588SBarry Smith   }
6963a40ed3dSBarry Smith   PetscFunctionReturn(0);
697289bc588SBarry Smith }
6986ee01492SSatish Balay 
6994a2ae208SSatish Balay #undef __FUNCT__
7004a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense"
70113f74950SBarry Smith PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
702289bc588SBarry Smith {
703dfbe8321SBarry Smith   PetscErrorCode ierr;
7046e111a19SKarl Rupp 
705606d414cSSatish Balay   PetscFunctionBegin;
706606d414cSSatish Balay   if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);}
707606d414cSSatish Balay   if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); }
7083a40ed3dSBarry Smith   PetscFunctionReturn(0);
709289bc588SBarry Smith }
710289bc588SBarry Smith /* ----------------------------------------------------------------*/
7114a2ae208SSatish Balay #undef __FUNCT__
7124a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense"
71313f74950SBarry Smith PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv)
714289bc588SBarry Smith {
715c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
71613f74950SBarry Smith   PetscInt     i,j,idx=0;
717d6dfbf8fSBarry Smith 
7183a40ed3dSBarry Smith   PetscFunctionBegin;
71971fd2e92SBarry Smith   if (v) PetscValidScalarPointer(v,6);
720289bc588SBarry Smith   if (!mat->roworiented) {
721dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
722289bc588SBarry Smith       for (j=0; j<n; j++) {
723cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
7242515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
725e32f2f54SBarry 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);
72658804f6dSBarry Smith #endif
727289bc588SBarry Smith         for (i=0; i<m; i++) {
728cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
7292515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
730e32f2f54SBarry 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);
73158804f6dSBarry Smith #endif
732cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
733289bc588SBarry Smith         }
734289bc588SBarry Smith       }
7353a40ed3dSBarry Smith     } else {
736289bc588SBarry Smith       for (j=0; j<n; j++) {
737cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
7382515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
739e32f2f54SBarry 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);
74058804f6dSBarry Smith #endif
741289bc588SBarry Smith         for (i=0; i<m; i++) {
742cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
7432515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
744e32f2f54SBarry 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);
74558804f6dSBarry Smith #endif
746cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
747289bc588SBarry Smith         }
748289bc588SBarry Smith       }
749289bc588SBarry Smith     }
7503a40ed3dSBarry Smith   } else {
751dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
752e8d4e0b9SBarry Smith       for (i=0; i<m; i++) {
753cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
7542515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
755e32f2f54SBarry 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);
75658804f6dSBarry Smith #endif
757e8d4e0b9SBarry Smith         for (j=0; j<n; j++) {
758cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
7592515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
760e32f2f54SBarry 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);
76158804f6dSBarry Smith #endif
762cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
763e8d4e0b9SBarry Smith         }
764e8d4e0b9SBarry Smith       }
7653a40ed3dSBarry Smith     } else {
766289bc588SBarry Smith       for (i=0; i<m; i++) {
767cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
7682515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
769e32f2f54SBarry 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);
77058804f6dSBarry Smith #endif
771289bc588SBarry Smith         for (j=0; j<n; j++) {
772cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
7732515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
774e32f2f54SBarry Smith           if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1);
77558804f6dSBarry Smith #endif
776cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
777289bc588SBarry Smith         }
778289bc588SBarry Smith       }
779289bc588SBarry Smith     }
780e8d4e0b9SBarry Smith   }
7813a40ed3dSBarry Smith   PetscFunctionReturn(0);
782289bc588SBarry Smith }
783e8d4e0b9SBarry Smith 
7844a2ae208SSatish Balay #undef __FUNCT__
7854a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense"
78613f74950SBarry Smith PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[])
787ae80bb75SLois Curfman McInnes {
788ae80bb75SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
78913f74950SBarry Smith   PetscInt     i,j;
790ae80bb75SLois Curfman McInnes 
7913a40ed3dSBarry Smith   PetscFunctionBegin;
792ae80bb75SLois Curfman McInnes   /* row-oriented output */
793ae80bb75SLois Curfman McInnes   for (i=0; i<m; i++) {
79497e567efSBarry Smith     if (indexm[i] < 0) {v += n;continue;}
795e32f2f54SBarry 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);
796ae80bb75SLois Curfman McInnes     for (j=0; j<n; j++) {
7976f31f424SBarry Smith       if (indexn[j] < 0) {v++; continue;}
798e32f2f54SBarry 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);
79997e567efSBarry Smith       *v++ = mat->v[indexn[j]*mat->lda + indexm[i]];
800ae80bb75SLois Curfman McInnes     }
801ae80bb75SLois Curfman McInnes   }
8023a40ed3dSBarry Smith   PetscFunctionReturn(0);
803ae80bb75SLois Curfman McInnes }
804ae80bb75SLois Curfman McInnes 
805289bc588SBarry Smith /* -----------------------------------------------------------------*/
806289bc588SBarry Smith 
8074a2ae208SSatish Balay #undef __FUNCT__
8085bba2384SShri Abhyankar #define __FUNCT__ "MatLoad_SeqDense"
809112444f4SShri Abhyankar PetscErrorCode MatLoad_SeqDense(Mat newmat,PetscViewer viewer)
810aabbc4fbSShri Abhyankar {
811aabbc4fbSShri Abhyankar   Mat_SeqDense   *a;
812aabbc4fbSShri Abhyankar   PetscErrorCode ierr;
813aabbc4fbSShri Abhyankar   PetscInt       *scols,i,j,nz,header[4];
814aabbc4fbSShri Abhyankar   int            fd;
815aabbc4fbSShri Abhyankar   PetscMPIInt    size;
816aabbc4fbSShri Abhyankar   PetscInt       *rowlengths = 0,M,N,*cols,grows,gcols;
817aabbc4fbSShri Abhyankar   PetscScalar    *vals,*svals,*v,*w;
818*ce94432eSBarry Smith   MPI_Comm       comm;
819aabbc4fbSShri Abhyankar 
820aabbc4fbSShri Abhyankar   PetscFunctionBegin;
821*ce94432eSBarry Smith   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
822aabbc4fbSShri Abhyankar   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
823aabbc4fbSShri Abhyankar   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor");
824aabbc4fbSShri Abhyankar   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
825aabbc4fbSShri Abhyankar   ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr);
826aabbc4fbSShri Abhyankar   if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object");
827aabbc4fbSShri Abhyankar   M = header[1]; N = header[2]; nz = header[3];
828aabbc4fbSShri Abhyankar 
829aabbc4fbSShri Abhyankar   /* set global size if not set already*/
830aabbc4fbSShri Abhyankar   if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) {
831aabbc4fbSShri Abhyankar     ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr);
832aabbc4fbSShri Abhyankar   } else {
833aabbc4fbSShri Abhyankar     /* if sizes and type are already set, check if the vector global sizes are correct */
834aabbc4fbSShri Abhyankar     ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr);
835aabbc4fbSShri 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);
836aabbc4fbSShri Abhyankar   }
8370298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr);
838aabbc4fbSShri Abhyankar 
839aabbc4fbSShri Abhyankar   if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */
840aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
841aabbc4fbSShri Abhyankar     v = a->v;
842aabbc4fbSShri Abhyankar     /* Allocate some temp space to read in the values and then flip them
843aabbc4fbSShri Abhyankar        from row major to column major */
844aabbc4fbSShri Abhyankar     ierr = PetscMalloc((M*N > 0 ? M*N : 1)*sizeof(PetscScalar),&w);CHKERRQ(ierr);
845aabbc4fbSShri Abhyankar     /* read in nonzero values */
846aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr);
847aabbc4fbSShri Abhyankar     /* now flip the values and store them in the matrix*/
848aabbc4fbSShri Abhyankar     for (j=0; j<N; j++) {
849aabbc4fbSShri Abhyankar       for (i=0; i<M; i++) {
850aabbc4fbSShri Abhyankar         *v++ =w[i*N+j];
851aabbc4fbSShri Abhyankar       }
852aabbc4fbSShri Abhyankar     }
853aabbc4fbSShri Abhyankar     ierr = PetscFree(w);CHKERRQ(ierr);
854aabbc4fbSShri Abhyankar   } else {
855aabbc4fbSShri Abhyankar     /* read row lengths */
856aabbc4fbSShri Abhyankar     ierr = PetscMalloc((M+1)*sizeof(PetscInt),&rowlengths);CHKERRQ(ierr);
857aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr);
858aabbc4fbSShri Abhyankar 
859aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
860aabbc4fbSShri Abhyankar     v = a->v;
861aabbc4fbSShri Abhyankar 
862aabbc4fbSShri Abhyankar     /* read column indices and nonzeros */
863aabbc4fbSShri Abhyankar     ierr = PetscMalloc((nz+1)*sizeof(PetscInt),&scols);CHKERRQ(ierr);
864aabbc4fbSShri Abhyankar     cols = scols;
865aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr);
866aabbc4fbSShri Abhyankar     ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&svals);CHKERRQ(ierr);
867aabbc4fbSShri Abhyankar     vals = svals;
868aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr);
869aabbc4fbSShri Abhyankar 
870aabbc4fbSShri Abhyankar     /* insert into matrix */
871aabbc4fbSShri Abhyankar     for (i=0; i<M; i++) {
872aabbc4fbSShri Abhyankar       for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j];
873aabbc4fbSShri Abhyankar       svals += rowlengths[i]; scols += rowlengths[i];
874aabbc4fbSShri Abhyankar     }
875aabbc4fbSShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
876aabbc4fbSShri Abhyankar     ierr = PetscFree(cols);CHKERRQ(ierr);
877aabbc4fbSShri Abhyankar     ierr = PetscFree(rowlengths);CHKERRQ(ierr);
878aabbc4fbSShri Abhyankar   }
879aabbc4fbSShri Abhyankar   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
880aabbc4fbSShri Abhyankar   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
881aabbc4fbSShri Abhyankar   PetscFunctionReturn(0);
882aabbc4fbSShri Abhyankar }
883aabbc4fbSShri Abhyankar 
884aabbc4fbSShri Abhyankar #undef __FUNCT__
8854a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII"
8866849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer)
887289bc588SBarry Smith {
888932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
889dfbe8321SBarry Smith   PetscErrorCode    ierr;
89013f74950SBarry Smith   PetscInt          i,j;
8912dcb1b2aSMatthew Knepley   const char        *name;
89287828ca2SBarry Smith   PetscScalar       *v;
893f3ef73ceSBarry Smith   PetscViewerFormat format;
8945f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX)
895ace3abfcSBarry Smith   PetscBool allreal = PETSC_TRUE;
8965f481a85SSatish Balay #endif
897932b0c3eSLois Curfman McInnes 
8983a40ed3dSBarry Smith   PetscFunctionBegin;
899b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
900456192e2SBarry Smith   if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
9013a40ed3dSBarry Smith     PetscFunctionReturn(0);  /* do nothing for now */
902fb9695e5SSatish Balay   } else if (format == PETSC_VIEWER_ASCII_COMMON) {
903d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
9047566de4bSShri Abhyankar     ierr = PetscObjectPrintClassNamePrefixType((PetscObject)A,viewer,"Matrix Object");CHKERRQ(ierr);
905d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
90644cd7ae7SLois Curfman McInnes       v    = a->v + i;
90777431f27SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr);
908d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
909aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
910329f5518SBarry Smith         if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) {
911a83599f4SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %G + %G i) ",j,PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr);
912329f5518SBarry Smith         } else if (PetscRealPart(*v)) {
913a83599f4SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,PetscRealPart(*v));CHKERRQ(ierr);
9146831982aSBarry Smith         }
91580cd9d93SLois Curfman McInnes #else
9166831982aSBarry Smith         if (*v) {
917a83599f4SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,*v);CHKERRQ(ierr);
9186831982aSBarry Smith         }
91980cd9d93SLois Curfman McInnes #endif
9201b807ce4Svictorle         v += a->lda;
92180cd9d93SLois Curfman McInnes       }
922b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
92380cd9d93SLois Curfman McInnes     }
924d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
9253a40ed3dSBarry Smith   } else {
926d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
927aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
92847989497SBarry Smith     /* determine if matrix has all real values */
92947989497SBarry Smith     v = a->v;
930d0f46423SBarry Smith     for (i=0; i<A->rmap->n*A->cmap->n; i++) {
931ffac6cdbSBarry Smith       if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break;}
93247989497SBarry Smith     }
93347989497SBarry Smith #endif
934fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
9353a7fca6bSBarry Smith       ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr);
936d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr);
937d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
938fb9695e5SSatish Balay       ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr);
9397566de4bSShri Abhyankar     } else {
9407566de4bSShri Abhyankar       ierr = PetscObjectPrintClassNamePrefixType((PetscObject)A,viewer,"Matrix Object");CHKERRQ(ierr);
941ffac6cdbSBarry Smith     }
942ffac6cdbSBarry Smith 
943d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
944932b0c3eSLois Curfman McInnes       v = a->v + i;
945d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
946aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
94747989497SBarry Smith         if (allreal) {
948c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr);
94947989497SBarry Smith         } else {
950c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr);
95147989497SBarry Smith         }
952289bc588SBarry Smith #else
953c61cd2faSJed Brown         ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr);
954289bc588SBarry Smith #endif
9551b807ce4Svictorle         v += a->lda;
956289bc588SBarry Smith       }
957b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
958289bc588SBarry Smith     }
959fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
960b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr);
961ffac6cdbSBarry Smith     }
962d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
963da3a660dSBarry Smith   }
964b0a32e0cSBarry Smith   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
9653a40ed3dSBarry Smith   PetscFunctionReturn(0);
966289bc588SBarry Smith }
967289bc588SBarry Smith 
9684a2ae208SSatish Balay #undef __FUNCT__
9694a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary"
9706849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer)
971932b0c3eSLois Curfman McInnes {
972932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
9736849ba73SBarry Smith   PetscErrorCode    ierr;
97413f74950SBarry Smith   int               fd;
975d0f46423SBarry Smith   PetscInt          ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n;
976f4403165SShri Abhyankar   PetscScalar       *v,*anonz,*vals;
977f4403165SShri Abhyankar   PetscViewerFormat format;
978932b0c3eSLois Curfman McInnes 
9793a40ed3dSBarry Smith   PetscFunctionBegin;
980b0a32e0cSBarry Smith   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
98190ace30eSBarry Smith 
982f4403165SShri Abhyankar   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
983f4403165SShri Abhyankar   if (format == PETSC_VIEWER_NATIVE) {
984f4403165SShri Abhyankar     /* store the matrix as a dense matrix */
985f4403165SShri Abhyankar     ierr = PetscMalloc(4*sizeof(PetscInt),&col_lens);CHKERRQ(ierr);
9862205254eSKarl Rupp 
987f4403165SShri Abhyankar     col_lens[0] = MAT_FILE_CLASSID;
988f4403165SShri Abhyankar     col_lens[1] = m;
989f4403165SShri Abhyankar     col_lens[2] = n;
990f4403165SShri Abhyankar     col_lens[3] = MATRIX_BINARY_FORMAT_DENSE;
9912205254eSKarl Rupp 
992f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
993f4403165SShri Abhyankar     ierr = PetscFree(col_lens);CHKERRQ(ierr);
994f4403165SShri Abhyankar 
995f4403165SShri Abhyankar     /* write out matrix, by rows */
996f4403165SShri Abhyankar     ierr = PetscMalloc((m*n+1)*sizeof(PetscScalar),&vals);CHKERRQ(ierr);
997f4403165SShri Abhyankar     v    = a->v;
998f4403165SShri Abhyankar     for (j=0; j<n; j++) {
999f4403165SShri Abhyankar       for (i=0; i<m; i++) {
1000f4403165SShri Abhyankar         vals[j + i*n] = *v++;
1001f4403165SShri Abhyankar       }
1002f4403165SShri Abhyankar     }
1003f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
1004f4403165SShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
1005f4403165SShri Abhyankar   } else {
100613f74950SBarry Smith     ierr = PetscMalloc((4+nz)*sizeof(PetscInt),&col_lens);CHKERRQ(ierr);
10072205254eSKarl Rupp 
10080700a824SBarry Smith     col_lens[0] = MAT_FILE_CLASSID;
1009932b0c3eSLois Curfman McInnes     col_lens[1] = m;
1010932b0c3eSLois Curfman McInnes     col_lens[2] = n;
1011932b0c3eSLois Curfman McInnes     col_lens[3] = nz;
1012932b0c3eSLois Curfman McInnes 
1013932b0c3eSLois Curfman McInnes     /* store lengths of each row and write (including header) to file */
1014932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) col_lens[4+i] = n;
10156f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
1016932b0c3eSLois Curfman McInnes 
1017932b0c3eSLois Curfman McInnes     /* Possibly should write in smaller increments, not whole matrix at once? */
1018932b0c3eSLois Curfman McInnes     /* store column indices (zero start index) */
1019932b0c3eSLois Curfman McInnes     ict = 0;
1020932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1021932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) col_lens[ict++] = j;
1022932b0c3eSLois Curfman McInnes     }
10236f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
1024606d414cSSatish Balay     ierr = PetscFree(col_lens);CHKERRQ(ierr);
1025932b0c3eSLois Curfman McInnes 
1026932b0c3eSLois Curfman McInnes     /* store nonzero values */
102787828ca2SBarry Smith     ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&anonz);CHKERRQ(ierr);
1028932b0c3eSLois Curfman McInnes     ict  = 0;
1029932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1030932b0c3eSLois Curfman McInnes       v = a->v + i;
1031932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) {
10321b807ce4Svictorle         anonz[ict++] = *v; v += a->lda;
1033932b0c3eSLois Curfman McInnes       }
1034932b0c3eSLois Curfman McInnes     }
10356f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
1036606d414cSSatish Balay     ierr = PetscFree(anonz);CHKERRQ(ierr);
1037f4403165SShri Abhyankar   }
10383a40ed3dSBarry Smith   PetscFunctionReturn(0);
1039932b0c3eSLois Curfman McInnes }
1040932b0c3eSLois Curfman McInnes 
10414a2ae208SSatish Balay #undef __FUNCT__
10424a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom"
1043dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa)
1044f1af5d2fSBarry Smith {
1045f1af5d2fSBarry Smith   Mat               A  = (Mat) Aa;
1046f1af5d2fSBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
10476849ba73SBarry Smith   PetscErrorCode    ierr;
1048d0f46423SBarry Smith   PetscInt          m  = A->rmap->n,n = A->cmap->n,color,i,j;
104987828ca2SBarry Smith   PetscScalar       *v = a->v;
1050b0a32e0cSBarry Smith   PetscViewer       viewer;
1051b0a32e0cSBarry Smith   PetscDraw         popup;
1052329f5518SBarry Smith   PetscReal         xl,yl,xr,yr,x_l,x_r,y_l,y_r,scale,maxv = 0.0;
1053f3ef73ceSBarry Smith   PetscViewerFormat format;
1054f1af5d2fSBarry Smith 
1055f1af5d2fSBarry Smith   PetscFunctionBegin;
1056f1af5d2fSBarry Smith   ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr);
1057b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1058b0a32e0cSBarry Smith   ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr);
1059f1af5d2fSBarry Smith 
1060f1af5d2fSBarry Smith   /* Loop over matrix elements drawing boxes */
1061fb9695e5SSatish Balay   if (format != PETSC_VIEWER_DRAW_CONTOUR) {
1062f1af5d2fSBarry Smith     /* Blue for negative and Red for positive */
1063b0a32e0cSBarry Smith     color = PETSC_DRAW_BLUE;
1064f1af5d2fSBarry Smith     for (j = 0; j < n; j++) {
1065f1af5d2fSBarry Smith       x_l = j;
1066f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1067f1af5d2fSBarry Smith       for (i = 0; i < m; i++) {
1068f1af5d2fSBarry Smith         y_l = m - i - 1.0;
1069f1af5d2fSBarry Smith         y_r = y_l + 1.0;
1070329f5518SBarry Smith         if (PetscRealPart(v[j*m+i]) >  0.) {
1071b0a32e0cSBarry Smith           color = PETSC_DRAW_RED;
1072329f5518SBarry Smith         } else if (PetscRealPart(v[j*m+i]) <  0.) {
1073b0a32e0cSBarry Smith           color = PETSC_DRAW_BLUE;
1074f1af5d2fSBarry Smith         } else {
1075f1af5d2fSBarry Smith           continue;
1076f1af5d2fSBarry Smith         }
1077b0a32e0cSBarry Smith         ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1078f1af5d2fSBarry Smith       }
1079f1af5d2fSBarry Smith     }
1080f1af5d2fSBarry Smith   } else {
1081f1af5d2fSBarry Smith     /* use contour shading to indicate magnitude of values */
1082f1af5d2fSBarry Smith     /* first determine max of all nonzero values */
1083f1af5d2fSBarry Smith     for (i = 0; i < m*n; i++) {
1084f1af5d2fSBarry Smith       if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]);
1085f1af5d2fSBarry Smith     }
1086b0a32e0cSBarry Smith     scale = (245.0 - PETSC_DRAW_BASIC_COLORS)/maxv;
1087b0a32e0cSBarry Smith     ierr  = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr);
1088b0a32e0cSBarry Smith     if (popup) {ierr = PetscDrawScalePopup(popup,0.0,maxv);CHKERRQ(ierr);}
1089f1af5d2fSBarry Smith     for (j = 0; j < n; j++) {
1090f1af5d2fSBarry Smith       x_l = j;
1091f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1092f1af5d2fSBarry Smith       for (i = 0; i < m; i++) {
1093f1af5d2fSBarry Smith         y_l   = m - i - 1.0;
1094f1af5d2fSBarry Smith         y_r   = y_l + 1.0;
1095b0a32e0cSBarry Smith         color = PETSC_DRAW_BASIC_COLORS + (int)(scale*PetscAbsScalar(v[j*m+i]));
1096b0a32e0cSBarry Smith         ierr  = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1097f1af5d2fSBarry Smith       }
1098f1af5d2fSBarry Smith     }
1099f1af5d2fSBarry Smith   }
1100f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1101f1af5d2fSBarry Smith }
1102f1af5d2fSBarry Smith 
11034a2ae208SSatish Balay #undef __FUNCT__
11044a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw"
1105dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer)
1106f1af5d2fSBarry Smith {
1107b0a32e0cSBarry Smith   PetscDraw      draw;
1108ace3abfcSBarry Smith   PetscBool      isnull;
1109329f5518SBarry Smith   PetscReal      xr,yr,xl,yl,h,w;
1110dfbe8321SBarry Smith   PetscErrorCode ierr;
1111f1af5d2fSBarry Smith 
1112f1af5d2fSBarry Smith   PetscFunctionBegin;
1113b0a32e0cSBarry Smith   ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
1114b0a32e0cSBarry Smith   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
1115abc0a331SBarry Smith   if (isnull) PetscFunctionReturn(0);
1116f1af5d2fSBarry Smith 
1117f1af5d2fSBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr);
1118d0f46423SBarry Smith   xr   = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0;
1119f1af5d2fSBarry Smith   xr  += w;    yr += h;  xl = -w;     yl = -h;
1120b0a32e0cSBarry Smith   ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr);
1121b0a32e0cSBarry Smith   ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr);
11220298fd71SBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr);
1123f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1124f1af5d2fSBarry Smith }
1125f1af5d2fSBarry Smith 
11264a2ae208SSatish Balay #undef __FUNCT__
11274a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense"
1128dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer)
1129932b0c3eSLois Curfman McInnes {
1130dfbe8321SBarry Smith   PetscErrorCode ierr;
1131ace3abfcSBarry Smith   PetscBool      iascii,isbinary,isdraw;
1132932b0c3eSLois Curfman McInnes 
11333a40ed3dSBarry Smith   PetscFunctionBegin;
1134251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
1135251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
1136251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
11370f5bd95cSBarry Smith 
1138c45a1595SBarry Smith   if (iascii) {
1139c45a1595SBarry Smith     ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr);
11400f5bd95cSBarry Smith   } else if (isbinary) {
11413a40ed3dSBarry Smith     ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr);
1142f1af5d2fSBarry Smith   } else if (isdraw) {
1143f1af5d2fSBarry Smith     ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr);
1144932b0c3eSLois Curfman McInnes   }
11453a40ed3dSBarry Smith   PetscFunctionReturn(0);
1146932b0c3eSLois Curfman McInnes }
1147289bc588SBarry Smith 
11484a2ae208SSatish Balay #undef __FUNCT__
11494a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense"
1150dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqDense(Mat mat)
1151289bc588SBarry Smith {
1152ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)mat->data;
1153dfbe8321SBarry Smith   PetscErrorCode ierr;
115490f02eecSBarry Smith 
11553a40ed3dSBarry Smith   PetscFunctionBegin;
1156aa482453SBarry Smith #if defined(PETSC_USE_LOG)
1157d0f46423SBarry Smith   PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n);
1158a5a9c739SBarry Smith #endif
115905b42c5fSBarry Smith   ierr = PetscFree(l->pivots);CHKERRQ(ierr);
11606857c123SSatish Balay   if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);}
1161bf0cc555SLisandro Dalcin   ierr = PetscFree(mat->data);CHKERRQ(ierr);
1162dbd8c25aSHong Zhang 
1163dbd8c25aSHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr);
11640298fd71SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatDenseGetArray_C","",NULL);CHKERRQ(ierr);
11650298fd71SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatDenseRestoreArray_C","",NULL);CHKERRQ(ierr);
11660298fd71SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatSeqDenseSetPreallocation_C","",NULL);CHKERRQ(ierr);
11670298fd71SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMult_seqaij_seqdense_C","",NULL);CHKERRQ(ierr);
11680298fd71SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C","",NULL);CHKERRQ(ierr);
11690298fd71SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C","",NULL);CHKERRQ(ierr);
11703a40ed3dSBarry Smith   PetscFunctionReturn(0);
1171289bc588SBarry Smith }
1172289bc588SBarry Smith 
11734a2ae208SSatish Balay #undef __FUNCT__
11744a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense"
1175fc4dec0aSBarry Smith PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout)
1176289bc588SBarry Smith {
1177c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
11786849ba73SBarry Smith   PetscErrorCode ierr;
117913f74950SBarry Smith   PetscInt       k,j,m,n,M;
118087828ca2SBarry Smith   PetscScalar    *v,tmp;
118148b35521SBarry Smith 
11823a40ed3dSBarry Smith   PetscFunctionBegin;
1183d0f46423SBarry Smith   v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n;
1184e9695a30SBarry Smith   if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */
1185e7e72b3dSBarry Smith     if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place");
1186e7e72b3dSBarry Smith     else {
1187d3e5ee88SLois Curfman McInnes       for (j=0; j<m; j++) {
1188289bc588SBarry Smith         for (k=0; k<j; k++) {
11891b807ce4Svictorle           tmp        = v[j + k*M];
11901b807ce4Svictorle           v[j + k*M] = v[k + j*M];
11911b807ce4Svictorle           v[k + j*M] = tmp;
1192289bc588SBarry Smith         }
1193289bc588SBarry Smith       }
1194d64ed03dSBarry Smith     }
11953a40ed3dSBarry Smith   } else { /* out-of-place transpose */
1196d3e5ee88SLois Curfman McInnes     Mat          tmat;
1197ec8511deSBarry Smith     Mat_SeqDense *tmatd;
119887828ca2SBarry Smith     PetscScalar  *v2;
1199ea709b57SSatish Balay 
1200fc4dec0aSBarry Smith     if (reuse == MAT_INITIAL_MATRIX) {
1201*ce94432eSBarry Smith       ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr);
1202d0f46423SBarry Smith       ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr);
12037adad957SLisandro Dalcin       ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
12040298fd71SBarry Smith       ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr);
1205fc4dec0aSBarry Smith     } else {
1206fc4dec0aSBarry Smith       tmat = *matout;
1207fc4dec0aSBarry Smith     }
1208ec8511deSBarry Smith     tmatd = (Mat_SeqDense*)tmat->data;
12090de55854SLois Curfman McInnes     v = mat->v; v2 = tmatd->v;
1210d3e5ee88SLois Curfman McInnes     for (j=0; j<n; j++) {
12111b807ce4Svictorle       for (k=0; k<m; k++) v2[j + k*n] = v[k + j*M];
1212d3e5ee88SLois Curfman McInnes     }
12136d4a8577SBarry Smith     ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
12146d4a8577SBarry Smith     ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1215d3e5ee88SLois Curfman McInnes     *matout = tmat;
121648b35521SBarry Smith   }
12173a40ed3dSBarry Smith   PetscFunctionReturn(0);
1218289bc588SBarry Smith }
1219289bc588SBarry Smith 
12204a2ae208SSatish Balay #undef __FUNCT__
12214a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense"
1222ace3abfcSBarry Smith PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool  *flg)
1223289bc588SBarry Smith {
1224c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data;
1225c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data;
122613f74950SBarry Smith   PetscInt     i,j;
1227a2ea699eSBarry Smith   PetscScalar  *v1,*v2;
12289ea5d5aeSSatish Balay 
12293a40ed3dSBarry Smith   PetscFunctionBegin;
1230d0f46423SBarry Smith   if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1231d0f46423SBarry Smith   if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1232d0f46423SBarry Smith   for (i=0; i<A1->rmap->n; i++) {
12331b807ce4Svictorle     v1 = mat1->v+i; v2 = mat2->v+i;
1234d0f46423SBarry Smith     for (j=0; j<A1->cmap->n; j++) {
12353a40ed3dSBarry Smith       if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
12361b807ce4Svictorle       v1 += mat1->lda; v2 += mat2->lda;
12371b807ce4Svictorle     }
1238289bc588SBarry Smith   }
123977c4ece6SBarry Smith   *flg = PETSC_TRUE;
12403a40ed3dSBarry Smith   PetscFunctionReturn(0);
1241289bc588SBarry Smith }
1242289bc588SBarry Smith 
12434a2ae208SSatish Balay #undef __FUNCT__
12444a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense"
1245dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v)
1246289bc588SBarry Smith {
1247c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
1248dfbe8321SBarry Smith   PetscErrorCode ierr;
124913f74950SBarry Smith   PetscInt       i,n,len;
125087828ca2SBarry Smith   PetscScalar    *x,zero = 0.0;
125144cd7ae7SLois Curfman McInnes 
12523a40ed3dSBarry Smith   PetscFunctionBegin;
12532dcb1b2aSMatthew Knepley   ierr = VecSet(v,zero);CHKERRQ(ierr);
12547a97a34bSBarry Smith   ierr = VecGetSize(v,&n);CHKERRQ(ierr);
12551ebc52fbSHong Zhang   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1256d0f46423SBarry Smith   len  = PetscMin(A->rmap->n,A->cmap->n);
1257e32f2f54SBarry Smith   if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec");
125844cd7ae7SLois Curfman McInnes   for (i=0; i<len; i++) {
12591b807ce4Svictorle     x[i] = mat->v[i*mat->lda + i];
1260289bc588SBarry Smith   }
12611ebc52fbSHong Zhang   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
12623a40ed3dSBarry Smith   PetscFunctionReturn(0);
1263289bc588SBarry Smith }
1264289bc588SBarry Smith 
12654a2ae208SSatish Balay #undef __FUNCT__
12664a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense"
1267dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr)
1268289bc588SBarry Smith {
1269c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
127087828ca2SBarry Smith   PetscScalar    *l,*r,x,*v;
1271dfbe8321SBarry Smith   PetscErrorCode ierr;
1272d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n;
127355659b69SBarry Smith 
12743a40ed3dSBarry Smith   PetscFunctionBegin;
127528988994SBarry Smith   if (ll) {
12767a97a34bSBarry Smith     ierr = VecGetSize(ll,&m);CHKERRQ(ierr);
12771ebc52fbSHong Zhang     ierr = VecGetArray(ll,&l);CHKERRQ(ierr);
1278e32f2f54SBarry Smith     if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size");
1279da3a660dSBarry Smith     for (i=0; i<m; i++) {
1280da3a660dSBarry Smith       x = l[i];
1281da3a660dSBarry Smith       v = mat->v + i;
1282da3a660dSBarry Smith       for (j=0; j<n; j++) { (*v) *= x; v+= m;}
1283da3a660dSBarry Smith     }
12841ebc52fbSHong Zhang     ierr = VecRestoreArray(ll,&l);CHKERRQ(ierr);
1285efee365bSSatish Balay     ierr = PetscLogFlops(n*m);CHKERRQ(ierr);
1286da3a660dSBarry Smith   }
128728988994SBarry Smith   if (rr) {
12887a97a34bSBarry Smith     ierr = VecGetSize(rr,&n);CHKERRQ(ierr);
12891ebc52fbSHong Zhang     ierr = VecGetArray(rr,&r);CHKERRQ(ierr);
1290e32f2f54SBarry Smith     if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size");
1291da3a660dSBarry Smith     for (i=0; i<n; i++) {
1292da3a660dSBarry Smith       x = r[i];
1293da3a660dSBarry Smith       v = mat->v + i*m;
12942205254eSKarl Rupp       for (j=0; j<m; j++) (*v++) *= x;
1295da3a660dSBarry Smith     }
12961ebc52fbSHong Zhang     ierr = VecRestoreArray(rr,&r);CHKERRQ(ierr);
1297efee365bSSatish Balay     ierr = PetscLogFlops(n*m);CHKERRQ(ierr);
1298da3a660dSBarry Smith   }
12993a40ed3dSBarry Smith   PetscFunctionReturn(0);
1300289bc588SBarry Smith }
1301289bc588SBarry Smith 
13024a2ae208SSatish Balay #undef __FUNCT__
13034a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense"
1304dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm)
1305289bc588SBarry Smith {
1306c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
130787828ca2SBarry Smith   PetscScalar    *v   = mat->v;
1308329f5518SBarry Smith   PetscReal      sum  = 0.0;
1309d0f46423SBarry Smith   PetscInt       lda  =mat->lda,m=A->rmap->n,i,j;
1310efee365bSSatish Balay   PetscErrorCode ierr;
131155659b69SBarry Smith 
13123a40ed3dSBarry Smith   PetscFunctionBegin;
1313289bc588SBarry Smith   if (type == NORM_FROBENIUS) {
1314a5ce6ee0Svictorle     if (lda>m) {
1315d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1316a5ce6ee0Svictorle         v = mat->v+j*lda;
1317a5ce6ee0Svictorle         for (i=0; i<m; i++) {
1318a5ce6ee0Svictorle           sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1319a5ce6ee0Svictorle         }
1320a5ce6ee0Svictorle       }
1321a5ce6ee0Svictorle     } else {
1322d0f46423SBarry Smith       for (i=0; i<A->cmap->n*A->rmap->n; i++) {
1323329f5518SBarry Smith         sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1324289bc588SBarry Smith       }
1325a5ce6ee0Svictorle     }
13268f1a2a5eSBarry Smith     *nrm = PetscSqrtReal(sum);
1327dc0b31edSSatish Balay     ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
13283a40ed3dSBarry Smith   } else if (type == NORM_1) {
1329064f8208SBarry Smith     *nrm = 0.0;
1330d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
13311b807ce4Svictorle       v   = mat->v + j*mat->lda;
1332289bc588SBarry Smith       sum = 0.0;
1333d0f46423SBarry Smith       for (i=0; i<A->rmap->n; i++) {
133433a8263dSBarry Smith         sum += PetscAbsScalar(*v);  v++;
1335289bc588SBarry Smith       }
1336064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1337289bc588SBarry Smith     }
1338d0f46423SBarry Smith     ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr);
13393a40ed3dSBarry Smith   } else if (type == NORM_INFINITY) {
1340064f8208SBarry Smith     *nrm = 0.0;
1341d0f46423SBarry Smith     for (j=0; j<A->rmap->n; j++) {
1342289bc588SBarry Smith       v   = mat->v + j;
1343289bc588SBarry Smith       sum = 0.0;
1344d0f46423SBarry Smith       for (i=0; i<A->cmap->n; i++) {
13451b807ce4Svictorle         sum += PetscAbsScalar(*v); v += mat->lda;
1346289bc588SBarry Smith       }
1347064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1348289bc588SBarry Smith     }
1349d0f46423SBarry Smith     ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr);
1350e7e72b3dSBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm");
13513a40ed3dSBarry Smith   PetscFunctionReturn(0);
1352289bc588SBarry Smith }
1353289bc588SBarry Smith 
13544a2ae208SSatish Balay #undef __FUNCT__
13554a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense"
1356ace3abfcSBarry Smith PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg)
1357289bc588SBarry Smith {
1358c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *aij = (Mat_SeqDense*)A->data;
135963ba0a88SBarry Smith   PetscErrorCode ierr;
136067e560aaSBarry Smith 
13613a40ed3dSBarry Smith   PetscFunctionBegin;
1362b5a2b587SKris Buschelman   switch (op) {
1363b5a2b587SKris Buschelman   case MAT_ROW_ORIENTED:
13644e0d8c25SBarry Smith     aij->roworiented = flg;
1365b5a2b587SKris Buschelman     break;
1366512a5fc5SBarry Smith   case MAT_NEW_NONZERO_LOCATIONS:
1367b5a2b587SKris Buschelman   case MAT_NEW_NONZERO_LOCATION_ERR:
13683971808eSMatthew Knepley   case MAT_NEW_NONZERO_ALLOCATION_ERR:
13694e0d8c25SBarry Smith   case MAT_NEW_DIAGONALS:
137013fa8e87SLisandro Dalcin   case MAT_KEEP_NONZERO_PATTERN:
1371b5a2b587SKris Buschelman   case MAT_IGNORE_OFF_PROC_ENTRIES:
1372b5a2b587SKris Buschelman   case MAT_USE_HASH_TABLE:
13735021d80fSJed Brown   case MAT_IGNORE_LOWER_TRIANGULAR:
13745021d80fSJed Brown     ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr);
13755021d80fSJed Brown     break;
13765021d80fSJed Brown   case MAT_SPD:
137777e54ba9SKris Buschelman   case MAT_SYMMETRIC:
137877e54ba9SKris Buschelman   case MAT_STRUCTURALLY_SYMMETRIC:
13799a4540c5SBarry Smith   case MAT_HERMITIAN:
13809a4540c5SBarry Smith   case MAT_SYMMETRY_ETERNAL:
13815021d80fSJed Brown     /* These options are handled directly by MatSetOption() */
138277e54ba9SKris Buschelman     break;
1383b5a2b587SKris Buschelman   default:
1384e32f2f54SBarry Smith     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]);
13853a40ed3dSBarry Smith   }
13863a40ed3dSBarry Smith   PetscFunctionReturn(0);
1387289bc588SBarry Smith }
1388289bc588SBarry Smith 
13894a2ae208SSatish Balay #undef __FUNCT__
13904a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense"
1391dfbe8321SBarry Smith PetscErrorCode MatZeroEntries_SeqDense(Mat A)
13926f0a148fSBarry Smith {
1393ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)A->data;
13946849ba73SBarry Smith   PetscErrorCode ierr;
1395d0f46423SBarry Smith   PetscInt       lda=l->lda,m=A->rmap->n,j;
13963a40ed3dSBarry Smith 
13973a40ed3dSBarry Smith   PetscFunctionBegin;
1398a5ce6ee0Svictorle   if (lda>m) {
1399d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1400a5ce6ee0Svictorle       ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
1401a5ce6ee0Svictorle     }
1402a5ce6ee0Svictorle   } else {
1403d0f46423SBarry Smith     ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1404a5ce6ee0Svictorle   }
14053a40ed3dSBarry Smith   PetscFunctionReturn(0);
14066f0a148fSBarry Smith }
14076f0a148fSBarry Smith 
14084a2ae208SSatish Balay #undef __FUNCT__
14094a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense"
14102b40b63fSBarry Smith PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b)
14116f0a148fSBarry Smith {
141297b48c8fSBarry Smith   PetscErrorCode    ierr;
1413ec8511deSBarry Smith   Mat_SeqDense      *l = (Mat_SeqDense*)A->data;
1414b9679d65SBarry Smith   PetscInt          m  = l->lda, n = A->cmap->n, i,j;
141597b48c8fSBarry Smith   PetscScalar       *slot,*bb;
141697b48c8fSBarry Smith   const PetscScalar *xx;
141755659b69SBarry Smith 
14183a40ed3dSBarry Smith   PetscFunctionBegin;
1419b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG)
1420b9679d65SBarry Smith   for (i=0; i<N; i++) {
1421b9679d65SBarry Smith     if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed");
1422b9679d65SBarry 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);
1423b9679d65SBarry Smith   }
1424b9679d65SBarry Smith #endif
1425b9679d65SBarry Smith 
142697b48c8fSBarry Smith   /* fix right hand side if needed */
142797b48c8fSBarry Smith   if (x && b) {
142897b48c8fSBarry Smith     ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr);
142997b48c8fSBarry Smith     ierr = VecGetArray(b,&bb);CHKERRQ(ierr);
14302205254eSKarl Rupp     for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]];
143197b48c8fSBarry Smith     ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr);
143297b48c8fSBarry Smith     ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr);
143397b48c8fSBarry Smith   }
143497b48c8fSBarry Smith 
14356f0a148fSBarry Smith   for (i=0; i<N; i++) {
14366f0a148fSBarry Smith     slot = l->v + rows[i];
1437b9679d65SBarry Smith     for (j=0; j<n; j++) { *slot = 0.0; slot += m;}
14386f0a148fSBarry Smith   }
1439f4df32b1SMatthew Knepley   if (diag != 0.0) {
1440b9679d65SBarry Smith     if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices");
14416f0a148fSBarry Smith     for (i=0; i<N; i++) {
1442b9679d65SBarry Smith       slot  = l->v + (m+1)*rows[i];
1443f4df32b1SMatthew Knepley       *slot = diag;
14446f0a148fSBarry Smith     }
14456f0a148fSBarry Smith   }
14463a40ed3dSBarry Smith   PetscFunctionReturn(0);
14476f0a148fSBarry Smith }
1448557bce09SLois Curfman McInnes 
14494a2ae208SSatish Balay #undef __FUNCT__
14508c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray_SeqDense"
14518c778c55SBarry Smith PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar *array[])
145264e87e97SBarry Smith {
1453c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
14543a40ed3dSBarry Smith 
14553a40ed3dSBarry Smith   PetscFunctionBegin;
1456e32f2f54SBarry 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");
145764e87e97SBarry Smith   *array = mat->v;
14583a40ed3dSBarry Smith   PetscFunctionReturn(0);
145964e87e97SBarry Smith }
14600754003eSLois Curfman McInnes 
14614a2ae208SSatish Balay #undef __FUNCT__
14628c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray_SeqDense"
14638c778c55SBarry Smith PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar *array[])
1464ff14e315SSatish Balay {
14653a40ed3dSBarry Smith   PetscFunctionBegin;
146609b544d4SBarry Smith   *array = 0; /* user cannot accidently use the array later */
14673a40ed3dSBarry Smith   PetscFunctionReturn(0);
1468ff14e315SSatish Balay }
14690754003eSLois Curfman McInnes 
14704a2ae208SSatish Balay #undef __FUNCT__
14718c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray"
1472dec5eb66SMatthew G Knepley /*@C
14738c778c55SBarry Smith    MatDenseGetArray - gives access to the array where the data for a SeqDense matrix is stored
147473a71a0fSBarry Smith 
147573a71a0fSBarry Smith    Not Collective
147673a71a0fSBarry Smith 
147773a71a0fSBarry Smith    Input Parameter:
147873a71a0fSBarry Smith .  mat - a MATSEQDENSE matrix
147973a71a0fSBarry Smith 
148073a71a0fSBarry Smith    Output Parameter:
148173a71a0fSBarry Smith .   array - pointer to the data
148273a71a0fSBarry Smith 
148373a71a0fSBarry Smith    Level: intermediate
148473a71a0fSBarry Smith 
14858c778c55SBarry Smith .seealso: MatDenseRestoreArray()
148673a71a0fSBarry Smith @*/
14878c778c55SBarry Smith PetscErrorCode  MatDenseGetArray(Mat A,PetscScalar **array)
148873a71a0fSBarry Smith {
148973a71a0fSBarry Smith   PetscErrorCode ierr;
149073a71a0fSBarry Smith 
149173a71a0fSBarry Smith   PetscFunctionBegin;
14928c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
149373a71a0fSBarry Smith   PetscFunctionReturn(0);
149473a71a0fSBarry Smith }
149573a71a0fSBarry Smith 
149673a71a0fSBarry Smith #undef __FUNCT__
14978c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray"
1498dec5eb66SMatthew G Knepley /*@C
14998c778c55SBarry Smith    MatDenseRestoreArray - returns access to the array where the data for a SeqDense matrix is stored obtained by MatDenseGetArray()
150073a71a0fSBarry Smith 
150173a71a0fSBarry Smith    Not Collective
150273a71a0fSBarry Smith 
150373a71a0fSBarry Smith    Input Parameters:
150473a71a0fSBarry Smith .  mat - a MATSEQDENSE matrix
150573a71a0fSBarry Smith .  array - pointer to the data
150673a71a0fSBarry Smith 
150773a71a0fSBarry Smith    Level: intermediate
150873a71a0fSBarry Smith 
15098c778c55SBarry Smith .seealso: MatDenseGetArray()
151073a71a0fSBarry Smith @*/
15118c778c55SBarry Smith PetscErrorCode  MatDenseRestoreArray(Mat A,PetscScalar **array)
151273a71a0fSBarry Smith {
151373a71a0fSBarry Smith   PetscErrorCode ierr;
151473a71a0fSBarry Smith 
151573a71a0fSBarry Smith   PetscFunctionBegin;
15168c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
151773a71a0fSBarry Smith   PetscFunctionReturn(0);
151873a71a0fSBarry Smith }
151973a71a0fSBarry Smith 
152073a71a0fSBarry Smith #undef __FUNCT__
15214a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense"
152213f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B)
15230754003eSLois Curfman McInnes {
1524c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
15256849ba73SBarry Smith   PetscErrorCode ierr;
15265d0c19d7SBarry Smith   PetscInt       i,j,nrows,ncols;
15275d0c19d7SBarry Smith   const PetscInt *irow,*icol;
152887828ca2SBarry Smith   PetscScalar    *av,*bv,*v = mat->v;
15290754003eSLois Curfman McInnes   Mat            newmat;
15300754003eSLois Curfman McInnes 
15313a40ed3dSBarry Smith   PetscFunctionBegin;
153278b31e54SBarry Smith   ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr);
153378b31e54SBarry Smith   ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr);
1534e03a110bSBarry Smith   ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr);
1535e03a110bSBarry Smith   ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr);
15360754003eSLois Curfman McInnes 
1537182d2002SSatish Balay   /* Check submatrixcall */
1538182d2002SSatish Balay   if (scall == MAT_REUSE_MATRIX) {
153913f74950SBarry Smith     PetscInt n_cols,n_rows;
1540182d2002SSatish Balay     ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr);
154121a2c019SBarry Smith     if (n_rows != nrows || n_cols != ncols) {
1542f746d493SDmitry Karpeev       /* resize the result matrix to match number of requested rows/columns */
1543c61587bbSBarry Smith       ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
154421a2c019SBarry Smith     }
1545182d2002SSatish Balay     newmat = *B;
1546182d2002SSatish Balay   } else {
15470754003eSLois Curfman McInnes     /* Create and fill new matrix */
1548*ce94432eSBarry Smith     ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr);
1549f69a0ea3SMatthew Knepley     ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
15507adad957SLisandro Dalcin     ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
15510298fd71SBarry Smith     ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr);
1552182d2002SSatish Balay   }
1553182d2002SSatish Balay 
1554182d2002SSatish Balay   /* Now extract the data pointers and do the copy,column at a time */
1555182d2002SSatish Balay   bv = ((Mat_SeqDense*)newmat->data)->v;
1556182d2002SSatish Balay 
1557182d2002SSatish Balay   for (i=0; i<ncols; i++) {
15586de62eeeSBarry Smith     av = v + mat->lda*icol[i];
15592205254eSKarl Rupp     for (j=0; j<nrows; j++) *bv++ = av[irow[j]];
15600754003eSLois Curfman McInnes   }
1561182d2002SSatish Balay 
1562182d2002SSatish Balay   /* Assemble the matrices so that the correct flags are set */
15636d4a8577SBarry Smith   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
15646d4a8577SBarry Smith   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
15650754003eSLois Curfman McInnes 
15660754003eSLois Curfman McInnes   /* Free work space */
156778b31e54SBarry Smith   ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr);
156878b31e54SBarry Smith   ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr);
1569182d2002SSatish Balay   *B   = newmat;
15703a40ed3dSBarry Smith   PetscFunctionReturn(0);
15710754003eSLois Curfman McInnes }
15720754003eSLois Curfman McInnes 
15734a2ae208SSatish Balay #undef __FUNCT__
15744a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense"
157513f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[])
1576905e6a2fSBarry Smith {
15776849ba73SBarry Smith   PetscErrorCode ierr;
157813f74950SBarry Smith   PetscInt       i;
1579905e6a2fSBarry Smith 
15803a40ed3dSBarry Smith   PetscFunctionBegin;
1581905e6a2fSBarry Smith   if (scall == MAT_INITIAL_MATRIX) {
1582b0a32e0cSBarry Smith     ierr = PetscMalloc((n+1)*sizeof(Mat),B);CHKERRQ(ierr);
1583905e6a2fSBarry Smith   }
1584905e6a2fSBarry Smith 
1585905e6a2fSBarry Smith   for (i=0; i<n; i++) {
15866a6a5d1dSBarry Smith     ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr);
1587905e6a2fSBarry Smith   }
15883a40ed3dSBarry Smith   PetscFunctionReturn(0);
1589905e6a2fSBarry Smith }
1590905e6a2fSBarry Smith 
15914a2ae208SSatish Balay #undef __FUNCT__
1592c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense"
1593c0aa2d19SHong Zhang PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode)
1594c0aa2d19SHong Zhang {
1595c0aa2d19SHong Zhang   PetscFunctionBegin;
1596c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1597c0aa2d19SHong Zhang }
1598c0aa2d19SHong Zhang 
1599c0aa2d19SHong Zhang #undef __FUNCT__
1600c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense"
1601c0aa2d19SHong Zhang PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode)
1602c0aa2d19SHong Zhang {
1603c0aa2d19SHong Zhang   PetscFunctionBegin;
1604c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1605c0aa2d19SHong Zhang }
1606c0aa2d19SHong Zhang 
1607c0aa2d19SHong Zhang #undef __FUNCT__
16084a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense"
1609dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str)
16104b0e389bSBarry Smith {
16114b0e389bSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data;
16126849ba73SBarry Smith   PetscErrorCode ierr;
1613d0f46423SBarry Smith   PetscInt       lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j;
16143a40ed3dSBarry Smith 
16153a40ed3dSBarry Smith   PetscFunctionBegin;
161633f4a19fSKris Buschelman   /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */
161733f4a19fSKris Buschelman   if (A->ops->copy != B->ops->copy) {
1618cb5b572fSBarry Smith     ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr);
16193a40ed3dSBarry Smith     PetscFunctionReturn(0);
16203a40ed3dSBarry Smith   }
1621e32f2f54SBarry Smith   if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)");
1622a5ce6ee0Svictorle   if (lda1>m || lda2>m) {
16230dbb7854Svictorle     for (j=0; j<n; j++) {
1624a5ce6ee0Svictorle       ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr);
1625a5ce6ee0Svictorle     }
1626a5ce6ee0Svictorle   } else {
1627d0f46423SBarry Smith     ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1628a5ce6ee0Svictorle   }
1629273d9f13SBarry Smith   PetscFunctionReturn(0);
1630273d9f13SBarry Smith }
1631273d9f13SBarry Smith 
16324a2ae208SSatish Balay #undef __FUNCT__
16334994cf47SJed Brown #define __FUNCT__ "MatSetUp_SeqDense"
16344994cf47SJed Brown PetscErrorCode MatSetUp_SeqDense(Mat A)
1635273d9f13SBarry Smith {
1636dfbe8321SBarry Smith   PetscErrorCode ierr;
1637273d9f13SBarry Smith 
1638273d9f13SBarry Smith   PetscFunctionBegin;
1639273d9f13SBarry Smith   ierr =  MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr);
16403a40ed3dSBarry Smith   PetscFunctionReturn(0);
16414b0e389bSBarry Smith }
16424b0e389bSBarry Smith 
1643284134d9SBarry Smith #undef __FUNCT__
1644ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense"
1645ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A)
1646ba337c44SJed Brown {
1647ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1648ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1649ba337c44SJed Brown   PetscScalar  *aa = a->v;
1650ba337c44SJed Brown 
1651ba337c44SJed Brown   PetscFunctionBegin;
1652ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]);
1653ba337c44SJed Brown   PetscFunctionReturn(0);
1654ba337c44SJed Brown }
1655ba337c44SJed Brown 
1656ba337c44SJed Brown #undef __FUNCT__
1657ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense"
1658ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A)
1659ba337c44SJed Brown {
1660ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1661ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1662ba337c44SJed Brown   PetscScalar  *aa = a->v;
1663ba337c44SJed Brown 
1664ba337c44SJed Brown   PetscFunctionBegin;
1665ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]);
1666ba337c44SJed Brown   PetscFunctionReturn(0);
1667ba337c44SJed Brown }
1668ba337c44SJed Brown 
1669ba337c44SJed Brown #undef __FUNCT__
1670ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense"
1671ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A)
1672ba337c44SJed Brown {
1673ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1674ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1675ba337c44SJed Brown   PetscScalar  *aa = a->v;
1676ba337c44SJed Brown 
1677ba337c44SJed Brown   PetscFunctionBegin;
1678ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]);
1679ba337c44SJed Brown   PetscFunctionReturn(0);
1680ba337c44SJed Brown }
1681284134d9SBarry Smith 
1682a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/
1683a9fe9ddaSSatish Balay #undef __FUNCT__
1684a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense"
1685a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1686a9fe9ddaSSatish Balay {
1687a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1688a9fe9ddaSSatish Balay 
1689a9fe9ddaSSatish Balay   PetscFunctionBegin;
1690a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
1691a9fe9ddaSSatish Balay     ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
1692a9fe9ddaSSatish Balay   }
1693a9fe9ddaSSatish Balay   ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
1694a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1695a9fe9ddaSSatish Balay }
1696a9fe9ddaSSatish Balay 
1697a9fe9ddaSSatish Balay #undef __FUNCT__
1698a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense"
1699a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1700a9fe9ddaSSatish Balay {
1701ee16a9a1SHong Zhang   PetscErrorCode ierr;
1702d0f46423SBarry Smith   PetscInt       m=A->rmap->n,n=B->cmap->n;
1703ee16a9a1SHong Zhang   Mat            Cmat;
1704a9fe9ddaSSatish Balay 
1705ee16a9a1SHong Zhang   PetscFunctionBegin;
1706e32f2f54SBarry 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);
1707ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1708ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1709ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
17100298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr);
1711d73949e8SHong Zhang 
1712ee16a9a1SHong Zhang   *C = Cmat;
1713ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1714ee16a9a1SHong Zhang }
1715a9fe9ddaSSatish Balay 
171698a3b096SSatish Balay #undef __FUNCT__
1717a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense"
1718a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1719a9fe9ddaSSatish Balay {
1720a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1721a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1722a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
17230805154bSBarry Smith   PetscBLASInt   m,n,k;
1724a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1725c5df96a5SBarry Smith   PetscErrorCode ierr;
1726a9fe9ddaSSatish Balay 
1727a9fe9ddaSSatish Balay   PetscFunctionBegin;
1728c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
1729c5df96a5SBarry Smith   ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr);
1730c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr);
1731a83cb05cSBarry Smith   PetscStackCall("BLASgemv",BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
1732a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1733a9fe9ddaSSatish Balay }
1734a9fe9ddaSSatish Balay 
1735a9fe9ddaSSatish Balay #undef __FUNCT__
173675648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqDense_SeqDense"
173775648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1738a9fe9ddaSSatish Balay {
1739a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1740a9fe9ddaSSatish Balay 
1741a9fe9ddaSSatish Balay   PetscFunctionBegin;
1742a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
174375648e8dSHong Zhang     ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
1744a9fe9ddaSSatish Balay   }
174575648e8dSHong Zhang   ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
1746a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1747a9fe9ddaSSatish Balay }
1748a9fe9ddaSSatish Balay 
1749a9fe9ddaSSatish Balay #undef __FUNCT__
175075648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqDense_SeqDense"
175175648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1752a9fe9ddaSSatish Balay {
1753ee16a9a1SHong Zhang   PetscErrorCode ierr;
1754d0f46423SBarry Smith   PetscInt       m=A->cmap->n,n=B->cmap->n;
1755ee16a9a1SHong Zhang   Mat            Cmat;
1756a9fe9ddaSSatish Balay 
1757ee16a9a1SHong Zhang   PetscFunctionBegin;
1758e32f2f54SBarry 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);
1759ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1760ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1761ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
17620298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr);
17632205254eSKarl Rupp 
1764ee16a9a1SHong Zhang   Cmat->assembled = PETSC_TRUE;
17652205254eSKarl Rupp 
1766ee16a9a1SHong Zhang   *C = Cmat;
1767ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1768ee16a9a1SHong Zhang }
1769a9fe9ddaSSatish Balay 
1770a9fe9ddaSSatish Balay #undef __FUNCT__
177175648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqDense_SeqDense"
177275648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1773a9fe9ddaSSatish Balay {
1774a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1775a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1776a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
17770805154bSBarry Smith   PetscBLASInt   m,n,k;
1778a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1779c5df96a5SBarry Smith   PetscErrorCode ierr;
1780a9fe9ddaSSatish Balay 
1781a9fe9ddaSSatish Balay   PetscFunctionBegin;
1782c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&m);CHKERRQ(ierr);
1783c5df96a5SBarry Smith   ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr);
1784c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr);
17852fbe02b9SBarry Smith   /*
17862fbe02b9SBarry Smith      Note the m and n arguments below are the number rows and columns of A', not A!
17872fbe02b9SBarry Smith   */
1788a83cb05cSBarry Smith   PetscStackCall("BLASgemv",BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
1789a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1790a9fe9ddaSSatish Balay }
1791985db425SBarry Smith 
1792985db425SBarry Smith #undef __FUNCT__
1793985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense"
1794985db425SBarry Smith PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[])
1795985db425SBarry Smith {
1796985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1797985db425SBarry Smith   PetscErrorCode ierr;
1798d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1799985db425SBarry Smith   PetscScalar    *x;
1800985db425SBarry Smith   MatScalar      *aa = a->v;
1801985db425SBarry Smith 
1802985db425SBarry Smith   PetscFunctionBegin;
1803e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1804985db425SBarry Smith 
1805985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1806985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1807985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1808e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1809985db425SBarry Smith   for (i=0; i<m; i++) {
1810985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1811985db425SBarry Smith     for (j=1; j<n; j++) {
1812985db425SBarry Smith       if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1813985db425SBarry Smith     }
1814985db425SBarry Smith   }
1815985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1816985db425SBarry Smith   PetscFunctionReturn(0);
1817985db425SBarry Smith }
1818985db425SBarry Smith 
1819985db425SBarry Smith #undef __FUNCT__
1820985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense"
1821985db425SBarry Smith PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[])
1822985db425SBarry Smith {
1823985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1824985db425SBarry Smith   PetscErrorCode ierr;
1825d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1826985db425SBarry Smith   PetscScalar    *x;
1827985db425SBarry Smith   PetscReal      atmp;
1828985db425SBarry Smith   MatScalar      *aa = a->v;
1829985db425SBarry Smith 
1830985db425SBarry Smith   PetscFunctionBegin;
1831e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1832985db425SBarry Smith 
1833985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1834985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1835985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1836e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1837985db425SBarry Smith   for (i=0; i<m; i++) {
18389189402eSHong Zhang     x[i] = PetscAbsScalar(aa[i]);
1839985db425SBarry Smith     for (j=1; j<n; j++) {
1840985db425SBarry Smith       atmp = PetscAbsScalar(aa[i+m*j]);
1841985db425SBarry Smith       if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;}
1842985db425SBarry Smith     }
1843985db425SBarry Smith   }
1844985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1845985db425SBarry Smith   PetscFunctionReturn(0);
1846985db425SBarry Smith }
1847985db425SBarry Smith 
1848985db425SBarry Smith #undef __FUNCT__
1849985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense"
1850985db425SBarry Smith PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[])
1851985db425SBarry Smith {
1852985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1853985db425SBarry Smith   PetscErrorCode ierr;
1854d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1855985db425SBarry Smith   PetscScalar    *x;
1856985db425SBarry Smith   MatScalar      *aa = a->v;
1857985db425SBarry Smith 
1858985db425SBarry Smith   PetscFunctionBegin;
1859e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1860985db425SBarry Smith 
1861985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1862985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1863985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1864e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1865985db425SBarry Smith   for (i=0; i<m; i++) {
1866985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1867985db425SBarry Smith     for (j=1; j<n; j++) {
1868985db425SBarry Smith       if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1869985db425SBarry Smith     }
1870985db425SBarry Smith   }
1871985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1872985db425SBarry Smith   PetscFunctionReturn(0);
1873985db425SBarry Smith }
1874985db425SBarry Smith 
18758d0534beSBarry Smith #undef __FUNCT__
18768d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense"
18778d0534beSBarry Smith PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col)
18788d0534beSBarry Smith {
18798d0534beSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
18808d0534beSBarry Smith   PetscErrorCode ierr;
18818d0534beSBarry Smith   PetscScalar    *x;
18828d0534beSBarry Smith 
18838d0534beSBarry Smith   PetscFunctionBegin;
1884e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
18858d0534beSBarry Smith 
18868d0534beSBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1887d0f46423SBarry Smith   ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
18888d0534beSBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
18898d0534beSBarry Smith   PetscFunctionReturn(0);
18908d0534beSBarry Smith }
18918d0534beSBarry Smith 
18920716a85fSBarry Smith 
18930716a85fSBarry Smith #undef __FUNCT__
18940716a85fSBarry Smith #define __FUNCT__ "MatGetColumnNorms_SeqDense"
18950716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms)
18960716a85fSBarry Smith {
18970716a85fSBarry Smith   PetscErrorCode ierr;
18980716a85fSBarry Smith   PetscInt       i,j,m,n;
18990716a85fSBarry Smith   PetscScalar    *a;
19000716a85fSBarry Smith 
19010716a85fSBarry Smith   PetscFunctionBegin;
19020716a85fSBarry Smith   ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr);
19030716a85fSBarry Smith   ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr);
19048c778c55SBarry Smith   ierr = MatDenseGetArray(A,&a);CHKERRQ(ierr);
19050716a85fSBarry Smith   if (type == NORM_2) {
19060716a85fSBarry Smith     for (i=0; i<n; i++) {
19070716a85fSBarry Smith       for (j=0; j<m; j++) {
19080716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]*a[j]);
19090716a85fSBarry Smith       }
19100716a85fSBarry Smith       a += m;
19110716a85fSBarry Smith     }
19120716a85fSBarry Smith   } else if (type == NORM_1) {
19130716a85fSBarry Smith     for (i=0; i<n; i++) {
19140716a85fSBarry Smith       for (j=0; j<m; j++) {
19150716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]);
19160716a85fSBarry Smith       }
19170716a85fSBarry Smith       a += m;
19180716a85fSBarry Smith     }
19190716a85fSBarry Smith   } else if (type == NORM_INFINITY) {
19200716a85fSBarry Smith     for (i=0; i<n; i++) {
19210716a85fSBarry Smith       for (j=0; j<m; j++) {
19220716a85fSBarry Smith         norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]);
19230716a85fSBarry Smith       }
19240716a85fSBarry Smith       a += m;
19250716a85fSBarry Smith     }
1926*ce94432eSBarry Smith   } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType");
19278c778c55SBarry Smith   ierr = MatDenseRestoreArray(A,&a);CHKERRQ(ierr);
19280716a85fSBarry Smith   if (type == NORM_2) {
19298f1a2a5eSBarry Smith     for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]);
19300716a85fSBarry Smith   }
19310716a85fSBarry Smith   PetscFunctionReturn(0);
19320716a85fSBarry Smith }
19330716a85fSBarry Smith 
193473a71a0fSBarry Smith #undef __FUNCT__
193573a71a0fSBarry Smith #define __FUNCT__ "MatSetRandom_SeqDense"
193673a71a0fSBarry Smith static PetscErrorCode  MatSetRandom_SeqDense(Mat x,PetscRandom rctx)
193773a71a0fSBarry Smith {
193873a71a0fSBarry Smith   PetscErrorCode ierr;
193973a71a0fSBarry Smith   PetscScalar    *a;
194073a71a0fSBarry Smith   PetscInt       m,n,i;
194173a71a0fSBarry Smith 
194273a71a0fSBarry Smith   PetscFunctionBegin;
194373a71a0fSBarry Smith   ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr);
19448c778c55SBarry Smith   ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr);
194573a71a0fSBarry Smith   for (i=0; i<m*n; i++) {
194673a71a0fSBarry Smith     ierr = PetscRandomGetValue(rctx,a+i);CHKERRQ(ierr);
194773a71a0fSBarry Smith   }
19488c778c55SBarry Smith   ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr);
194973a71a0fSBarry Smith   PetscFunctionReturn(0);
195073a71a0fSBarry Smith }
195173a71a0fSBarry Smith 
195273a71a0fSBarry Smith 
1953289bc588SBarry Smith /* -------------------------------------------------------------------*/
1954a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense,
1955905e6a2fSBarry Smith                                         MatGetRow_SeqDense,
1956905e6a2fSBarry Smith                                         MatRestoreRow_SeqDense,
1957905e6a2fSBarry Smith                                         MatMult_SeqDense,
195897304618SKris Buschelman                                 /*  4*/ MatMultAdd_SeqDense,
19597c922b88SBarry Smith                                         MatMultTranspose_SeqDense,
19607c922b88SBarry Smith                                         MatMultTransposeAdd_SeqDense,
1961db4efbfdSBarry Smith                                         0,
1962db4efbfdSBarry Smith                                         0,
1963db4efbfdSBarry Smith                                         0,
1964db4efbfdSBarry Smith                                 /* 10*/ 0,
1965905e6a2fSBarry Smith                                         MatLUFactor_SeqDense,
1966905e6a2fSBarry Smith                                         MatCholeskyFactor_SeqDense,
196741f059aeSBarry Smith                                         MatSOR_SeqDense,
1968ec8511deSBarry Smith                                         MatTranspose_SeqDense,
196997304618SKris Buschelman                                 /* 15*/ MatGetInfo_SeqDense,
1970905e6a2fSBarry Smith                                         MatEqual_SeqDense,
1971905e6a2fSBarry Smith                                         MatGetDiagonal_SeqDense,
1972905e6a2fSBarry Smith                                         MatDiagonalScale_SeqDense,
1973905e6a2fSBarry Smith                                         MatNorm_SeqDense,
1974c0aa2d19SHong Zhang                                 /* 20*/ MatAssemblyBegin_SeqDense,
1975c0aa2d19SHong Zhang                                         MatAssemblyEnd_SeqDense,
1976905e6a2fSBarry Smith                                         MatSetOption_SeqDense,
1977905e6a2fSBarry Smith                                         MatZeroEntries_SeqDense,
1978d519adbfSMatthew Knepley                                 /* 24*/ MatZeroRows_SeqDense,
1979db4efbfdSBarry Smith                                         0,
1980db4efbfdSBarry Smith                                         0,
1981db4efbfdSBarry Smith                                         0,
1982db4efbfdSBarry Smith                                         0,
19834994cf47SJed Brown                                 /* 29*/ MatSetUp_SeqDense,
1984273d9f13SBarry Smith                                         0,
1985905e6a2fSBarry Smith                                         0,
198673a71a0fSBarry Smith                                         0,
198773a71a0fSBarry Smith                                         0,
1988d519adbfSMatthew Knepley                                 /* 34*/ MatDuplicate_SeqDense,
1989a5ae1ecdSBarry Smith                                         0,
1990a5ae1ecdSBarry Smith                                         0,
1991a5ae1ecdSBarry Smith                                         0,
1992a5ae1ecdSBarry Smith                                         0,
1993d519adbfSMatthew Knepley                                 /* 39*/ MatAXPY_SeqDense,
1994a5ae1ecdSBarry Smith                                         MatGetSubMatrices_SeqDense,
1995a5ae1ecdSBarry Smith                                         0,
19964b0e389bSBarry Smith                                         MatGetValues_SeqDense,
1997a5ae1ecdSBarry Smith                                         MatCopy_SeqDense,
1998d519adbfSMatthew Knepley                                 /* 44*/ MatGetRowMax_SeqDense,
1999a5ae1ecdSBarry Smith                                         MatScale_SeqDense,
2000a5ae1ecdSBarry Smith                                         0,
2001a5ae1ecdSBarry Smith                                         0,
2002a5ae1ecdSBarry Smith                                         0,
200373a71a0fSBarry Smith                                 /* 49*/ MatSetRandom_SeqDense,
2004a5ae1ecdSBarry Smith                                         0,
2005a5ae1ecdSBarry Smith                                         0,
2006a5ae1ecdSBarry Smith                                         0,
2007a5ae1ecdSBarry Smith                                         0,
2008d519adbfSMatthew Knepley                                 /* 54*/ 0,
2009a5ae1ecdSBarry Smith                                         0,
2010a5ae1ecdSBarry Smith                                         0,
2011a5ae1ecdSBarry Smith                                         0,
2012a5ae1ecdSBarry Smith                                         0,
2013d519adbfSMatthew Knepley                                 /* 59*/ 0,
2014e03a110bSBarry Smith                                         MatDestroy_SeqDense,
2015e03a110bSBarry Smith                                         MatView_SeqDense,
2016357abbc8SBarry Smith                                         0,
201797304618SKris Buschelman                                         0,
2018d519adbfSMatthew Knepley                                 /* 64*/ 0,
201997304618SKris Buschelman                                         0,
202097304618SKris Buschelman                                         0,
202197304618SKris Buschelman                                         0,
202297304618SKris Buschelman                                         0,
2023d519adbfSMatthew Knepley                                 /* 69*/ MatGetRowMaxAbs_SeqDense,
202497304618SKris Buschelman                                         0,
202597304618SKris Buschelman                                         0,
202697304618SKris Buschelman                                         0,
202797304618SKris Buschelman                                         0,
2028d519adbfSMatthew Knepley                                 /* 74*/ 0,
202997304618SKris Buschelman                                         0,
203097304618SKris Buschelman                                         0,
203197304618SKris Buschelman                                         0,
203297304618SKris Buschelman                                         0,
2033d519adbfSMatthew Knepley                                 /* 79*/ 0,
203497304618SKris Buschelman                                         0,
203597304618SKris Buschelman                                         0,
203697304618SKris Buschelman                                         0,
20375bba2384SShri Abhyankar                                 /* 83*/ MatLoad_SeqDense,
2038865e5f61SKris Buschelman                                         0,
20391cbb95d3SBarry Smith                                         MatIsHermitian_SeqDense,
2040865e5f61SKris Buschelman                                         0,
2041865e5f61SKris Buschelman                                         0,
2042865e5f61SKris Buschelman                                         0,
2043d519adbfSMatthew Knepley                                 /* 89*/ MatMatMult_SeqDense_SeqDense,
2044a9fe9ddaSSatish Balay                                         MatMatMultSymbolic_SeqDense_SeqDense,
2045a9fe9ddaSSatish Balay                                         MatMatMultNumeric_SeqDense_SeqDense,
2046865e5f61SKris Buschelman                                         0,
2047865e5f61SKris Buschelman                                         0,
2048d519adbfSMatthew Knepley                                 /* 94*/ 0,
20495df89d91SHong Zhang                                         0,
20505df89d91SHong Zhang                                         0,
20515df89d91SHong Zhang                                         0,
2052284134d9SBarry Smith                                         0,
2053d519adbfSMatthew Knepley                                 /* 99*/ 0,
2054284134d9SBarry Smith                                         0,
2055284134d9SBarry Smith                                         0,
2056ba337c44SJed Brown                                         MatConjugate_SeqDense,
2057f73d5cc4SBarry Smith                                         0,
2058ba337c44SJed Brown                                 /*104*/ 0,
2059ba337c44SJed Brown                                         MatRealPart_SeqDense,
2060ba337c44SJed Brown                                         MatImaginaryPart_SeqDense,
2061985db425SBarry Smith                                         0,
2062985db425SBarry Smith                                         0,
206385e2c93fSHong Zhang                                 /*109*/ MatMatSolve_SeqDense,
2064985db425SBarry Smith                                         0,
20658d0534beSBarry Smith                                         MatGetRowMin_SeqDense,
2066aabbc4fbSShri Abhyankar                                         MatGetColumnVector_SeqDense,
2067aabbc4fbSShri Abhyankar                                         0,
2068aabbc4fbSShri Abhyankar                                 /*114*/ 0,
2069aabbc4fbSShri Abhyankar                                         0,
2070aabbc4fbSShri Abhyankar                                         0,
2071aabbc4fbSShri Abhyankar                                         0,
2072aabbc4fbSShri Abhyankar                                         0,
2073aabbc4fbSShri Abhyankar                                 /*119*/ 0,
2074aabbc4fbSShri Abhyankar                                         0,
2075aabbc4fbSShri Abhyankar                                         0,
20760716a85fSBarry Smith                                         0,
20770716a85fSBarry Smith                                         0,
20780716a85fSBarry Smith                                 /*124*/ 0,
20795df89d91SHong Zhang                                         MatGetColumnNorms_SeqDense,
20805df89d91SHong Zhang                                         0,
20815df89d91SHong Zhang                                         0,
20825df89d91SHong Zhang                                         0,
20835df89d91SHong Zhang                                 /*129*/ 0,
208475648e8dSHong Zhang                                         MatTransposeMatMult_SeqDense_SeqDense,
208575648e8dSHong Zhang                                         MatTransposeMatMultSymbolic_SeqDense_SeqDense,
208675648e8dSHong Zhang                                         MatTransposeMatMultNumeric_SeqDense_SeqDense,
2087985db425SBarry Smith };
208890ace30eSBarry Smith 
20894a2ae208SSatish Balay #undef __FUNCT__
20904a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense"
20914b828684SBarry Smith /*@C
2092fafbff53SBarry Smith    MatCreateSeqDense - Creates a sequential dense matrix that
2093d65003e9SLois Curfman McInnes    is stored in column major order (the usual Fortran 77 manner). Many
2094d65003e9SLois Curfman McInnes    of the matrix operations use the BLAS and LAPACK routines.
2095289bc588SBarry Smith 
2096db81eaa0SLois Curfman McInnes    Collective on MPI_Comm
2097db81eaa0SLois Curfman McInnes 
209820563c6bSBarry Smith    Input Parameters:
2099db81eaa0SLois Curfman McInnes +  comm - MPI communicator, set to PETSC_COMM_SELF
21000c775827SLois Curfman McInnes .  m - number of rows
210118f449edSLois Curfman McInnes .  n - number of columns
21020298fd71SBarry Smith -  data - optional location of matrix data in column major order.  Set data=NULL for PETSc
2103dfc5480cSLois Curfman McInnes    to control all matrix memory allocation.
210420563c6bSBarry Smith 
210520563c6bSBarry Smith    Output Parameter:
210644cd7ae7SLois Curfman McInnes .  A - the matrix
210720563c6bSBarry Smith 
2108b259b22eSLois Curfman McInnes    Notes:
210918f449edSLois Curfman McInnes    The data input variable is intended primarily for Fortran programmers
211018f449edSLois Curfman McInnes    who wish to allocate their own matrix memory space.  Most users should
21110298fd71SBarry Smith    set data=NULL.
211218f449edSLois Curfman McInnes 
2113027ccd11SLois Curfman McInnes    Level: intermediate
2114027ccd11SLois Curfman McInnes 
2115dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS
2116d65003e9SLois Curfman McInnes 
211769b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues()
211820563c6bSBarry Smith @*/
21197087cfbeSBarry Smith PetscErrorCode  MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A)
2120289bc588SBarry Smith {
2121dfbe8321SBarry Smith   PetscErrorCode ierr;
21223b2fbd54SBarry Smith 
21233a40ed3dSBarry Smith   PetscFunctionBegin;
2124f69a0ea3SMatthew Knepley   ierr = MatCreate(comm,A);CHKERRQ(ierr);
2125f69a0ea3SMatthew Knepley   ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr);
2126273d9f13SBarry Smith   ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr);
2127273d9f13SBarry Smith   ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr);
2128273d9f13SBarry Smith   PetscFunctionReturn(0);
2129273d9f13SBarry Smith }
2130273d9f13SBarry Smith 
21314a2ae208SSatish Balay #undef __FUNCT__
2132afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation"
2133273d9f13SBarry Smith /*@C
2134273d9f13SBarry Smith    MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements
2135273d9f13SBarry Smith 
2136273d9f13SBarry Smith    Collective on MPI_Comm
2137273d9f13SBarry Smith 
2138273d9f13SBarry Smith    Input Parameters:
2139273d9f13SBarry Smith +  A - the matrix
21400298fd71SBarry Smith -  data - the array (or NULL)
2141273d9f13SBarry Smith 
2142273d9f13SBarry Smith    Notes:
2143273d9f13SBarry Smith    The data input variable is intended primarily for Fortran programmers
2144273d9f13SBarry Smith    who wish to allocate their own matrix memory space.  Most users should
2145284134d9SBarry Smith    need not call this routine.
2146273d9f13SBarry Smith 
2147273d9f13SBarry Smith    Level: intermediate
2148273d9f13SBarry Smith 
2149273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS
2150273d9f13SBarry Smith 
215169b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA()
2152867c911aSBarry Smith 
2153273d9f13SBarry Smith @*/
21547087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation(Mat B,PetscScalar data[])
2155273d9f13SBarry Smith {
21564ac538c5SBarry Smith   PetscErrorCode ierr;
2157a23d5eceSKris Buschelman 
2158a23d5eceSKris Buschelman   PetscFunctionBegin;
21594ac538c5SBarry Smith   ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr);
2160a23d5eceSKris Buschelman   PetscFunctionReturn(0);
2161a23d5eceSKris Buschelman }
2162a23d5eceSKris Buschelman 
2163a23d5eceSKris Buschelman EXTERN_C_BEGIN
2164a23d5eceSKris Buschelman #undef __FUNCT__
2165afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense"
21667087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data)
2167a23d5eceSKris Buschelman {
2168273d9f13SBarry Smith   Mat_SeqDense   *b;
2169dfbe8321SBarry Smith   PetscErrorCode ierr;
2170273d9f13SBarry Smith 
2171273d9f13SBarry Smith   PetscFunctionBegin;
2172273d9f13SBarry Smith   B->preallocated = PETSC_TRUE;
2173a868139aSShri Abhyankar 
217434ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr);
217534ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr);
217634ef9618SShri Abhyankar 
2177273d9f13SBarry Smith   b       = (Mat_SeqDense*)B->data;
217886d161a7SShri Abhyankar   b->Mmax = B->rmap->n;
217986d161a7SShri Abhyankar   b->Nmax = B->cmap->n;
218086d161a7SShri Abhyankar   if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n;
218186d161a7SShri Abhyankar 
21829e8f95c4SLisandro Dalcin   if (!data) { /* petsc-allocated storage */
21839e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
21845afd5e0cSBarry Smith     ierr = PetscMalloc(b->lda*b->Nmax*sizeof(PetscScalar),&b->v);CHKERRQ(ierr);
2185284134d9SBarry Smith     ierr = PetscMemzero(b->v,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
2186284134d9SBarry Smith     ierr = PetscLogObjectMemory(B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
21872205254eSKarl Rupp 
21889e8f95c4SLisandro Dalcin     b->user_alloc = PETSC_FALSE;
2189273d9f13SBarry Smith   } else { /* user-allocated storage */
21909e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2191273d9f13SBarry Smith     b->v          = data;
2192273d9f13SBarry Smith     b->user_alloc = PETSC_TRUE;
2193273d9f13SBarry Smith   }
21940450473dSBarry Smith   B->assembled = PETSC_TRUE;
2195273d9f13SBarry Smith   PetscFunctionReturn(0);
2196273d9f13SBarry Smith }
2197a23d5eceSKris Buschelman EXTERN_C_END
2198273d9f13SBarry Smith 
21991b807ce4Svictorle #undef __FUNCT__
22001b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA"
22011b807ce4Svictorle /*@C
22021b807ce4Svictorle   MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array
22031b807ce4Svictorle 
22041b807ce4Svictorle   Input parameter:
22051b807ce4Svictorle + A - the matrix
22061b807ce4Svictorle - lda - the leading dimension
22071b807ce4Svictorle 
22081b807ce4Svictorle   Notes:
2209867c911aSBarry Smith   This routine is to be used in conjunction with MatSeqDenseSetPreallocation();
22101b807ce4Svictorle   it asserts that the preallocation has a leading dimension (the LDA parameter
22111b807ce4Svictorle   of Blas and Lapack fame) larger than M, the first dimension of the matrix.
22121b807ce4Svictorle 
22131b807ce4Svictorle   Level: intermediate
22141b807ce4Svictorle 
22151b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS
22161b807ce4Svictorle 
2217284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize()
2218867c911aSBarry Smith 
22191b807ce4Svictorle @*/
22207087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetLDA(Mat B,PetscInt lda)
22211b807ce4Svictorle {
22221b807ce4Svictorle   Mat_SeqDense *b = (Mat_SeqDense*)B->data;
222321a2c019SBarry Smith 
22241b807ce4Svictorle   PetscFunctionBegin;
2225e32f2f54SBarry 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);
22261b807ce4Svictorle   b->lda       = lda;
222721a2c019SBarry Smith   b->changelda = PETSC_FALSE;
222821a2c019SBarry Smith   b->Mmax      = PetscMax(b->Mmax,lda);
22291b807ce4Svictorle   PetscFunctionReturn(0);
22301b807ce4Svictorle }
22311b807ce4Svictorle 
22320bad9183SKris Buschelman /*MC
2233fafad747SKris Buschelman    MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices.
22340bad9183SKris Buschelman 
22350bad9183SKris Buschelman    Options Database Keys:
22360bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions()
22370bad9183SKris Buschelman 
22380bad9183SKris Buschelman   Level: beginner
22390bad9183SKris Buschelman 
224089665df3SBarry Smith .seealso: MatCreateSeqDense()
224189665df3SBarry Smith 
22420bad9183SKris Buschelman M*/
22430bad9183SKris Buschelman 
2244273d9f13SBarry Smith EXTERN_C_BEGIN
22454a2ae208SSatish Balay #undef __FUNCT__
22464a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense"
22477087cfbeSBarry Smith PetscErrorCode  MatCreate_SeqDense(Mat B)
2248273d9f13SBarry Smith {
2249273d9f13SBarry Smith   Mat_SeqDense   *b;
2250dfbe8321SBarry Smith   PetscErrorCode ierr;
22517c334f02SBarry Smith   PetscMPIInt    size;
2252273d9f13SBarry Smith 
2253273d9f13SBarry Smith   PetscFunctionBegin;
2254*ce94432eSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr);
2255e32f2f54SBarry Smith   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1");
225655659b69SBarry Smith 
225738f2d2fdSLisandro Dalcin   ierr    = PetscNewLog(B,Mat_SeqDense,&b);CHKERRQ(ierr);
2258549d3d68SSatish Balay   ierr    = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr);
225944cd7ae7SLois Curfman McInnes   B->data = (void*)b;
226018f449edSLois Curfman McInnes 
226144cd7ae7SLois Curfman McInnes   b->pivots      = 0;
2262273d9f13SBarry Smith   b->roworiented = PETSC_TRUE;
2263273d9f13SBarry Smith   b->v           = 0;
226421a2c019SBarry Smith   b->changelda   = PETSC_FALSE;
22654e220ebcSLois Curfman McInnes 
22668c778c55SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatDenseGetArray_C","MatDenseGetArray_SeqDense",MatDenseGetArray_SeqDense);CHKERRQ(ierr);
22678c778c55SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatDenseRestoreArray_C","MatDenseRestoreArray_SeqDense",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr);
2268b24902e0SBarry Smith 
22696a63e612SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatConvert_seqdense_seqaij_C","MatConvert_SeqDense_SeqAIJ",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr);
2270ec1065edSBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatGetFactor_petsc_C",
2271b24902e0SBarry Smith                                            "MatGetFactor_seqdense_petsc",
2272b24902e0SBarry Smith                                            MatGetFactor_seqdense_petsc);CHKERRQ(ierr);
2273a23d5eceSKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatSeqDenseSetPreallocation_C",
2274a23d5eceSKris Buschelman                                            "MatSeqDenseSetPreallocation_SeqDense",
2275a23d5eceSKris Buschelman                                            MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr);
22762356f84bSDmitry Karpeev 
22774ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMult_seqaij_seqdense_C",
22784ae313f4SHong Zhang                                            "MatMatMult_SeqAIJ_SeqDense",
22794ae313f4SHong Zhang                                            MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
22802356f84bSDmitry Karpeev 
2281c0c8ee5eSDmitry Karpeev 
22824ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",
22834ae313f4SHong Zhang                                            "MatMatMultSymbolic_SeqAIJ_SeqDense",
22844ae313f4SHong Zhang                                            MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
22854ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",
22864ae313f4SHong Zhang                                            "MatMatMultNumeric_SeqAIJ_SeqDense",
22874ae313f4SHong Zhang                                            MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
228817667f90SBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr);
22893a40ed3dSBarry Smith   PetscFunctionReturn(0);
2290289bc588SBarry Smith }
2291273d9f13SBarry Smith EXTERN_C_END
2292