xref: /petsc/src/mat/impls/dense/seq/dense.c (revision b66fe19d7748d07bf4780421e263e2c2ab68b92a)
1be1d678aSKris Buschelman 
267e560aaSBarry Smith /*
367e560aaSBarry Smith      Defines the basic matrix operations for sequential dense.
467e560aaSBarry Smith */
5289bc588SBarry Smith 
6c6db04a5SJed Brown #include <../src/mat/impls/dense/seq/dense.h>
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;
236a63e612SBarry Smith   ierr = MatCreate(((PetscObject)A)->comm,&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);
266a63e612SBarry Smith   ierr = MatSeqAIJSetPreallocation(B,A->cmap->n,PETSC_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;
59d0f46423SBarry Smith   N    = PetscBLASIntCast(X->rmap->n*X->cmap->n);
60d0f46423SBarry Smith   m    = PetscBLASIntCast(X->rmap->n);
610805154bSBarry Smith   ldax = PetscBLASIntCast(x->lda);
620805154bSBarry Smith   lday = PetscBLASIntCast(y->lda);
63a5ce6ee0Svictorle   if (ldax>m || lday>m) {
64d0f46423SBarry Smith     for (j=0; j<X->cmap->n; j++) {
65f4df32b1SMatthew Knepley       BLASaxpy_(&m,&oalpha,x->v+j*ldax,&one,y->v+j*lday,&one);
66a5ce6ee0Svictorle     }
67a5ce6ee0Svictorle   } else {
68f4df32b1SMatthew Knepley     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;
1010805154bSBarry Smith   PetscBLASInt   one = 1,j,nz,lda = PetscBLASIntCast(a->lda);
10280cd9d93SLois Curfman McInnes 
1033a40ed3dSBarry Smith   PetscFunctionBegin;
104d0f46423SBarry Smith   if (lda>A->rmap->n) {
105d0f46423SBarry Smith     nz = PetscBLASIntCast(A->rmap->n);
106d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
107f4df32b1SMatthew Knepley       BLASscal_(&nz,&oalpha,a->v+j*lda,&one);
108a5ce6ee0Svictorle     }
109a5ce6ee0Svictorle   } else {
110d0f46423SBarry Smith     nz = PetscBLASIntCast(A->rmap->n*A->cmap->n);
111f4df32b1SMatthew Knepley     BLASscal_(&nz,&oalpha,a->v,&one);
112a5ce6ee0Svictorle   }
113efee365bSSatish Balay   ierr = PetscLogFlops(nz);CHKERRQ(ierr);
1143a40ed3dSBarry Smith   PetscFunctionReturn(0);
11580cd9d93SLois Curfman McInnes }
11680cd9d93SLois Curfman McInnes 
1171cbb95d3SBarry Smith #undef __FUNCT__
1181cbb95d3SBarry Smith #define __FUNCT__ "MatIsHermitian_SeqDense"
119ace3abfcSBarry Smith PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscBool  *fl)
1201cbb95d3SBarry Smith {
1211cbb95d3SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
122d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,N;
1231cbb95d3SBarry Smith   PetscScalar    *v = a->v;
1241cbb95d3SBarry Smith 
1251cbb95d3SBarry Smith   PetscFunctionBegin;
1261cbb95d3SBarry Smith   *fl = PETSC_FALSE;
127d0f46423SBarry Smith   if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0);
1281cbb95d3SBarry Smith   N = a->lda;
1291cbb95d3SBarry Smith 
1301cbb95d3SBarry Smith   for (i=0; i<m; i++) {
1311cbb95d3SBarry Smith     for (j=i+1; j<m; j++) {
1321cbb95d3SBarry Smith       if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) PetscFunctionReturn(0);
1331cbb95d3SBarry Smith     }
1341cbb95d3SBarry Smith   }
1351cbb95d3SBarry Smith   *fl = PETSC_TRUE;
1361cbb95d3SBarry Smith   PetscFunctionReturn(0);
1371cbb95d3SBarry Smith }
1381cbb95d3SBarry Smith 
139b24902e0SBarry Smith #undef __FUNCT__
140b24902e0SBarry Smith #define __FUNCT__ "MatDuplicateNoCreate_SeqDense"
141719d5645SBarry Smith PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat newi,Mat A,MatDuplicateOption cpvalues)
142b24902e0SBarry Smith {
143b24902e0SBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data,*l;
144b24902e0SBarry Smith   PetscErrorCode ierr;
145b24902e0SBarry Smith   PetscInt       lda = (PetscInt)mat->lda,j,m;
146b24902e0SBarry Smith 
147b24902e0SBarry Smith   PetscFunctionBegin;
148aa5ea44dSBarry Smith   ierr = PetscLayoutReference(A->rmap,&newi->rmap);CHKERRQ(ierr);
149aa5ea44dSBarry Smith   ierr = PetscLayoutReference(A->cmap,&newi->cmap);CHKERRQ(ierr);
150719d5645SBarry Smith   ierr = MatSeqDenseSetPreallocation(newi,PETSC_NULL);CHKERRQ(ierr);
151b24902e0SBarry Smith   if (cpvalues == MAT_COPY_VALUES) {
152b24902e0SBarry Smith     l = (Mat_SeqDense*)newi->data;
153d0f46423SBarry Smith     if (lda>A->rmap->n) {
154d0f46423SBarry Smith       m = A->rmap->n;
155d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
156b24902e0SBarry Smith 	ierr = PetscMemcpy(l->v+j*m,mat->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
157b24902e0SBarry Smith       }
158b24902e0SBarry Smith     } else {
159d0f46423SBarry Smith       ierr = PetscMemcpy(l->v,mat->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
160b24902e0SBarry Smith     }
161b24902e0SBarry Smith   }
162b24902e0SBarry Smith   newi->assembled = PETSC_TRUE;
163b24902e0SBarry Smith   PetscFunctionReturn(0);
164b24902e0SBarry Smith }
165b24902e0SBarry Smith 
1664a2ae208SSatish Balay #undef __FUNCT__
1674a2ae208SSatish Balay #define __FUNCT__ "MatDuplicate_SeqDense"
168dfbe8321SBarry Smith PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat)
16902cad45dSBarry Smith {
1706849ba73SBarry Smith   PetscErrorCode ierr;
17102cad45dSBarry Smith 
1723a40ed3dSBarry Smith   PetscFunctionBegin;
1735c9eb25fSBarry Smith   ierr = MatCreate(((PetscObject)A)->comm,newmat);CHKERRQ(ierr);
174d0f46423SBarry Smith   ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
1755c9eb25fSBarry Smith   ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
176719d5645SBarry Smith   ierr = MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues);CHKERRQ(ierr);
177b24902e0SBarry Smith   PetscFunctionReturn(0);
178b24902e0SBarry Smith }
179b24902e0SBarry Smith 
1806ee01492SSatish Balay 
1810481f469SBarry Smith extern PetscErrorCode MatLUFactor_SeqDense(Mat,IS,IS,const MatFactorInfo*);
182719d5645SBarry Smith 
1834a2ae208SSatish Balay #undef __FUNCT__
1844a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorNumeric_SeqDense"
1850481f469SBarry Smith PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
186289bc588SBarry Smith {
1874482741eSBarry Smith   MatFactorInfo  info;
188a093e273SMatthew Knepley   PetscErrorCode ierr;
1893a40ed3dSBarry Smith 
1903a40ed3dSBarry Smith   PetscFunctionBegin;
191c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
192719d5645SBarry Smith   ierr = MatLUFactor_SeqDense(fact,0,0,&info);CHKERRQ(ierr);
1933a40ed3dSBarry Smith   PetscFunctionReturn(0);
194289bc588SBarry Smith }
1956ee01492SSatish Balay 
1960b4b3355SBarry Smith #undef __FUNCT__
1974a2ae208SSatish Balay #define __FUNCT__ "MatSolve_SeqDense"
198dfbe8321SBarry Smith PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy)
199289bc588SBarry Smith {
200c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
2016849ba73SBarry Smith   PetscErrorCode ierr;
20287828ca2SBarry Smith   PetscScalar    *x,*y;
203d0f46423SBarry Smith   PetscBLASInt   one = 1,info,m = PetscBLASIntCast(A->rmap->n);
20467e560aaSBarry Smith 
2053a40ed3dSBarry Smith   PetscFunctionBegin;
2061ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
2071ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
208d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
209d5f3da31SBarry Smith   if (A->factortype == MAT_FACTOR_LU) {
210ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
211e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
212ae7cfcebSSatish Balay #else
21371044d3cSBarry Smith     LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info);
214e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
215ae7cfcebSSatish Balay #endif
216d5f3da31SBarry Smith   } else if (A->factortype == MAT_FACTOR_CHOLESKY){
217ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
218e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
219ae7cfcebSSatish Balay #else
22071044d3cSBarry Smith     LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info);
221e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
222ae7cfcebSSatish Balay #endif
223289bc588SBarry Smith   }
224e32f2f54SBarry Smith   else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
2251ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
2261ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
227dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
2283a40ed3dSBarry Smith   PetscFunctionReturn(0);
229289bc588SBarry Smith }
2306ee01492SSatish Balay 
2314a2ae208SSatish Balay #undef __FUNCT__
23285e2c93fSHong Zhang #define __FUNCT__ "MatMatSolve_SeqDense"
23385e2c93fSHong Zhang PetscErrorCode MatMatSolve_SeqDense(Mat A,Mat B,Mat X)
23485e2c93fSHong Zhang {
23585e2c93fSHong Zhang   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
23685e2c93fSHong Zhang   PetscErrorCode ierr;
23785e2c93fSHong Zhang   PetscScalar    *b,*x;
238efb80c78SLisandro Dalcin   PetscInt       n;
23985e2c93fSHong Zhang   PetscBLASInt   nrhs,info,m=PetscBLASIntCast(A->rmap->n);
240bda8bf91SBarry Smith   PetscBool      flg;
24185e2c93fSHong Zhang 
24285e2c93fSHong Zhang   PetscFunctionBegin;
243bda8bf91SBarry Smith   ierr = PetscTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATMPIDENSE,PETSC_NULL);CHKERRQ(ierr);
244bda8bf91SBarry Smith   if (!flg) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_ARG_WRONG,"Matrix B must be MATDENSE matrix");
245bda8bf91SBarry Smith   ierr = PetscTypeCompareAny((PetscObject)X,&flg,MATSEQDENSE,MATMPIDENSE,PETSC_NULL);CHKERRQ(ierr);
246bda8bf91SBarry Smith   if (!flg) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_ARG_WRONG,"Matrix X must be MATDENSE matrix");
247bda8bf91SBarry Smith 
248efb80c78SLisandro Dalcin   ierr = MatGetSize(B,PETSC_NULL,&n);CHKERRQ(ierr);
249efb80c78SLisandro Dalcin   nrhs = PetscBLASIntCast(n);
25085e2c93fSHong Zhang   ierr = MatGetArray(B,&b);CHKERRQ(ierr);
25185e2c93fSHong Zhang   ierr = MatGetArray(X,&x);CHKERRQ(ierr);
25285e2c93fSHong Zhang 
253f272c775SHong Zhang   ierr = PetscMemcpy(x,b,m*nrhs*sizeof(PetscScalar));CHKERRQ(ierr);
25485e2c93fSHong Zhang 
25585e2c93fSHong Zhang   if (A->factortype == MAT_FACTOR_LU) {
25685e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_GETRS)
25785e2c93fSHong Zhang     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
25885e2c93fSHong Zhang #else
25985e2c93fSHong Zhang     LAPACKgetrs_("N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info);
26085e2c93fSHong Zhang     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
26185e2c93fSHong Zhang #endif
26285e2c93fSHong Zhang   } else if (A->factortype == MAT_FACTOR_CHOLESKY){
26385e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_POTRS)
26485e2c93fSHong Zhang     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
26585e2c93fSHong Zhang #else
26685e2c93fSHong Zhang     LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info);
26785e2c93fSHong Zhang     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
26885e2c93fSHong Zhang #endif
26985e2c93fSHong Zhang   }
27085e2c93fSHong Zhang   else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
27185e2c93fSHong Zhang 
27285e2c93fSHong Zhang   ierr = MatRestoreArray(B,&b);CHKERRQ(ierr);
27385e2c93fSHong Zhang   ierr = MatRestoreArray(X,&x);CHKERRQ(ierr);
27485e2c93fSHong Zhang   ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr);
27585e2c93fSHong Zhang   PetscFunctionReturn(0);
27685e2c93fSHong Zhang }
27785e2c93fSHong Zhang 
27885e2c93fSHong Zhang #undef __FUNCT__
2794a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense"
280dfbe8321SBarry Smith PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy)
281da3a660dSBarry Smith {
282c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
283dfbe8321SBarry Smith   PetscErrorCode ierr;
28487828ca2SBarry Smith   PetscScalar    *x,*y;
285d0f46423SBarry Smith   PetscBLASInt   one = 1,info,m = PetscBLASIntCast(A->rmap->n);
28667e560aaSBarry Smith 
2873a40ed3dSBarry Smith   PetscFunctionBegin;
2881ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
2891ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
290d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
291752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
292da3a660dSBarry Smith   if (mat->pivots) {
293ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
294e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
295ae7cfcebSSatish Balay #else
29671044d3cSBarry Smith     LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info);
297e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve");
298ae7cfcebSSatish Balay #endif
2997a97a34bSBarry Smith   } else {
300ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
301e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
302ae7cfcebSSatish Balay #else
30371044d3cSBarry Smith     LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info);
304e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve");
305ae7cfcebSSatish Balay #endif
306da3a660dSBarry Smith   }
3071ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
3081ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
309dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
3103a40ed3dSBarry Smith   PetscFunctionReturn(0);
311da3a660dSBarry Smith }
3126ee01492SSatish Balay 
3134a2ae208SSatish Balay #undef __FUNCT__
3144a2ae208SSatish Balay #define __FUNCT__ "MatSolveAdd_SeqDense"
315dfbe8321SBarry Smith PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
316da3a660dSBarry Smith {
317c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
318dfbe8321SBarry Smith   PetscErrorCode ierr;
31987828ca2SBarry Smith   PetscScalar    *x,*y,sone = 1.0;
320da3a660dSBarry Smith   Vec            tmp = 0;
321d0f46423SBarry Smith   PetscBLASInt   one = 1,info,m = PetscBLASIntCast(A->rmap->n);
32267e560aaSBarry Smith 
3233a40ed3dSBarry Smith   PetscFunctionBegin;
3241ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
3251ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
326d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
327da3a660dSBarry Smith   if (yy == zz) {
32878b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
32952e6d16bSBarry Smith     ierr = PetscLogObjectParent(A,tmp);CHKERRQ(ierr);
33078b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
331da3a660dSBarry Smith   }
332d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
333752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
334da3a660dSBarry Smith   if (mat->pivots) {
335ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
336e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
337ae7cfcebSSatish Balay #else
33871044d3cSBarry Smith     LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info);
339e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
340ae7cfcebSSatish Balay #endif
341a8c6a408SBarry Smith   } else {
342ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
343e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
344ae7cfcebSSatish Balay #else
34571044d3cSBarry Smith     LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info);
346e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
347ae7cfcebSSatish Balay #endif
348da3a660dSBarry Smith   }
3496bf464f9SBarry Smith   if (tmp) {
3506bf464f9SBarry Smith     ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr);
3516bf464f9SBarry Smith     ierr = VecDestroy(&tmp);CHKERRQ(ierr);
3526bf464f9SBarry Smith   } else {
3536bf464f9SBarry Smith     ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);
3546bf464f9SBarry Smith   }
3551ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
3561ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
357dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
3583a40ed3dSBarry Smith   PetscFunctionReturn(0);
359da3a660dSBarry Smith }
36067e560aaSBarry Smith 
3614a2ae208SSatish Balay #undef __FUNCT__
3624a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense"
363dfbe8321SBarry Smith PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
364da3a660dSBarry Smith {
365c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
3666849ba73SBarry Smith   PetscErrorCode ierr;
36787828ca2SBarry Smith   PetscScalar    *x,*y,sone = 1.0;
368da3a660dSBarry Smith   Vec            tmp;
369d0f46423SBarry Smith   PetscBLASInt   one = 1,info,m = PetscBLASIntCast(A->rmap->n);
37067e560aaSBarry Smith 
3713a40ed3dSBarry Smith   PetscFunctionBegin;
372d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
3731ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
3741ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
375da3a660dSBarry Smith   if (yy == zz) {
37678b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
37752e6d16bSBarry Smith     ierr = PetscLogObjectParent(A,tmp);CHKERRQ(ierr);
37878b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
379da3a660dSBarry Smith   }
380d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
381752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
382da3a660dSBarry Smith   if (mat->pivots) {
383ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
384e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
385ae7cfcebSSatish Balay #else
38671044d3cSBarry Smith     LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info);
387e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
388ae7cfcebSSatish Balay #endif
3893a40ed3dSBarry Smith   } else {
390ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
391e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
392ae7cfcebSSatish Balay #else
39371044d3cSBarry Smith     LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info);
394e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
395ae7cfcebSSatish Balay #endif
396da3a660dSBarry Smith   }
39790f02eecSBarry Smith   if (tmp) {
3982dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr);
3996bf464f9SBarry Smith     ierr = VecDestroy(&tmp);CHKERRQ(ierr);
4003a40ed3dSBarry Smith   } else {
4012dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);
40290f02eecSBarry Smith   }
4031ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
4041ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
405dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
4063a40ed3dSBarry Smith   PetscFunctionReturn(0);
407da3a660dSBarry Smith }
408db4efbfdSBarry Smith 
409db4efbfdSBarry Smith /* ---------------------------------------------------------------*/
410db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots,
411db4efbfdSBarry Smith    rather than put it in the Mat->row slot.*/
412db4efbfdSBarry Smith #undef __FUNCT__
413db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactor_SeqDense"
4140481f469SBarry Smith PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo)
415db4efbfdSBarry Smith {
416db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF)
417db4efbfdSBarry Smith   PetscFunctionBegin;
418e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable.");
419db4efbfdSBarry Smith #else
420db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
421db4efbfdSBarry Smith   PetscErrorCode ierr;
422db4efbfdSBarry Smith   PetscBLASInt   n,m,info;
423db4efbfdSBarry Smith 
424db4efbfdSBarry Smith   PetscFunctionBegin;
425db4efbfdSBarry Smith   n = PetscBLASIntCast(A->cmap->n);
426db4efbfdSBarry Smith   m = PetscBLASIntCast(A->rmap->n);
427db4efbfdSBarry Smith   if (!mat->pivots) {
428db4efbfdSBarry Smith     ierr = PetscMalloc((A->rmap->n+1)*sizeof(PetscBLASInt),&mat->pivots);CHKERRQ(ierr);
429db4efbfdSBarry Smith     ierr = PetscLogObjectMemory(A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr);
430db4efbfdSBarry Smith   }
431db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
432db4efbfdSBarry Smith   LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info);
433e32f2f54SBarry Smith   if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization");
434e32f2f54SBarry Smith   if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization");
435db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
436db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
437db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
438db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
439d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_LU;
440db4efbfdSBarry Smith 
441dc0b31edSSatish Balay   ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr);
442db4efbfdSBarry Smith #endif
443db4efbfdSBarry Smith   PetscFunctionReturn(0);
444db4efbfdSBarry Smith }
445db4efbfdSBarry Smith 
446db4efbfdSBarry Smith #undef __FUNCT__
447db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactor_SeqDense"
4480481f469SBarry Smith PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo)
449db4efbfdSBarry Smith {
450db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF)
451db4efbfdSBarry Smith   PetscFunctionBegin;
452e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable.");
453db4efbfdSBarry Smith #else
454db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
455db4efbfdSBarry Smith   PetscErrorCode ierr;
456db4efbfdSBarry Smith   PetscBLASInt   info,n = PetscBLASIntCast(A->cmap->n);
457db4efbfdSBarry Smith 
458db4efbfdSBarry Smith   PetscFunctionBegin;
459db4efbfdSBarry Smith   ierr = PetscFree(mat->pivots);CHKERRQ(ierr);
460db4efbfdSBarry Smith 
461db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
462db4efbfdSBarry Smith   LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info);
463e32f2f54SBarry Smith   if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1);
464db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
465db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
466db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
467db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
468d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_CHOLESKY;
469dc0b31edSSatish Balay   ierr = PetscLogFlops((A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr);
470db4efbfdSBarry Smith #endif
471db4efbfdSBarry Smith   PetscFunctionReturn(0);
472db4efbfdSBarry Smith }
473db4efbfdSBarry Smith 
474db4efbfdSBarry Smith 
475db4efbfdSBarry Smith #undef __FUNCT__
476db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense"
4770481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
478db4efbfdSBarry Smith {
479db4efbfdSBarry Smith   PetscErrorCode ierr;
480db4efbfdSBarry Smith   MatFactorInfo  info;
481db4efbfdSBarry Smith 
482db4efbfdSBarry Smith   PetscFunctionBegin;
483db4efbfdSBarry Smith   info.fill = 1.0;
484c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
485719d5645SBarry Smith   ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr);
486db4efbfdSBarry Smith   PetscFunctionReturn(0);
487db4efbfdSBarry Smith }
488db4efbfdSBarry Smith 
489db4efbfdSBarry Smith #undef __FUNCT__
490db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense"
4910481f469SBarry Smith PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info)
492db4efbfdSBarry Smith {
493db4efbfdSBarry Smith   PetscFunctionBegin;
494c3ef05f6SHong Zhang   fact->assembled                  = PETSC_TRUE;
495719d5645SBarry Smith   fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense;
496db4efbfdSBarry Smith   PetscFunctionReturn(0);
497db4efbfdSBarry Smith }
498db4efbfdSBarry Smith 
499db4efbfdSBarry Smith #undef __FUNCT__
500db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactorSymbolic_SeqDense"
5010481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info)
502db4efbfdSBarry Smith {
503db4efbfdSBarry Smith   PetscFunctionBegin;
504*b66fe19dSMatthew G Knepley   fact->preallocated         = PETSC_TRUE;
505c3ef05f6SHong Zhang   fact->assembled            = PETSC_TRUE;
506719d5645SBarry Smith   fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense;
507db4efbfdSBarry Smith   PetscFunctionReturn(0);
508db4efbfdSBarry Smith }
509db4efbfdSBarry Smith 
510bb5747d9SMatthew Knepley EXTERN_C_BEGIN
511db4efbfdSBarry Smith #undef __FUNCT__
512db4efbfdSBarry Smith #define __FUNCT__ "MatGetFactor_seqdense_petsc"
513db4efbfdSBarry Smith PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact)
514db4efbfdSBarry Smith {
515db4efbfdSBarry Smith   PetscErrorCode ierr;
516db4efbfdSBarry Smith 
517db4efbfdSBarry Smith   PetscFunctionBegin;
518db4efbfdSBarry Smith   ierr = MatCreate(((PetscObject)A)->comm,fact);CHKERRQ(ierr);
519db4efbfdSBarry Smith   ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
520db4efbfdSBarry Smith   ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr);
521db4efbfdSBarry Smith   if (ftype == MAT_FACTOR_LU){
522db4efbfdSBarry Smith     (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense;
523db4efbfdSBarry Smith   } else {
524db4efbfdSBarry Smith     (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense;
525db4efbfdSBarry Smith   }
526d5f3da31SBarry Smith   (*fact)->factortype = ftype;
527db4efbfdSBarry Smith   PetscFunctionReturn(0);
528db4efbfdSBarry Smith }
529bb5747d9SMatthew Knepley EXTERN_C_END
530db4efbfdSBarry Smith 
531289bc588SBarry Smith /* ------------------------------------------------------------------*/
5324a2ae208SSatish Balay #undef __FUNCT__
53341f059aeSBarry Smith #define __FUNCT__ "MatSOR_SeqDense"
53441f059aeSBarry Smith PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx)
535289bc588SBarry Smith {
536c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
53787828ca2SBarry Smith   PetscScalar    *x,*b,*v = mat->v,zero = 0.0,xt;
538dfbe8321SBarry Smith   PetscErrorCode ierr;
539d0f46423SBarry Smith   PetscInt       m = A->rmap->n,i;
5400805154bSBarry Smith   PetscBLASInt   o = 1,bm = PetscBLASIntCast(m);
541289bc588SBarry Smith 
5423a40ed3dSBarry Smith   PetscFunctionBegin;
543289bc588SBarry Smith   if (flag & SOR_ZERO_INITIAL_GUESS) {
54471044d3cSBarry Smith     /* this is a hack fix, should have another version without the second BLASdot */
5452dcb1b2aSMatthew Knepley     ierr = VecSet(xx,zero);CHKERRQ(ierr);
546289bc588SBarry Smith   }
5471ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
5481ebc52fbSHong Zhang   ierr = VecGetArray(bb,&b);CHKERRQ(ierr);
549b965ef7fSBarry Smith   its  = its*lits;
550e32f2f54SBarry 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);
551289bc588SBarry Smith   while (its--) {
552fccaa45eSBarry Smith     if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP){
553289bc588SBarry Smith       for (i=0; i<m; i++) {
55471044d3cSBarry Smith         xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o);
55555a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
556289bc588SBarry Smith       }
557289bc588SBarry Smith     }
558fccaa45eSBarry Smith     if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP){
559289bc588SBarry Smith       for (i=m-1; i>=0; i--) {
56071044d3cSBarry Smith         xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o);
56155a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
562289bc588SBarry Smith       }
563289bc588SBarry Smith     }
564289bc588SBarry Smith   }
5651ebc52fbSHong Zhang   ierr = VecRestoreArray(bb,&b);CHKERRQ(ierr);
5661ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
5673a40ed3dSBarry Smith   PetscFunctionReturn(0);
568289bc588SBarry Smith }
569289bc588SBarry Smith 
570289bc588SBarry Smith /* -----------------------------------------------------------------*/
5714a2ae208SSatish Balay #undef __FUNCT__
5724a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense"
573dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy)
574289bc588SBarry Smith {
575c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
57687828ca2SBarry Smith   PetscScalar    *v = mat->v,*x,*y;
577dfbe8321SBarry Smith   PetscErrorCode ierr;
5780805154bSBarry Smith   PetscBLASInt   m, n,_One=1;
579ea709b57SSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
5803a40ed3dSBarry Smith 
5813a40ed3dSBarry Smith   PetscFunctionBegin;
582d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
583d0f46423SBarry Smith   n = PetscBLASIntCast(A->cmap->n);
584d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
5851ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
5861ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
58771044d3cSBarry Smith   BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One);
5881ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
5891ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
590dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
5913a40ed3dSBarry Smith   PetscFunctionReturn(0);
592289bc588SBarry Smith }
593800995b7SMatthew Knepley 
5944a2ae208SSatish Balay #undef __FUNCT__
5954a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense"
596dfbe8321SBarry Smith PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy)
597289bc588SBarry Smith {
598c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
59987828ca2SBarry Smith   PetscScalar    *v = mat->v,*x,*y,_DOne=1.0,_DZero=0.0;
600dfbe8321SBarry Smith   PetscErrorCode ierr;
6010805154bSBarry Smith   PetscBLASInt   m, n, _One=1;
6023a40ed3dSBarry Smith 
6033a40ed3dSBarry Smith   PetscFunctionBegin;
604d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
605d0f46423SBarry Smith   n = PetscBLASIntCast(A->cmap->n);
606d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
6071ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
6081ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
60971044d3cSBarry Smith   BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One);
6101ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6111ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
612dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr);
6133a40ed3dSBarry Smith   PetscFunctionReturn(0);
614289bc588SBarry Smith }
6156ee01492SSatish Balay 
6164a2ae208SSatish Balay #undef __FUNCT__
6174a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense"
618dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
619289bc588SBarry Smith {
620c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
62187828ca2SBarry Smith   PetscScalar    *v = mat->v,*x,*y,_DOne=1.0;
622dfbe8321SBarry Smith   PetscErrorCode ierr;
6230805154bSBarry Smith   PetscBLASInt   m, n, _One=1;
6243a40ed3dSBarry Smith 
6253a40ed3dSBarry Smith   PetscFunctionBegin;
626d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
627d0f46423SBarry Smith   n = PetscBLASIntCast(A->cmap->n);
628d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
629600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
6301ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
6311ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
63271044d3cSBarry Smith   BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One);
6331ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6341ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
635dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
6363a40ed3dSBarry Smith   PetscFunctionReturn(0);
637289bc588SBarry Smith }
6386ee01492SSatish Balay 
6394a2ae208SSatish Balay #undef __FUNCT__
6404a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense"
641dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
642289bc588SBarry Smith {
643c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
64487828ca2SBarry Smith   PetscScalar    *v = mat->v,*x,*y;
645dfbe8321SBarry Smith   PetscErrorCode ierr;
6460805154bSBarry Smith   PetscBLASInt   m, n, _One=1;
64787828ca2SBarry Smith   PetscScalar    _DOne=1.0;
6483a40ed3dSBarry Smith 
6493a40ed3dSBarry Smith   PetscFunctionBegin;
650d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
651d0f46423SBarry Smith   n = PetscBLASIntCast(A->cmap->n);
652d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
653600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
6541ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
6551ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
65671044d3cSBarry Smith   BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One);
6571ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6581ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
659dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
6603a40ed3dSBarry Smith   PetscFunctionReturn(0);
661289bc588SBarry Smith }
662289bc588SBarry Smith 
663289bc588SBarry Smith /* -----------------------------------------------------------------*/
6644a2ae208SSatish Balay #undef __FUNCT__
6654a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense"
66613f74950SBarry Smith PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
667289bc588SBarry Smith {
668c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
66987828ca2SBarry Smith   PetscScalar    *v;
6706849ba73SBarry Smith   PetscErrorCode ierr;
67113f74950SBarry Smith   PetscInt       i;
67267e560aaSBarry Smith 
6733a40ed3dSBarry Smith   PetscFunctionBegin;
674d0f46423SBarry Smith   *ncols = A->cmap->n;
675289bc588SBarry Smith   if (cols) {
676d0f46423SBarry Smith     ierr = PetscMalloc((A->cmap->n+1)*sizeof(PetscInt),cols);CHKERRQ(ierr);
677d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) (*cols)[i] = i;
678289bc588SBarry Smith   }
679289bc588SBarry Smith   if (vals) {
680d0f46423SBarry Smith     ierr = PetscMalloc((A->cmap->n+1)*sizeof(PetscScalar),vals);CHKERRQ(ierr);
681289bc588SBarry Smith     v    = mat->v + row;
682d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;}
683289bc588SBarry Smith   }
6843a40ed3dSBarry Smith   PetscFunctionReturn(0);
685289bc588SBarry Smith }
6866ee01492SSatish Balay 
6874a2ae208SSatish Balay #undef __FUNCT__
6884a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense"
68913f74950SBarry Smith PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
690289bc588SBarry Smith {
691dfbe8321SBarry Smith   PetscErrorCode ierr;
692606d414cSSatish Balay   PetscFunctionBegin;
693606d414cSSatish Balay   if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);}
694606d414cSSatish Balay   if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); }
6953a40ed3dSBarry Smith   PetscFunctionReturn(0);
696289bc588SBarry Smith }
697289bc588SBarry Smith /* ----------------------------------------------------------------*/
6984a2ae208SSatish Balay #undef __FUNCT__
6994a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense"
70013f74950SBarry Smith PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv)
701289bc588SBarry Smith {
702c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
70313f74950SBarry Smith   PetscInt     i,j,idx=0;
704d6dfbf8fSBarry Smith 
7053a40ed3dSBarry Smith   PetscFunctionBegin;
70671fd2e92SBarry Smith   if (v) PetscValidScalarPointer(v,6);
707289bc588SBarry Smith   if (!mat->roworiented) {
708dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
709289bc588SBarry Smith       for (j=0; j<n; j++) {
710cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
7112515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
712e32f2f54SBarry 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);
71358804f6dSBarry Smith #endif
714289bc588SBarry Smith         for (i=0; i<m; i++) {
715cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
7162515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
717e32f2f54SBarry 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);
71858804f6dSBarry Smith #endif
719cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
720289bc588SBarry Smith         }
721289bc588SBarry Smith       }
7223a40ed3dSBarry Smith     } else {
723289bc588SBarry Smith       for (j=0; j<n; j++) {
724cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
7252515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
726e32f2f54SBarry Smith         if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1);
72758804f6dSBarry Smith #endif
728289bc588SBarry Smith         for (i=0; i<m; i++) {
729cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
7302515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
731e32f2f54SBarry Smith           if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
73258804f6dSBarry Smith #endif
733cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
734289bc588SBarry Smith         }
735289bc588SBarry Smith       }
736289bc588SBarry Smith     }
7373a40ed3dSBarry Smith   } else {
738dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
739e8d4e0b9SBarry Smith       for (i=0; i<m; i++) {
740cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
7412515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
742e32f2f54SBarry 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);
74358804f6dSBarry Smith #endif
744e8d4e0b9SBarry Smith         for (j=0; j<n; j++) {
745cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
7462515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
747e32f2f54SBarry 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);
74858804f6dSBarry Smith #endif
749cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
750e8d4e0b9SBarry Smith         }
751e8d4e0b9SBarry Smith       }
7523a40ed3dSBarry Smith     } else {
753289bc588SBarry Smith       for (i=0; i<m; i++) {
754cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
7552515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
756e32f2f54SBarry Smith         if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
75758804f6dSBarry Smith #endif
758289bc588SBarry Smith         for (j=0; j<n; j++) {
759cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
7602515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
761e32f2f54SBarry Smith           if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1);
76258804f6dSBarry Smith #endif
763cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
764289bc588SBarry Smith         }
765289bc588SBarry Smith       }
766289bc588SBarry Smith     }
767e8d4e0b9SBarry Smith   }
7683a40ed3dSBarry Smith   PetscFunctionReturn(0);
769289bc588SBarry Smith }
770e8d4e0b9SBarry Smith 
7714a2ae208SSatish Balay #undef __FUNCT__
7724a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense"
77313f74950SBarry Smith PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[])
774ae80bb75SLois Curfman McInnes {
775ae80bb75SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
77613f74950SBarry Smith   PetscInt     i,j;
777ae80bb75SLois Curfman McInnes 
7783a40ed3dSBarry Smith   PetscFunctionBegin;
779ae80bb75SLois Curfman McInnes   /* row-oriented output */
780ae80bb75SLois Curfman McInnes   for (i=0; i<m; i++) {
78197e567efSBarry Smith     if (indexm[i] < 0) {v += n;continue;}
782e32f2f54SBarry 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);
783ae80bb75SLois Curfman McInnes     for (j=0; j<n; j++) {
7846f31f424SBarry Smith       if (indexn[j] < 0) {v++; continue;}
785e32f2f54SBarry 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);
78697e567efSBarry Smith       *v++ = mat->v[indexn[j]*mat->lda + indexm[i]];
787ae80bb75SLois Curfman McInnes     }
788ae80bb75SLois Curfman McInnes   }
7893a40ed3dSBarry Smith   PetscFunctionReturn(0);
790ae80bb75SLois Curfman McInnes }
791ae80bb75SLois Curfman McInnes 
792289bc588SBarry Smith /* -----------------------------------------------------------------*/
793289bc588SBarry Smith 
7944a2ae208SSatish Balay #undef __FUNCT__
7955bba2384SShri Abhyankar #define __FUNCT__ "MatLoad_SeqDense"
796112444f4SShri Abhyankar PetscErrorCode MatLoad_SeqDense(Mat newmat,PetscViewer viewer)
797aabbc4fbSShri Abhyankar {
798aabbc4fbSShri Abhyankar   Mat_SeqDense   *a;
799aabbc4fbSShri Abhyankar   PetscErrorCode ierr;
800aabbc4fbSShri Abhyankar   PetscInt       *scols,i,j,nz,header[4];
801aabbc4fbSShri Abhyankar   int            fd;
802aabbc4fbSShri Abhyankar   PetscMPIInt    size;
803aabbc4fbSShri Abhyankar   PetscInt       *rowlengths = 0,M,N,*cols,grows,gcols;
804aabbc4fbSShri Abhyankar   PetscScalar    *vals,*svals,*v,*w;
805aabbc4fbSShri Abhyankar   MPI_Comm       comm = ((PetscObject)viewer)->comm;
806aabbc4fbSShri Abhyankar 
807aabbc4fbSShri Abhyankar   PetscFunctionBegin;
808aabbc4fbSShri Abhyankar   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
809aabbc4fbSShri Abhyankar   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor");
810aabbc4fbSShri Abhyankar   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
811aabbc4fbSShri Abhyankar   ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr);
812aabbc4fbSShri Abhyankar   if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object");
813aabbc4fbSShri Abhyankar   M = header[1]; N = header[2]; nz = header[3];
814aabbc4fbSShri Abhyankar 
815aabbc4fbSShri Abhyankar   /* set global size if not set already*/
816aabbc4fbSShri Abhyankar   if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) {
817aabbc4fbSShri Abhyankar     ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr);
818aabbc4fbSShri Abhyankar   } else {
819aabbc4fbSShri Abhyankar     /* if sizes and type are already set, check if the vector global sizes are correct */
820aabbc4fbSShri Abhyankar     ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr);
821aabbc4fbSShri 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);
822aabbc4fbSShri Abhyankar   }
823aabbc4fbSShri Abhyankar   ierr = MatSeqDenseSetPreallocation(newmat,PETSC_NULL);CHKERRQ(ierr);
824aabbc4fbSShri Abhyankar 
825aabbc4fbSShri Abhyankar   if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */
826aabbc4fbSShri Abhyankar     a    = (Mat_SeqDense*)newmat->data;
827aabbc4fbSShri Abhyankar     v    = a->v;
828aabbc4fbSShri Abhyankar     /* Allocate some temp space to read in the values and then flip them
829aabbc4fbSShri Abhyankar        from row major to column major */
830aabbc4fbSShri Abhyankar     ierr = PetscMalloc((M*N > 0 ? M*N : 1)*sizeof(PetscScalar),&w);CHKERRQ(ierr);
831aabbc4fbSShri Abhyankar     /* read in nonzero values */
832aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr);
833aabbc4fbSShri Abhyankar     /* now flip the values and store them in the matrix*/
834aabbc4fbSShri Abhyankar     for (j=0; j<N; j++) {
835aabbc4fbSShri Abhyankar       for (i=0; i<M; i++) {
836aabbc4fbSShri Abhyankar         *v++ =w[i*N+j];
837aabbc4fbSShri Abhyankar       }
838aabbc4fbSShri Abhyankar     }
839aabbc4fbSShri Abhyankar     ierr = PetscFree(w);CHKERRQ(ierr);
840aabbc4fbSShri Abhyankar   } else {
841aabbc4fbSShri Abhyankar     /* read row lengths */
842aabbc4fbSShri Abhyankar     ierr = PetscMalloc((M+1)*sizeof(PetscInt),&rowlengths);CHKERRQ(ierr);
843aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr);
844aabbc4fbSShri Abhyankar 
845aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
846aabbc4fbSShri Abhyankar     v = a->v;
847aabbc4fbSShri Abhyankar 
848aabbc4fbSShri Abhyankar     /* read column indices and nonzeros */
849aabbc4fbSShri Abhyankar     ierr = PetscMalloc((nz+1)*sizeof(PetscInt),&scols);CHKERRQ(ierr);
850aabbc4fbSShri Abhyankar     cols = scols;
851aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr);
852aabbc4fbSShri Abhyankar     ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&svals);CHKERRQ(ierr);
853aabbc4fbSShri Abhyankar     vals = svals;
854aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr);
855aabbc4fbSShri Abhyankar 
856aabbc4fbSShri Abhyankar     /* insert into matrix */
857aabbc4fbSShri Abhyankar     for (i=0; i<M; i++) {
858aabbc4fbSShri Abhyankar       for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j];
859aabbc4fbSShri Abhyankar       svals += rowlengths[i]; scols += rowlengths[i];
860aabbc4fbSShri Abhyankar     }
861aabbc4fbSShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
862aabbc4fbSShri Abhyankar     ierr = PetscFree(cols);CHKERRQ(ierr);
863aabbc4fbSShri Abhyankar     ierr = PetscFree(rowlengths);CHKERRQ(ierr);
864aabbc4fbSShri Abhyankar   }
865aabbc4fbSShri Abhyankar   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
866aabbc4fbSShri Abhyankar   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
867aabbc4fbSShri Abhyankar 
868aabbc4fbSShri Abhyankar   PetscFunctionReturn(0);
869aabbc4fbSShri Abhyankar }
870aabbc4fbSShri Abhyankar 
871aabbc4fbSShri Abhyankar #undef __FUNCT__
8724a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII"
8736849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer)
874289bc588SBarry Smith {
875932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
876dfbe8321SBarry Smith   PetscErrorCode    ierr;
87713f74950SBarry Smith   PetscInt          i,j;
8782dcb1b2aSMatthew Knepley   const char        *name;
87987828ca2SBarry Smith   PetscScalar       *v;
880f3ef73ceSBarry Smith   PetscViewerFormat format;
8815f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX)
882ace3abfcSBarry Smith   PetscBool         allreal = PETSC_TRUE;
8835f481a85SSatish Balay #endif
884932b0c3eSLois Curfman McInnes 
8853a40ed3dSBarry Smith   PetscFunctionBegin;
886b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
887456192e2SBarry Smith   if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
8883a40ed3dSBarry Smith     PetscFunctionReturn(0);  /* do nothing for now */
889fb9695e5SSatish Balay   } else if (format == PETSC_VIEWER_ASCII_COMMON) {
890d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
8917566de4bSShri Abhyankar     ierr = PetscObjectPrintClassNamePrefixType((PetscObject)A,viewer,"Matrix Object");CHKERRQ(ierr);
892d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
89344cd7ae7SLois Curfman McInnes       v = a->v + i;
89477431f27SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr);
895d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
896aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
897329f5518SBarry Smith         if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) {
898a83599f4SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %G + %G i) ",j,PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr);
899329f5518SBarry Smith         } else if (PetscRealPart(*v)) {
900a83599f4SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,PetscRealPart(*v));CHKERRQ(ierr);
9016831982aSBarry Smith         }
90280cd9d93SLois Curfman McInnes #else
9036831982aSBarry Smith         if (*v) {
904a83599f4SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,*v);CHKERRQ(ierr);
9056831982aSBarry Smith         }
90680cd9d93SLois Curfman McInnes #endif
9071b807ce4Svictorle         v += a->lda;
90880cd9d93SLois Curfman McInnes       }
909b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
91080cd9d93SLois Curfman McInnes     }
911d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
9123a40ed3dSBarry Smith   } else {
913d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
914aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
91547989497SBarry Smith     /* determine if matrix has all real values */
91647989497SBarry Smith     v = a->v;
917d0f46423SBarry Smith     for (i=0; i<A->rmap->n*A->cmap->n; i++) {
918ffac6cdbSBarry Smith 	if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break ;}
91947989497SBarry Smith     }
92047989497SBarry Smith #endif
921fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
9223a7fca6bSBarry Smith       ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr);
923d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr);
924d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
925fb9695e5SSatish Balay       ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr);
9267566de4bSShri Abhyankar     } else {
9277566de4bSShri Abhyankar       ierr = PetscObjectPrintClassNamePrefixType((PetscObject)A,viewer,"Matrix Object");CHKERRQ(ierr);
928ffac6cdbSBarry Smith     }
929ffac6cdbSBarry Smith 
930d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
931932b0c3eSLois Curfman McInnes       v = a->v + i;
932d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
933aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
93447989497SBarry Smith         if (allreal) {
935f32d5d43SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",PetscRealPart(*v));CHKERRQ(ierr);
93647989497SBarry Smith         } else {
937f32d5d43SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr);
93847989497SBarry Smith         }
939289bc588SBarry Smith #else
940f32d5d43SBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",*v);CHKERRQ(ierr);
941289bc588SBarry Smith #endif
9421b807ce4Svictorle 	v += a->lda;
943289bc588SBarry Smith       }
944b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
945289bc588SBarry Smith     }
946fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
947b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr);
948ffac6cdbSBarry Smith     }
949d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
950da3a660dSBarry Smith   }
951b0a32e0cSBarry Smith   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
9523a40ed3dSBarry Smith   PetscFunctionReturn(0);
953289bc588SBarry Smith }
954289bc588SBarry Smith 
9554a2ae208SSatish Balay #undef __FUNCT__
9564a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary"
9576849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer)
958932b0c3eSLois Curfman McInnes {
959932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
9606849ba73SBarry Smith   PetscErrorCode    ierr;
96113f74950SBarry Smith   int               fd;
962d0f46423SBarry Smith   PetscInt          ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n;
963f4403165SShri Abhyankar   PetscScalar       *v,*anonz,*vals;
964f4403165SShri Abhyankar   PetscViewerFormat format;
965932b0c3eSLois Curfman McInnes 
9663a40ed3dSBarry Smith   PetscFunctionBegin;
967b0a32e0cSBarry Smith   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
96890ace30eSBarry Smith 
969f4403165SShri Abhyankar   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
970f4403165SShri Abhyankar   if (format == PETSC_VIEWER_NATIVE) {
971f4403165SShri Abhyankar     /* store the matrix as a dense matrix */
972f4403165SShri Abhyankar     ierr = PetscMalloc(4*sizeof(PetscInt),&col_lens);CHKERRQ(ierr);
973f4403165SShri Abhyankar     col_lens[0] = MAT_FILE_CLASSID;
974f4403165SShri Abhyankar     col_lens[1] = m;
975f4403165SShri Abhyankar     col_lens[2] = n;
976f4403165SShri Abhyankar     col_lens[3] = MATRIX_BINARY_FORMAT_DENSE;
977f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
978f4403165SShri Abhyankar     ierr = PetscFree(col_lens);CHKERRQ(ierr);
979f4403165SShri Abhyankar 
980f4403165SShri Abhyankar     /* write out matrix, by rows */
981f4403165SShri Abhyankar     ierr = PetscMalloc((m*n+1)*sizeof(PetscScalar),&vals);CHKERRQ(ierr);
982f4403165SShri Abhyankar     v    = a->v;
983f4403165SShri Abhyankar     for (j=0; j<n; j++) {
984f4403165SShri Abhyankar       for (i=0; i<m; i++) {
985f4403165SShri Abhyankar         vals[j + i*n] = *v++;
986f4403165SShri Abhyankar       }
987f4403165SShri Abhyankar     }
988f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
989f4403165SShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
990f4403165SShri Abhyankar   } else {
99113f74950SBarry Smith     ierr = PetscMalloc((4+nz)*sizeof(PetscInt),&col_lens);CHKERRQ(ierr);
9920700a824SBarry Smith     col_lens[0] = MAT_FILE_CLASSID;
993932b0c3eSLois Curfman McInnes     col_lens[1] = m;
994932b0c3eSLois Curfman McInnes     col_lens[2] = n;
995932b0c3eSLois Curfman McInnes     col_lens[3] = nz;
996932b0c3eSLois Curfman McInnes 
997932b0c3eSLois Curfman McInnes     /* store lengths of each row and write (including header) to file */
998932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) col_lens[4+i] = n;
9996f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
1000932b0c3eSLois Curfman McInnes 
1001932b0c3eSLois Curfman McInnes     /* Possibly should write in smaller increments, not whole matrix at once? */
1002932b0c3eSLois Curfman McInnes     /* store column indices (zero start index) */
1003932b0c3eSLois Curfman McInnes     ict = 0;
1004932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1005932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) col_lens[ict++] = j;
1006932b0c3eSLois Curfman McInnes     }
10076f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
1008606d414cSSatish Balay     ierr = PetscFree(col_lens);CHKERRQ(ierr);
1009932b0c3eSLois Curfman McInnes 
1010932b0c3eSLois Curfman McInnes     /* store nonzero values */
101187828ca2SBarry Smith     ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&anonz);CHKERRQ(ierr);
1012932b0c3eSLois Curfman McInnes     ict  = 0;
1013932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1014932b0c3eSLois Curfman McInnes       v = a->v + i;
1015932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) {
10161b807ce4Svictorle         anonz[ict++] = *v; v += a->lda;
1017932b0c3eSLois Curfman McInnes       }
1018932b0c3eSLois Curfman McInnes     }
10196f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
1020606d414cSSatish Balay     ierr = PetscFree(anonz);CHKERRQ(ierr);
1021f4403165SShri Abhyankar   }
10223a40ed3dSBarry Smith   PetscFunctionReturn(0);
1023932b0c3eSLois Curfman McInnes }
1024932b0c3eSLois Curfman McInnes 
10254a2ae208SSatish Balay #undef __FUNCT__
10264a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom"
1027dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa)
1028f1af5d2fSBarry Smith {
1029f1af5d2fSBarry Smith   Mat               A = (Mat) Aa;
1030f1af5d2fSBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
10316849ba73SBarry Smith   PetscErrorCode    ierr;
1032d0f46423SBarry Smith   PetscInt          m = A->rmap->n,n = A->cmap->n,color,i,j;
103387828ca2SBarry Smith   PetscScalar       *v = a->v;
1034b0a32e0cSBarry Smith   PetscViewer       viewer;
1035b0a32e0cSBarry Smith   PetscDraw         popup;
1036329f5518SBarry Smith   PetscReal         xl,yl,xr,yr,x_l,x_r,y_l,y_r,scale,maxv = 0.0;
1037f3ef73ceSBarry Smith   PetscViewerFormat format;
1038f1af5d2fSBarry Smith 
1039f1af5d2fSBarry Smith   PetscFunctionBegin;
1040f1af5d2fSBarry Smith 
1041f1af5d2fSBarry Smith   ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr);
1042b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1043b0a32e0cSBarry Smith   ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr);
1044f1af5d2fSBarry Smith 
1045f1af5d2fSBarry Smith   /* Loop over matrix elements drawing boxes */
1046fb9695e5SSatish Balay   if (format != PETSC_VIEWER_DRAW_CONTOUR) {
1047f1af5d2fSBarry Smith     /* Blue for negative and Red for positive */
1048b0a32e0cSBarry Smith     color = PETSC_DRAW_BLUE;
1049f1af5d2fSBarry Smith     for(j = 0; j < n; j++) {
1050f1af5d2fSBarry Smith       x_l = j;
1051f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1052f1af5d2fSBarry Smith       for(i = 0; i < m; i++) {
1053f1af5d2fSBarry Smith         y_l = m - i - 1.0;
1054f1af5d2fSBarry Smith         y_r = y_l + 1.0;
1055f1af5d2fSBarry Smith #if defined(PETSC_USE_COMPLEX)
1056329f5518SBarry Smith         if (PetscRealPart(v[j*m+i]) >  0.) {
1057b0a32e0cSBarry Smith           color = PETSC_DRAW_RED;
1058329f5518SBarry Smith         } else if (PetscRealPart(v[j*m+i]) <  0.) {
1059b0a32e0cSBarry Smith           color = PETSC_DRAW_BLUE;
1060f1af5d2fSBarry Smith         } else {
1061f1af5d2fSBarry Smith           continue;
1062f1af5d2fSBarry Smith         }
1063f1af5d2fSBarry Smith #else
1064f1af5d2fSBarry Smith         if (v[j*m+i] >  0.) {
1065b0a32e0cSBarry Smith           color = PETSC_DRAW_RED;
1066f1af5d2fSBarry Smith         } else if (v[j*m+i] <  0.) {
1067b0a32e0cSBarry Smith           color = PETSC_DRAW_BLUE;
1068f1af5d2fSBarry Smith         } else {
1069f1af5d2fSBarry Smith           continue;
1070f1af5d2fSBarry Smith         }
1071f1af5d2fSBarry Smith #endif
1072b0a32e0cSBarry Smith         ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1073f1af5d2fSBarry Smith       }
1074f1af5d2fSBarry Smith     }
1075f1af5d2fSBarry Smith   } else {
1076f1af5d2fSBarry Smith     /* use contour shading to indicate magnitude of values */
1077f1af5d2fSBarry Smith     /* first determine max of all nonzero values */
1078f1af5d2fSBarry Smith     for(i = 0; i < m*n; i++) {
1079f1af5d2fSBarry Smith       if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]);
1080f1af5d2fSBarry Smith     }
1081b0a32e0cSBarry Smith     scale = (245.0 - PETSC_DRAW_BASIC_COLORS)/maxv;
1082b0a32e0cSBarry Smith     ierr  = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr);
1083b0a32e0cSBarry Smith     if (popup) {ierr  = PetscDrawScalePopup(popup,0.0,maxv);CHKERRQ(ierr);}
1084f1af5d2fSBarry Smith     for(j = 0; j < n; j++) {
1085f1af5d2fSBarry Smith       x_l = j;
1086f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1087f1af5d2fSBarry Smith       for(i = 0; i < m; i++) {
1088f1af5d2fSBarry Smith         y_l   = m - i - 1.0;
1089f1af5d2fSBarry Smith         y_r   = y_l + 1.0;
1090b0a32e0cSBarry Smith         color = PETSC_DRAW_BASIC_COLORS + (int)(scale*PetscAbsScalar(v[j*m+i]));
1091b0a32e0cSBarry Smith         ierr  = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1092f1af5d2fSBarry Smith       }
1093f1af5d2fSBarry Smith     }
1094f1af5d2fSBarry Smith   }
1095f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1096f1af5d2fSBarry Smith }
1097f1af5d2fSBarry Smith 
10984a2ae208SSatish Balay #undef __FUNCT__
10994a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw"
1100dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer)
1101f1af5d2fSBarry Smith {
1102b0a32e0cSBarry Smith   PetscDraw      draw;
1103ace3abfcSBarry Smith   PetscBool      isnull;
1104329f5518SBarry Smith   PetscReal      xr,yr,xl,yl,h,w;
1105dfbe8321SBarry Smith   PetscErrorCode ierr;
1106f1af5d2fSBarry Smith 
1107f1af5d2fSBarry Smith   PetscFunctionBegin;
1108b0a32e0cSBarry Smith   ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
1109b0a32e0cSBarry Smith   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
1110abc0a331SBarry Smith   if (isnull) PetscFunctionReturn(0);
1111f1af5d2fSBarry Smith 
1112f1af5d2fSBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr);
1113d0f46423SBarry Smith   xr  = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0;
1114f1af5d2fSBarry Smith   xr += w;    yr += h;  xl = -w;     yl = -h;
1115b0a32e0cSBarry Smith   ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr);
1116b0a32e0cSBarry Smith   ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr);
1117f1af5d2fSBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",PETSC_NULL);CHKERRQ(ierr);
1118f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1119f1af5d2fSBarry Smith }
1120f1af5d2fSBarry Smith 
11214a2ae208SSatish Balay #undef __FUNCT__
11224a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense"
1123dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer)
1124932b0c3eSLois Curfman McInnes {
1125dfbe8321SBarry Smith   PetscErrorCode ierr;
1126ace3abfcSBarry Smith   PetscBool      iascii,isbinary,isdraw;
1127932b0c3eSLois Curfman McInnes 
11283a40ed3dSBarry Smith   PetscFunctionBegin;
11292692d6eeSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
11302692d6eeSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
11312692d6eeSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
11320f5bd95cSBarry Smith 
1133c45a1595SBarry Smith   if (iascii) {
1134c45a1595SBarry Smith     ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr);
11350f5bd95cSBarry Smith   } else if (isbinary) {
11363a40ed3dSBarry Smith     ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr);
1137f1af5d2fSBarry Smith   } else if (isdraw) {
1138f1af5d2fSBarry Smith     ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr);
11395cd90555SBarry Smith   } else {
1140e32f2f54SBarry Smith     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Viewer type %s not supported by dense matrix",((PetscObject)viewer)->type_name);
1141932b0c3eSLois Curfman McInnes   }
11423a40ed3dSBarry Smith   PetscFunctionReturn(0);
1143932b0c3eSLois Curfman McInnes }
1144289bc588SBarry Smith 
11454a2ae208SSatish Balay #undef __FUNCT__
11464a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense"
1147dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqDense(Mat mat)
1148289bc588SBarry Smith {
1149ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)mat->data;
1150dfbe8321SBarry Smith   PetscErrorCode ierr;
115190f02eecSBarry Smith 
11523a40ed3dSBarry Smith   PetscFunctionBegin;
1153aa482453SBarry Smith #if defined(PETSC_USE_LOG)
1154d0f46423SBarry Smith   PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n);
1155a5a9c739SBarry Smith #endif
115605b42c5fSBarry Smith   ierr = PetscFree(l->pivots);CHKERRQ(ierr);
11576857c123SSatish Balay   if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);}
1158bf0cc555SLisandro Dalcin   ierr = PetscFree(mat->data);CHKERRQ(ierr);
1159dbd8c25aSHong Zhang 
1160dbd8c25aSHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr);
1161901853e0SKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatSeqDenseSetPreallocation_C","",PETSC_NULL);CHKERRQ(ierr);
11624ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMult_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr);
11634ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr);
11644ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr);
11653a40ed3dSBarry Smith   PetscFunctionReturn(0);
1166289bc588SBarry Smith }
1167289bc588SBarry Smith 
11684a2ae208SSatish Balay #undef __FUNCT__
11694a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense"
1170fc4dec0aSBarry Smith PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout)
1171289bc588SBarry Smith {
1172c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
11736849ba73SBarry Smith   PetscErrorCode ierr;
117413f74950SBarry Smith   PetscInt       k,j,m,n,M;
117587828ca2SBarry Smith   PetscScalar    *v,tmp;
117648b35521SBarry Smith 
11773a40ed3dSBarry Smith   PetscFunctionBegin;
1178d0f46423SBarry Smith   v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n;
1179e9695a30SBarry Smith   if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */
1180e7e72b3dSBarry Smith     if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place");
1181e7e72b3dSBarry Smith     else {
1182d3e5ee88SLois Curfman McInnes       for (j=0; j<m; j++) {
1183289bc588SBarry Smith         for (k=0; k<j; k++) {
11841b807ce4Svictorle           tmp = v[j + k*M];
11851b807ce4Svictorle           v[j + k*M] = v[k + j*M];
11861b807ce4Svictorle           v[k + j*M] = tmp;
1187289bc588SBarry Smith         }
1188289bc588SBarry Smith       }
1189d64ed03dSBarry Smith     }
11903a40ed3dSBarry Smith   } else { /* out-of-place transpose */
1191d3e5ee88SLois Curfman McInnes     Mat          tmat;
1192ec8511deSBarry Smith     Mat_SeqDense *tmatd;
119387828ca2SBarry Smith     PetscScalar  *v2;
1194ea709b57SSatish Balay 
1195fc4dec0aSBarry Smith     if (reuse == MAT_INITIAL_MATRIX) {
11967adad957SLisandro Dalcin       ierr  = MatCreate(((PetscObject)A)->comm,&tmat);CHKERRQ(ierr);
1197d0f46423SBarry Smith       ierr  = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr);
11987adad957SLisandro Dalcin       ierr  = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
11995c5985e7SKris Buschelman       ierr  = MatSeqDenseSetPreallocation(tmat,PETSC_NULL);CHKERRQ(ierr);
1200fc4dec0aSBarry Smith     } else {
1201fc4dec0aSBarry Smith       tmat = *matout;
1202fc4dec0aSBarry Smith     }
1203ec8511deSBarry Smith     tmatd = (Mat_SeqDense*)tmat->data;
12040de55854SLois Curfman McInnes     v = mat->v; v2 = tmatd->v;
1205d3e5ee88SLois Curfman McInnes     for (j=0; j<n; j++) {
12061b807ce4Svictorle       for (k=0; k<m; k++) v2[j + k*n] = v[k + j*M];
1207d3e5ee88SLois Curfman McInnes     }
12086d4a8577SBarry Smith     ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
12096d4a8577SBarry Smith     ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1210d3e5ee88SLois Curfman McInnes     *matout = tmat;
121148b35521SBarry Smith   }
12123a40ed3dSBarry Smith   PetscFunctionReturn(0);
1213289bc588SBarry Smith }
1214289bc588SBarry Smith 
12154a2ae208SSatish Balay #undef __FUNCT__
12164a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense"
1217ace3abfcSBarry Smith PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool  *flg)
1218289bc588SBarry Smith {
1219c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data;
1220c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data;
122113f74950SBarry Smith   PetscInt     i,j;
122287828ca2SBarry Smith   PetscScalar  *v1 = mat1->v,*v2 = mat2->v;
12239ea5d5aeSSatish Balay 
12243a40ed3dSBarry Smith   PetscFunctionBegin;
1225d0f46423SBarry Smith   if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1226d0f46423SBarry Smith   if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1227d0f46423SBarry Smith   for (i=0; i<A1->rmap->n; i++) {
12281b807ce4Svictorle     v1 = mat1->v+i; v2 = mat2->v+i;
1229d0f46423SBarry Smith     for (j=0; j<A1->cmap->n; j++) {
12303a40ed3dSBarry Smith       if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
12311b807ce4Svictorle       v1 += mat1->lda; v2 += mat2->lda;
12321b807ce4Svictorle     }
1233289bc588SBarry Smith   }
123477c4ece6SBarry Smith   *flg = PETSC_TRUE;
12353a40ed3dSBarry Smith   PetscFunctionReturn(0);
1236289bc588SBarry Smith }
1237289bc588SBarry Smith 
12384a2ae208SSatish Balay #undef __FUNCT__
12394a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense"
1240dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v)
1241289bc588SBarry Smith {
1242c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
1243dfbe8321SBarry Smith   PetscErrorCode ierr;
124413f74950SBarry Smith   PetscInt       i,n,len;
124587828ca2SBarry Smith   PetscScalar    *x,zero = 0.0;
124644cd7ae7SLois Curfman McInnes 
12473a40ed3dSBarry Smith   PetscFunctionBegin;
12482dcb1b2aSMatthew Knepley   ierr = VecSet(v,zero);CHKERRQ(ierr);
12497a97a34bSBarry Smith   ierr = VecGetSize(v,&n);CHKERRQ(ierr);
12501ebc52fbSHong Zhang   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1251d0f46423SBarry Smith   len = PetscMin(A->rmap->n,A->cmap->n);
1252e32f2f54SBarry Smith   if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec");
125344cd7ae7SLois Curfman McInnes   for (i=0; i<len; i++) {
12541b807ce4Svictorle     x[i] = mat->v[i*mat->lda + i];
1255289bc588SBarry Smith   }
12561ebc52fbSHong Zhang   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
12573a40ed3dSBarry Smith   PetscFunctionReturn(0);
1258289bc588SBarry Smith }
1259289bc588SBarry Smith 
12604a2ae208SSatish Balay #undef __FUNCT__
12614a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense"
1262dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr)
1263289bc588SBarry Smith {
1264c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
126587828ca2SBarry Smith   PetscScalar    *l,*r,x,*v;
1266dfbe8321SBarry Smith   PetscErrorCode ierr;
1267d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n;
126855659b69SBarry Smith 
12693a40ed3dSBarry Smith   PetscFunctionBegin;
127028988994SBarry Smith   if (ll) {
12717a97a34bSBarry Smith     ierr = VecGetSize(ll,&m);CHKERRQ(ierr);
12721ebc52fbSHong Zhang     ierr = VecGetArray(ll,&l);CHKERRQ(ierr);
1273e32f2f54SBarry Smith     if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size");
1274da3a660dSBarry Smith     for (i=0; i<m; i++) {
1275da3a660dSBarry Smith       x = l[i];
1276da3a660dSBarry Smith       v = mat->v + i;
1277da3a660dSBarry Smith       for (j=0; j<n; j++) { (*v) *= x; v+= m;}
1278da3a660dSBarry Smith     }
12791ebc52fbSHong Zhang     ierr = VecRestoreArray(ll,&l);CHKERRQ(ierr);
1280efee365bSSatish Balay     ierr = PetscLogFlops(n*m);CHKERRQ(ierr);
1281da3a660dSBarry Smith   }
128228988994SBarry Smith   if (rr) {
12837a97a34bSBarry Smith     ierr = VecGetSize(rr,&n);CHKERRQ(ierr);
12841ebc52fbSHong Zhang     ierr = VecGetArray(rr,&r);CHKERRQ(ierr);
1285e32f2f54SBarry Smith     if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size");
1286da3a660dSBarry Smith     for (i=0; i<n; i++) {
1287da3a660dSBarry Smith       x = r[i];
1288da3a660dSBarry Smith       v = mat->v + i*m;
1289da3a660dSBarry Smith       for (j=0; j<m; j++) { (*v++) *= x;}
1290da3a660dSBarry Smith     }
12911ebc52fbSHong Zhang     ierr = VecRestoreArray(rr,&r);CHKERRQ(ierr);
1292efee365bSSatish Balay     ierr = PetscLogFlops(n*m);CHKERRQ(ierr);
1293da3a660dSBarry Smith   }
12943a40ed3dSBarry Smith   PetscFunctionReturn(0);
1295289bc588SBarry Smith }
1296289bc588SBarry Smith 
12974a2ae208SSatish Balay #undef __FUNCT__
12984a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense"
1299dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm)
1300289bc588SBarry Smith {
1301c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
130287828ca2SBarry Smith   PetscScalar  *v = mat->v;
1303329f5518SBarry Smith   PetscReal    sum = 0.0;
1304d0f46423SBarry Smith   PetscInt     lda=mat->lda,m=A->rmap->n,i,j;
1305efee365bSSatish Balay   PetscErrorCode ierr;
130655659b69SBarry Smith 
13073a40ed3dSBarry Smith   PetscFunctionBegin;
1308289bc588SBarry Smith   if (type == NORM_FROBENIUS) {
1309a5ce6ee0Svictorle     if (lda>m) {
1310d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1311a5ce6ee0Svictorle 	v = mat->v+j*lda;
1312a5ce6ee0Svictorle 	for (i=0; i<m; i++) {
1313a5ce6ee0Svictorle #if defined(PETSC_USE_COMPLEX)
1314a5ce6ee0Svictorle 	  sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1315a5ce6ee0Svictorle #else
1316a5ce6ee0Svictorle 	  sum += (*v)*(*v); v++;
1317a5ce6ee0Svictorle #endif
1318a5ce6ee0Svictorle 	}
1319a5ce6ee0Svictorle       }
1320a5ce6ee0Svictorle     } else {
1321d0f46423SBarry Smith       for (i=0; i<A->cmap->n*A->rmap->n; i++) {
1322aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
1323329f5518SBarry Smith 	sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1324289bc588SBarry Smith #else
1325289bc588SBarry Smith 	sum += (*v)*(*v); v++;
1326289bc588SBarry Smith #endif
1327289bc588SBarry Smith       }
1328a5ce6ee0Svictorle     }
13298f1a2a5eSBarry Smith     *nrm = PetscSqrtReal(sum);
1330dc0b31edSSatish Balay     ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
13313a40ed3dSBarry Smith   } else if (type == NORM_1) {
1332064f8208SBarry Smith     *nrm = 0.0;
1333d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
13341b807ce4Svictorle       v = mat->v + j*mat->lda;
1335289bc588SBarry Smith       sum = 0.0;
1336d0f46423SBarry Smith       for (i=0; i<A->rmap->n; i++) {
133733a8263dSBarry Smith         sum += PetscAbsScalar(*v);  v++;
1338289bc588SBarry Smith       }
1339064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1340289bc588SBarry Smith     }
1341d0f46423SBarry Smith     ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr);
13423a40ed3dSBarry Smith   } else if (type == NORM_INFINITY) {
1343064f8208SBarry Smith     *nrm = 0.0;
1344d0f46423SBarry Smith     for (j=0; j<A->rmap->n; j++) {
1345289bc588SBarry Smith       v = mat->v + j;
1346289bc588SBarry Smith       sum = 0.0;
1347d0f46423SBarry Smith       for (i=0; i<A->cmap->n; i++) {
13481b807ce4Svictorle         sum += PetscAbsScalar(*v); v += mat->lda;
1349289bc588SBarry Smith       }
1350064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1351289bc588SBarry Smith     }
1352d0f46423SBarry Smith     ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr);
1353e7e72b3dSBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm");
13543a40ed3dSBarry Smith   PetscFunctionReturn(0);
1355289bc588SBarry Smith }
1356289bc588SBarry Smith 
13574a2ae208SSatish Balay #undef __FUNCT__
13584a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense"
1359ace3abfcSBarry Smith PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool  flg)
1360289bc588SBarry Smith {
1361c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *aij = (Mat_SeqDense*)A->data;
136263ba0a88SBarry Smith   PetscErrorCode ierr;
136367e560aaSBarry Smith 
13643a40ed3dSBarry Smith   PetscFunctionBegin;
1365b5a2b587SKris Buschelman   switch (op) {
1366b5a2b587SKris Buschelman   case MAT_ROW_ORIENTED:
13674e0d8c25SBarry Smith     aij->roworiented = flg;
1368b5a2b587SKris Buschelman     break;
1369512a5fc5SBarry Smith   case MAT_NEW_NONZERO_LOCATIONS:
1370b5a2b587SKris Buschelman   case MAT_NEW_NONZERO_LOCATION_ERR:
13713971808eSMatthew Knepley   case MAT_NEW_NONZERO_ALLOCATION_ERR:
13724e0d8c25SBarry Smith   case MAT_NEW_DIAGONALS:
137313fa8e87SLisandro Dalcin   case MAT_KEEP_NONZERO_PATTERN:
1374b5a2b587SKris Buschelman   case MAT_IGNORE_OFF_PROC_ENTRIES:
1375b5a2b587SKris Buschelman   case MAT_USE_HASH_TABLE:
137677e54ba9SKris Buschelman   case MAT_SYMMETRIC:
137777e54ba9SKris Buschelman   case MAT_STRUCTURALLY_SYMMETRIC:
13789a4540c5SBarry Smith   case MAT_HERMITIAN:
13799a4540c5SBarry Smith   case MAT_SYMMETRY_ETERNAL:
1380600fe468SBarry Smith   case MAT_IGNORE_LOWER_TRIANGULAR:
1381290bbb0aSBarry Smith     ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr);
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);
143097b48c8fSBarry Smith     for (i=0; i<N; i++) {
143197b48c8fSBarry Smith       bb[rows[i]] = diag*xx[rows[i]];
143297b48c8fSBarry Smith     }
143397b48c8fSBarry Smith     ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr);
143497b48c8fSBarry Smith     ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr);
143597b48c8fSBarry Smith   }
143697b48c8fSBarry Smith 
14376f0a148fSBarry Smith   for (i=0; i<N; i++) {
14386f0a148fSBarry Smith     slot = l->v + rows[i];
1439b9679d65SBarry Smith     for (j=0; j<n; j++) { *slot = 0.0; slot += m;}
14406f0a148fSBarry Smith   }
1441f4df32b1SMatthew Knepley   if (diag != 0.0) {
1442b9679d65SBarry Smith     if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices");
14436f0a148fSBarry Smith     for (i=0; i<N; i++) {
1444b9679d65SBarry Smith       slot = l->v + (m+1)*rows[i];
1445f4df32b1SMatthew Knepley       *slot = diag;
14466f0a148fSBarry Smith     }
14476f0a148fSBarry Smith   }
14483a40ed3dSBarry Smith   PetscFunctionReturn(0);
14496f0a148fSBarry Smith }
1450557bce09SLois Curfman McInnes 
14514a2ae208SSatish Balay #undef __FUNCT__
14524a2ae208SSatish Balay #define __FUNCT__ "MatGetArray_SeqDense"
1453dfbe8321SBarry Smith PetscErrorCode MatGetArray_SeqDense(Mat A,PetscScalar *array[])
145464e87e97SBarry Smith {
1455c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
14563a40ed3dSBarry Smith 
14573a40ed3dSBarry Smith   PetscFunctionBegin;
1458e32f2f54SBarry 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");
145964e87e97SBarry Smith   *array = mat->v;
14603a40ed3dSBarry Smith   PetscFunctionReturn(0);
146164e87e97SBarry Smith }
14620754003eSLois Curfman McInnes 
14634a2ae208SSatish Balay #undef __FUNCT__
14644a2ae208SSatish Balay #define __FUNCT__ "MatRestoreArray_SeqDense"
1465dfbe8321SBarry Smith PetscErrorCode MatRestoreArray_SeqDense(Mat A,PetscScalar *array[])
1466ff14e315SSatish Balay {
14673a40ed3dSBarry Smith   PetscFunctionBegin;
146809b544d4SBarry Smith   *array = 0; /* user cannot accidently use the array later */
14693a40ed3dSBarry Smith   PetscFunctionReturn(0);
1470ff14e315SSatish Balay }
14710754003eSLois Curfman McInnes 
14724a2ae208SSatish Balay #undef __FUNCT__
14734a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense"
147413f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B)
14750754003eSLois Curfman McInnes {
1476c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
14776849ba73SBarry Smith   PetscErrorCode ierr;
14785d0c19d7SBarry Smith   PetscInt       i,j,nrows,ncols;
14795d0c19d7SBarry Smith   const PetscInt *irow,*icol;
148087828ca2SBarry Smith   PetscScalar    *av,*bv,*v = mat->v;
14810754003eSLois Curfman McInnes   Mat            newmat;
14820754003eSLois Curfman McInnes 
14833a40ed3dSBarry Smith   PetscFunctionBegin;
148478b31e54SBarry Smith   ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr);
148578b31e54SBarry Smith   ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr);
1486e03a110bSBarry Smith   ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr);
1487e03a110bSBarry Smith   ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr);
14880754003eSLois Curfman McInnes 
1489182d2002SSatish Balay   /* Check submatrixcall */
1490182d2002SSatish Balay   if (scall == MAT_REUSE_MATRIX) {
149113f74950SBarry Smith     PetscInt n_cols,n_rows;
1492182d2002SSatish Balay     ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr);
149321a2c019SBarry Smith     if (n_rows != nrows || n_cols != ncols) {
1494f746d493SDmitry Karpeev       /* resize the result matrix to match number of requested rows/columns */
1495c61587bbSBarry Smith       ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
149621a2c019SBarry Smith     }
1497182d2002SSatish Balay     newmat = *B;
1498182d2002SSatish Balay   } else {
14990754003eSLois Curfman McInnes     /* Create and fill new matrix */
15007adad957SLisandro Dalcin     ierr = MatCreate(((PetscObject)A)->comm,&newmat);CHKERRQ(ierr);
1501f69a0ea3SMatthew Knepley     ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
15027adad957SLisandro Dalcin     ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
15035c5985e7SKris Buschelman     ierr = MatSeqDenseSetPreallocation(newmat,PETSC_NULL);CHKERRQ(ierr);
1504182d2002SSatish Balay   }
1505182d2002SSatish Balay 
1506182d2002SSatish Balay   /* Now extract the data pointers and do the copy,column at a time */
1507182d2002SSatish Balay   bv = ((Mat_SeqDense*)newmat->data)->v;
1508182d2002SSatish Balay 
1509182d2002SSatish Balay   for (i=0; i<ncols; i++) {
15106de62eeeSBarry Smith     av = v + mat->lda*icol[i];
1511182d2002SSatish Balay     for (j=0; j<nrows; j++) {
1512182d2002SSatish Balay       *bv++ = av[irow[j]];
15130754003eSLois Curfman McInnes     }
15140754003eSLois Curfman McInnes   }
1515182d2002SSatish Balay 
1516182d2002SSatish Balay   /* Assemble the matrices so that the correct flags are set */
15176d4a8577SBarry Smith   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
15186d4a8577SBarry Smith   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
15190754003eSLois Curfman McInnes 
15200754003eSLois Curfman McInnes   /* Free work space */
152178b31e54SBarry Smith   ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr);
152278b31e54SBarry Smith   ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr);
1523182d2002SSatish Balay   *B = newmat;
15243a40ed3dSBarry Smith   PetscFunctionReturn(0);
15250754003eSLois Curfman McInnes }
15260754003eSLois Curfman McInnes 
15274a2ae208SSatish Balay #undef __FUNCT__
15284a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense"
152913f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[])
1530905e6a2fSBarry Smith {
15316849ba73SBarry Smith   PetscErrorCode ierr;
153213f74950SBarry Smith   PetscInt       i;
1533905e6a2fSBarry Smith 
15343a40ed3dSBarry Smith   PetscFunctionBegin;
1535905e6a2fSBarry Smith   if (scall == MAT_INITIAL_MATRIX) {
1536b0a32e0cSBarry Smith     ierr = PetscMalloc((n+1)*sizeof(Mat),B);CHKERRQ(ierr);
1537905e6a2fSBarry Smith   }
1538905e6a2fSBarry Smith 
1539905e6a2fSBarry Smith   for (i=0; i<n; i++) {
15406a6a5d1dSBarry Smith     ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr);
1541905e6a2fSBarry Smith   }
15423a40ed3dSBarry Smith   PetscFunctionReturn(0);
1543905e6a2fSBarry Smith }
1544905e6a2fSBarry Smith 
15454a2ae208SSatish Balay #undef __FUNCT__
1546c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense"
1547c0aa2d19SHong Zhang PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode)
1548c0aa2d19SHong Zhang {
1549c0aa2d19SHong Zhang   PetscFunctionBegin;
1550c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1551c0aa2d19SHong Zhang }
1552c0aa2d19SHong Zhang 
1553c0aa2d19SHong Zhang #undef __FUNCT__
1554c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense"
1555c0aa2d19SHong Zhang PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode)
1556c0aa2d19SHong Zhang {
1557c0aa2d19SHong Zhang   PetscFunctionBegin;
1558c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1559c0aa2d19SHong Zhang }
1560c0aa2d19SHong Zhang 
1561c0aa2d19SHong Zhang #undef __FUNCT__
15624a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense"
1563dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str)
15644b0e389bSBarry Smith {
15654b0e389bSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense *)B->data;
15666849ba73SBarry Smith   PetscErrorCode ierr;
1567d0f46423SBarry Smith   PetscInt       lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j;
15683a40ed3dSBarry Smith 
15693a40ed3dSBarry Smith   PetscFunctionBegin;
157033f4a19fSKris Buschelman   /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */
157133f4a19fSKris Buschelman   if (A->ops->copy != B->ops->copy) {
1572cb5b572fSBarry Smith     ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr);
15733a40ed3dSBarry Smith     PetscFunctionReturn(0);
15743a40ed3dSBarry Smith   }
1575e32f2f54SBarry Smith   if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)");
1576a5ce6ee0Svictorle   if (lda1>m || lda2>m) {
15770dbb7854Svictorle     for (j=0; j<n; j++) {
1578a5ce6ee0Svictorle       ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr);
1579a5ce6ee0Svictorle     }
1580a5ce6ee0Svictorle   } else {
1581d0f46423SBarry Smith     ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1582a5ce6ee0Svictorle   }
1583273d9f13SBarry Smith   PetscFunctionReturn(0);
1584273d9f13SBarry Smith }
1585273d9f13SBarry Smith 
15864a2ae208SSatish Balay #undef __FUNCT__
15874994cf47SJed Brown #define __FUNCT__ "MatSetUp_SeqDense"
15884994cf47SJed Brown PetscErrorCode MatSetUp_SeqDense(Mat A)
1589273d9f13SBarry Smith {
1590dfbe8321SBarry Smith   PetscErrorCode ierr;
1591273d9f13SBarry Smith 
1592273d9f13SBarry Smith   PetscFunctionBegin;
1593273d9f13SBarry Smith   ierr =  MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr);
15943a40ed3dSBarry Smith   PetscFunctionReturn(0);
15954b0e389bSBarry Smith }
15964b0e389bSBarry Smith 
1597284134d9SBarry Smith #undef __FUNCT__
1598284134d9SBarry Smith #define __FUNCT__ "MatSetSizes_SeqDense"
1599284134d9SBarry Smith PetscErrorCode MatSetSizes_SeqDense(Mat A,PetscInt m,PetscInt n,PetscInt M,PetscInt N)
1600284134d9SBarry Smith {
1601284134d9SBarry Smith   PetscFunctionBegin;
160221a2c019SBarry Smith   /* this will not be called before lda, Mmax,  and Nmax have been set */
1603284134d9SBarry Smith   m = PetscMax(m,M);
1604284134d9SBarry Smith   n = PetscMax(n,N);
1605a868139aSShri Abhyankar 
160686d161a7SShri Abhyankar   /*  if (m > a->Mmax) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot yet resize number rows of dense matrix larger then its initial size %d, requested %d",a->lda,(int)m);
160786d161a7SShri Abhyankar     if (n > a->Nmax) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot yet resize number columns of dense matrix larger then its initial size %d, requested %d",a->Nmax,(int)n);
160886d161a7SShri Abhyankar   */
1609dc5cefdeSJed Brown   A->rmap->n = A->rmap->N = m;
1610d0f46423SBarry Smith   A->cmap->n = A->cmap->N = n;
1611284134d9SBarry Smith   PetscFunctionReturn(0);
1612284134d9SBarry Smith }
1613170fe5c8SBarry Smith 
1614ba337c44SJed Brown #undef __FUNCT__
1615ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense"
1616ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A)
1617ba337c44SJed Brown {
1618ba337c44SJed Brown   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1619ba337c44SJed Brown   PetscInt       i,nz = A->rmap->n*A->cmap->n;
1620ba337c44SJed Brown   PetscScalar    *aa = a->v;
1621ba337c44SJed Brown 
1622ba337c44SJed Brown   PetscFunctionBegin;
1623ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]);
1624ba337c44SJed Brown   PetscFunctionReturn(0);
1625ba337c44SJed Brown }
1626ba337c44SJed Brown 
1627ba337c44SJed Brown #undef __FUNCT__
1628ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense"
1629ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A)
1630ba337c44SJed Brown {
1631ba337c44SJed Brown   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1632ba337c44SJed Brown   PetscInt       i,nz = A->rmap->n*A->cmap->n;
1633ba337c44SJed Brown   PetscScalar    *aa = a->v;
1634ba337c44SJed Brown 
1635ba337c44SJed Brown   PetscFunctionBegin;
1636ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]);
1637ba337c44SJed Brown   PetscFunctionReturn(0);
1638ba337c44SJed Brown }
1639ba337c44SJed Brown 
1640ba337c44SJed Brown #undef __FUNCT__
1641ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense"
1642ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A)
1643ba337c44SJed Brown {
1644ba337c44SJed Brown   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1645ba337c44SJed Brown   PetscInt       i,nz = A->rmap->n*A->cmap->n;
1646ba337c44SJed Brown   PetscScalar    *aa = a->v;
1647ba337c44SJed Brown 
1648ba337c44SJed Brown   PetscFunctionBegin;
1649ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]);
1650ba337c44SJed Brown   PetscFunctionReturn(0);
1651ba337c44SJed Brown }
1652284134d9SBarry Smith 
1653a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/
1654a9fe9ddaSSatish Balay #undef __FUNCT__
1655a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense"
1656a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1657a9fe9ddaSSatish Balay {
1658a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1659a9fe9ddaSSatish Balay 
1660a9fe9ddaSSatish Balay   PetscFunctionBegin;
1661a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX){
1662a9fe9ddaSSatish Balay     ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
1663a9fe9ddaSSatish Balay   }
1664a9fe9ddaSSatish Balay   ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
1665a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1666a9fe9ddaSSatish Balay }
1667a9fe9ddaSSatish Balay 
1668a9fe9ddaSSatish Balay #undef __FUNCT__
1669a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense"
1670a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1671a9fe9ddaSSatish Balay {
1672ee16a9a1SHong Zhang   PetscErrorCode ierr;
1673d0f46423SBarry Smith   PetscInt       m=A->rmap->n,n=B->cmap->n;
1674ee16a9a1SHong Zhang   Mat            Cmat;
1675a9fe9ddaSSatish Balay 
1676ee16a9a1SHong Zhang   PetscFunctionBegin;
1677e32f2f54SBarry 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);
1678ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1679ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1680ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
1681ee16a9a1SHong Zhang   ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr);
1682ee16a9a1SHong Zhang   Cmat->assembled    = PETSC_TRUE;
16838cdbd757SHong Zhang   Cmat->ops->matmult = MatMatMult_SeqDense_SeqDense;
1684ee16a9a1SHong Zhang   *C = Cmat;
1685ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1686ee16a9a1SHong Zhang }
1687a9fe9ddaSSatish Balay 
168898a3b096SSatish Balay #undef __FUNCT__
1689a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense"
1690a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1691a9fe9ddaSSatish Balay {
1692a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1693a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1694a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
16950805154bSBarry Smith   PetscBLASInt   m,n,k;
1696a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1697a9fe9ddaSSatish Balay 
1698a9fe9ddaSSatish Balay   PetscFunctionBegin;
1699d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
1700d0f46423SBarry Smith   n = PetscBLASIntCast(B->cmap->n);
1701d0f46423SBarry Smith   k = PetscBLASIntCast(A->cmap->n);
1702a9fe9ddaSSatish Balay   BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda);
1703a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1704a9fe9ddaSSatish Balay }
1705a9fe9ddaSSatish Balay 
1706a9fe9ddaSSatish Balay #undef __FUNCT__
170775648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqDense_SeqDense"
170875648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1709a9fe9ddaSSatish Balay {
1710a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1711a9fe9ddaSSatish Balay 
1712a9fe9ddaSSatish Balay   PetscFunctionBegin;
1713a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX){
171475648e8dSHong Zhang     ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
1715a9fe9ddaSSatish Balay   }
171675648e8dSHong Zhang   ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
1717a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1718a9fe9ddaSSatish Balay }
1719a9fe9ddaSSatish Balay 
1720a9fe9ddaSSatish Balay #undef __FUNCT__
172175648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqDense_SeqDense"
172275648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1723a9fe9ddaSSatish Balay {
1724ee16a9a1SHong Zhang   PetscErrorCode ierr;
1725d0f46423SBarry Smith   PetscInt       m=A->cmap->n,n=B->cmap->n;
1726ee16a9a1SHong Zhang   Mat            Cmat;
1727a9fe9ddaSSatish Balay 
1728ee16a9a1SHong Zhang   PetscFunctionBegin;
1729e32f2f54SBarry 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);
1730ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1731ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1732ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
1733ee16a9a1SHong Zhang   ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr);
1734ee16a9a1SHong Zhang   Cmat->assembled = PETSC_TRUE;
1735ee16a9a1SHong Zhang   *C = Cmat;
1736ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1737ee16a9a1SHong Zhang }
1738a9fe9ddaSSatish Balay 
1739a9fe9ddaSSatish Balay #undef __FUNCT__
174075648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqDense_SeqDense"
174175648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1742a9fe9ddaSSatish Balay {
1743a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1744a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1745a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
17460805154bSBarry Smith   PetscBLASInt   m,n,k;
1747a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1748a9fe9ddaSSatish Balay 
1749a9fe9ddaSSatish Balay   PetscFunctionBegin;
1750d0f46423SBarry Smith   m = PetscBLASIntCast(A->cmap->n);
1751d0f46423SBarry Smith   n = PetscBLASIntCast(B->cmap->n);
1752d0f46423SBarry Smith   k = PetscBLASIntCast(A->rmap->n);
17532fbe02b9SBarry Smith   /*
17542fbe02b9SBarry Smith      Note the m and n arguments below are the number rows and columns of A', not A!
17552fbe02b9SBarry Smith   */
1756a9fe9ddaSSatish Balay   BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda);
1757a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1758a9fe9ddaSSatish Balay }
1759985db425SBarry Smith 
1760985db425SBarry Smith #undef __FUNCT__
1761985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense"
1762985db425SBarry Smith PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[])
1763985db425SBarry Smith {
1764985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1765985db425SBarry Smith   PetscErrorCode ierr;
1766d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1767985db425SBarry Smith   PetscScalar    *x;
1768985db425SBarry Smith   MatScalar      *aa = a->v;
1769985db425SBarry Smith 
1770985db425SBarry Smith   PetscFunctionBegin;
1771e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1772985db425SBarry Smith 
1773985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1774985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1775985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1776e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1777985db425SBarry Smith   for (i=0; i<m; i++) {
1778985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1779985db425SBarry Smith     for (j=1; j<n; j++){
1780985db425SBarry Smith       if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1781985db425SBarry Smith     }
1782985db425SBarry Smith   }
1783985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1784985db425SBarry Smith   PetscFunctionReturn(0);
1785985db425SBarry Smith }
1786985db425SBarry Smith 
1787985db425SBarry Smith #undef __FUNCT__
1788985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense"
1789985db425SBarry Smith PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[])
1790985db425SBarry Smith {
1791985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1792985db425SBarry Smith   PetscErrorCode ierr;
1793d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1794985db425SBarry Smith   PetscScalar    *x;
1795985db425SBarry Smith   PetscReal      atmp;
1796985db425SBarry Smith   MatScalar      *aa = a->v;
1797985db425SBarry Smith 
1798985db425SBarry Smith   PetscFunctionBegin;
1799e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1800985db425SBarry Smith 
1801985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1802985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1803985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1804e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1805985db425SBarry Smith   for (i=0; i<m; i++) {
18069189402eSHong Zhang     x[i] = PetscAbsScalar(aa[i]);
1807985db425SBarry Smith     for (j=1; j<n; j++){
1808985db425SBarry Smith       atmp = PetscAbsScalar(aa[i+m*j]);
1809985db425SBarry Smith       if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;}
1810985db425SBarry Smith     }
1811985db425SBarry Smith   }
1812985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1813985db425SBarry Smith   PetscFunctionReturn(0);
1814985db425SBarry Smith }
1815985db425SBarry Smith 
1816985db425SBarry Smith #undef __FUNCT__
1817985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense"
1818985db425SBarry Smith PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[])
1819985db425SBarry Smith {
1820985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1821985db425SBarry Smith   PetscErrorCode ierr;
1822d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1823985db425SBarry Smith   PetscScalar    *x;
1824985db425SBarry Smith   MatScalar      *aa = a->v;
1825985db425SBarry Smith 
1826985db425SBarry Smith   PetscFunctionBegin;
1827e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1828985db425SBarry Smith 
1829985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1830985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1831985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1832e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1833985db425SBarry Smith   for (i=0; i<m; i++) {
1834985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1835985db425SBarry Smith     for (j=1; j<n; j++){
1836985db425SBarry Smith       if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1837985db425SBarry Smith     }
1838985db425SBarry Smith   }
1839985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1840985db425SBarry Smith   PetscFunctionReturn(0);
1841985db425SBarry Smith }
1842985db425SBarry Smith 
18438d0534beSBarry Smith #undef __FUNCT__
18448d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense"
18458d0534beSBarry Smith PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col)
18468d0534beSBarry Smith {
18478d0534beSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
18488d0534beSBarry Smith   PetscErrorCode ierr;
18498d0534beSBarry Smith   PetscScalar    *x;
18508d0534beSBarry Smith 
18518d0534beSBarry Smith   PetscFunctionBegin;
1852e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
18538d0534beSBarry Smith 
18548d0534beSBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1855d0f46423SBarry Smith   ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
18568d0534beSBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
18578d0534beSBarry Smith   PetscFunctionReturn(0);
18588d0534beSBarry Smith }
18598d0534beSBarry Smith 
18600716a85fSBarry Smith 
18610716a85fSBarry Smith #undef __FUNCT__
18620716a85fSBarry Smith #define __FUNCT__ "MatGetColumnNorms_SeqDense"
18630716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms)
18640716a85fSBarry Smith {
18650716a85fSBarry Smith   PetscErrorCode ierr;
18660716a85fSBarry Smith   PetscInt       i,j,m,n;
18670716a85fSBarry Smith   PetscScalar    *a;
18680716a85fSBarry Smith 
18690716a85fSBarry Smith   PetscFunctionBegin;
18700716a85fSBarry Smith   ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr);
18710716a85fSBarry Smith   ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr);
18720716a85fSBarry Smith   ierr = MatGetArray(A,&a);CHKERRQ(ierr);
18730716a85fSBarry Smith   if (type == NORM_2) {
18740716a85fSBarry Smith     for (i=0; i<n; i++ ){
18750716a85fSBarry Smith       for (j=0; j<m; j++) {
18760716a85fSBarry Smith 	norms[i] += PetscAbsScalar(a[j]*a[j]);
18770716a85fSBarry Smith       }
18780716a85fSBarry Smith       a += m;
18790716a85fSBarry Smith     }
18800716a85fSBarry Smith   } else if (type == NORM_1) {
18810716a85fSBarry Smith     for (i=0; i<n; i++ ){
18820716a85fSBarry Smith       for (j=0; j<m; j++) {
18830716a85fSBarry Smith 	norms[i] += PetscAbsScalar(a[j]);
18840716a85fSBarry Smith       }
18850716a85fSBarry Smith       a += m;
18860716a85fSBarry Smith     }
18870716a85fSBarry Smith   } else if (type == NORM_INFINITY) {
18880716a85fSBarry Smith     for (i=0; i<n; i++ ){
18890716a85fSBarry Smith       for (j=0; j<m; j++) {
18900716a85fSBarry Smith 	norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]);
18910716a85fSBarry Smith       }
18920716a85fSBarry Smith       a += m;
18930716a85fSBarry Smith     }
18940716a85fSBarry Smith   } else SETERRQ(((PetscObject)A)->comm,PETSC_ERR_ARG_WRONG,"Unknown NormType");
18950716a85fSBarry Smith   if (type == NORM_2) {
18968f1a2a5eSBarry Smith     for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]);
18970716a85fSBarry Smith   }
18980716a85fSBarry Smith   PetscFunctionReturn(0);
18990716a85fSBarry Smith }
19000716a85fSBarry Smith 
1901289bc588SBarry Smith /* -------------------------------------------------------------------*/
1902a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = {MatSetValues_SeqDense,
1903905e6a2fSBarry Smith        MatGetRow_SeqDense,
1904905e6a2fSBarry Smith        MatRestoreRow_SeqDense,
1905905e6a2fSBarry Smith        MatMult_SeqDense,
190697304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense,
19077c922b88SBarry Smith        MatMultTranspose_SeqDense,
19087c922b88SBarry Smith        MatMultTransposeAdd_SeqDense,
1909db4efbfdSBarry Smith        0,
1910db4efbfdSBarry Smith        0,
1911db4efbfdSBarry Smith        0,
1912db4efbfdSBarry Smith /*10*/ 0,
1913905e6a2fSBarry Smith        MatLUFactor_SeqDense,
1914905e6a2fSBarry Smith        MatCholeskyFactor_SeqDense,
191541f059aeSBarry Smith        MatSOR_SeqDense,
1916ec8511deSBarry Smith        MatTranspose_SeqDense,
191797304618SKris Buschelman /*15*/ MatGetInfo_SeqDense,
1918905e6a2fSBarry Smith        MatEqual_SeqDense,
1919905e6a2fSBarry Smith        MatGetDiagonal_SeqDense,
1920905e6a2fSBarry Smith        MatDiagonalScale_SeqDense,
1921905e6a2fSBarry Smith        MatNorm_SeqDense,
1922c0aa2d19SHong Zhang /*20*/ MatAssemblyBegin_SeqDense,
1923c0aa2d19SHong Zhang        MatAssemblyEnd_SeqDense,
1924905e6a2fSBarry Smith        MatSetOption_SeqDense,
1925905e6a2fSBarry Smith        MatZeroEntries_SeqDense,
1926d519adbfSMatthew Knepley /*24*/ MatZeroRows_SeqDense,
1927db4efbfdSBarry Smith        0,
1928db4efbfdSBarry Smith        0,
1929db4efbfdSBarry Smith        0,
1930db4efbfdSBarry Smith        0,
19314994cf47SJed Brown /*29*/ MatSetUp_SeqDense,
1932273d9f13SBarry Smith        0,
1933905e6a2fSBarry Smith        0,
1934905e6a2fSBarry Smith        MatGetArray_SeqDense,
1935905e6a2fSBarry Smith        MatRestoreArray_SeqDense,
1936d519adbfSMatthew Knepley /*34*/ MatDuplicate_SeqDense,
1937a5ae1ecdSBarry Smith        0,
1938a5ae1ecdSBarry Smith        0,
1939a5ae1ecdSBarry Smith        0,
1940a5ae1ecdSBarry Smith        0,
1941d519adbfSMatthew Knepley /*39*/ MatAXPY_SeqDense,
1942a5ae1ecdSBarry Smith        MatGetSubMatrices_SeqDense,
1943a5ae1ecdSBarry Smith        0,
19444b0e389bSBarry Smith        MatGetValues_SeqDense,
1945a5ae1ecdSBarry Smith        MatCopy_SeqDense,
1946d519adbfSMatthew Knepley /*44*/ MatGetRowMax_SeqDense,
1947a5ae1ecdSBarry Smith        MatScale_SeqDense,
1948a5ae1ecdSBarry Smith        0,
1949a5ae1ecdSBarry Smith        0,
1950a5ae1ecdSBarry Smith        0,
1951d519adbfSMatthew Knepley /*49*/ 0,
1952a5ae1ecdSBarry Smith        0,
1953a5ae1ecdSBarry Smith        0,
1954a5ae1ecdSBarry Smith        0,
1955a5ae1ecdSBarry Smith        0,
1956d519adbfSMatthew Knepley /*54*/ 0,
1957a5ae1ecdSBarry Smith        0,
1958a5ae1ecdSBarry Smith        0,
1959a5ae1ecdSBarry Smith        0,
1960a5ae1ecdSBarry Smith        0,
1961d519adbfSMatthew Knepley /*59*/ 0,
1962e03a110bSBarry Smith        MatDestroy_SeqDense,
1963e03a110bSBarry Smith        MatView_SeqDense,
1964357abbc8SBarry Smith        0,
196597304618SKris Buschelman        0,
1966d519adbfSMatthew Knepley /*64*/ 0,
196797304618SKris Buschelman        0,
196897304618SKris Buschelman        0,
196997304618SKris Buschelman        0,
197097304618SKris Buschelman        0,
1971d519adbfSMatthew Knepley /*69*/ MatGetRowMaxAbs_SeqDense,
197297304618SKris Buschelman        0,
197397304618SKris Buschelman        0,
197497304618SKris Buschelman        0,
197597304618SKris Buschelman        0,
1976d519adbfSMatthew Knepley /*74*/ 0,
197797304618SKris Buschelman        0,
197897304618SKris Buschelman        0,
197997304618SKris Buschelman        0,
198097304618SKris Buschelman        0,
1981d519adbfSMatthew Knepley /*79*/ 0,
198297304618SKris Buschelman        0,
198397304618SKris Buschelman        0,
198497304618SKris Buschelman        0,
19855bba2384SShri Abhyankar /*83*/ MatLoad_SeqDense,
1986865e5f61SKris Buschelman        0,
19871cbb95d3SBarry Smith        MatIsHermitian_SeqDense,
1988865e5f61SKris Buschelman        0,
1989865e5f61SKris Buschelman        0,
1990865e5f61SKris Buschelman        0,
1991d519adbfSMatthew Knepley /*89*/ MatMatMult_SeqDense_SeqDense,
1992a9fe9ddaSSatish Balay        MatMatMultSymbolic_SeqDense_SeqDense,
1993a9fe9ddaSSatish Balay        MatMatMultNumeric_SeqDense_SeqDense,
1994865e5f61SKris Buschelman        0,
1995865e5f61SKris Buschelman        0,
1996d519adbfSMatthew Knepley /*94*/ 0,
19975df89d91SHong Zhang        0,
19985df89d91SHong Zhang        0,
19995df89d91SHong Zhang        0,
2000284134d9SBarry Smith        0,
2001d519adbfSMatthew Knepley /*99*/ 0,
2002284134d9SBarry Smith        0,
2003284134d9SBarry Smith        0,
2004ba337c44SJed Brown        MatConjugate_SeqDense,
2005985db425SBarry Smith        MatSetSizes_SeqDense,
2006ba337c44SJed Brown /*104*/0,
2007ba337c44SJed Brown        MatRealPart_SeqDense,
2008ba337c44SJed Brown        MatImaginaryPart_SeqDense,
2009985db425SBarry Smith        0,
2010985db425SBarry Smith        0,
201185e2c93fSHong Zhang /*109*/MatMatSolve_SeqDense,
2012985db425SBarry Smith        0,
20138d0534beSBarry Smith        MatGetRowMin_SeqDense,
2014aabbc4fbSShri Abhyankar        MatGetColumnVector_SeqDense,
2015aabbc4fbSShri Abhyankar        0,
2016aabbc4fbSShri Abhyankar /*114*/0,
2017aabbc4fbSShri Abhyankar        0,
2018aabbc4fbSShri Abhyankar        0,
2019aabbc4fbSShri Abhyankar        0,
2020aabbc4fbSShri Abhyankar        0,
2021aabbc4fbSShri Abhyankar /*119*/0,
2022aabbc4fbSShri Abhyankar        0,
2023aabbc4fbSShri Abhyankar        0,
20240716a85fSBarry Smith        0,
20250716a85fSBarry Smith        0,
20260716a85fSBarry Smith /*124*/0,
20275df89d91SHong Zhang        MatGetColumnNorms_SeqDense,
20285df89d91SHong Zhang        0,
20295df89d91SHong Zhang        0,
20305df89d91SHong Zhang        0,
20315df89d91SHong Zhang /*129*/0,
203275648e8dSHong Zhang        MatTransposeMatMult_SeqDense_SeqDense,
203375648e8dSHong Zhang        MatTransposeMatMultSymbolic_SeqDense_SeqDense,
203475648e8dSHong Zhang        MatTransposeMatMultNumeric_SeqDense_SeqDense,
2035985db425SBarry Smith };
203690ace30eSBarry Smith 
20374a2ae208SSatish Balay #undef __FUNCT__
20384a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense"
20394b828684SBarry Smith /*@C
2040fafbff53SBarry Smith    MatCreateSeqDense - Creates a sequential dense matrix that
2041d65003e9SLois Curfman McInnes    is stored in column major order (the usual Fortran 77 manner). Many
2042d65003e9SLois Curfman McInnes    of the matrix operations use the BLAS and LAPACK routines.
2043289bc588SBarry Smith 
2044db81eaa0SLois Curfman McInnes    Collective on MPI_Comm
2045db81eaa0SLois Curfman McInnes 
204620563c6bSBarry Smith    Input Parameters:
2047db81eaa0SLois Curfman McInnes +  comm - MPI communicator, set to PETSC_COMM_SELF
20480c775827SLois Curfman McInnes .  m - number of rows
204918f449edSLois Curfman McInnes .  n - number of columns
2050c0235b3cSMatthew Knepley -  data - optional location of matrix data in column major order.  Set data=PETSC_NULL for PETSc
2051dfc5480cSLois Curfman McInnes    to control all matrix memory allocation.
205220563c6bSBarry Smith 
205320563c6bSBarry Smith    Output Parameter:
205444cd7ae7SLois Curfman McInnes .  A - the matrix
205520563c6bSBarry Smith 
2056b259b22eSLois Curfman McInnes    Notes:
205718f449edSLois Curfman McInnes    The data input variable is intended primarily for Fortran programmers
205818f449edSLois Curfman McInnes    who wish to allocate their own matrix memory space.  Most users should
2059b4fd4287SBarry Smith    set data=PETSC_NULL.
206018f449edSLois Curfman McInnes 
2061027ccd11SLois Curfman McInnes    Level: intermediate
2062027ccd11SLois Curfman McInnes 
2063dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS
2064d65003e9SLois Curfman McInnes 
2065db81eaa0SLois Curfman McInnes .seealso: MatCreate(), MatCreateMPIDense(), MatSetValues()
206620563c6bSBarry Smith @*/
20677087cfbeSBarry Smith PetscErrorCode  MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A)
2068289bc588SBarry Smith {
2069dfbe8321SBarry Smith   PetscErrorCode ierr;
20703b2fbd54SBarry Smith 
20713a40ed3dSBarry Smith   PetscFunctionBegin;
2072f69a0ea3SMatthew Knepley   ierr = MatCreate(comm,A);CHKERRQ(ierr);
2073f69a0ea3SMatthew Knepley   ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr);
2074273d9f13SBarry Smith   ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr);
2075273d9f13SBarry Smith   ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr);
2076273d9f13SBarry Smith   PetscFunctionReturn(0);
2077273d9f13SBarry Smith }
2078273d9f13SBarry Smith 
20794a2ae208SSatish Balay #undef __FUNCT__
2080afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation"
2081273d9f13SBarry Smith /*@C
2082273d9f13SBarry Smith    MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements
2083273d9f13SBarry Smith 
2084273d9f13SBarry Smith    Collective on MPI_Comm
2085273d9f13SBarry Smith 
2086273d9f13SBarry Smith    Input Parameters:
2087273d9f13SBarry Smith +  A - the matrix
2088273d9f13SBarry Smith -  data - the array (or PETSC_NULL)
2089273d9f13SBarry Smith 
2090273d9f13SBarry Smith    Notes:
2091273d9f13SBarry Smith    The data input variable is intended primarily for Fortran programmers
2092273d9f13SBarry Smith    who wish to allocate their own matrix memory space.  Most users should
2093284134d9SBarry Smith    need not call this routine.
2094273d9f13SBarry Smith 
2095273d9f13SBarry Smith    Level: intermediate
2096273d9f13SBarry Smith 
2097273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS
2098273d9f13SBarry Smith 
2099867c911aSBarry Smith .seealso: MatCreate(), MatCreateMPIDense(), MatSetValues(), MatSeqDenseSetLDA()
2100867c911aSBarry Smith 
2101273d9f13SBarry Smith @*/
21027087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation(Mat B,PetscScalar data[])
2103273d9f13SBarry Smith {
21044ac538c5SBarry Smith   PetscErrorCode ierr;
2105a23d5eceSKris Buschelman 
2106a23d5eceSKris Buschelman   PetscFunctionBegin;
21074ac538c5SBarry Smith   ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr);
2108a23d5eceSKris Buschelman   PetscFunctionReturn(0);
2109a23d5eceSKris Buschelman }
2110a23d5eceSKris Buschelman 
2111a23d5eceSKris Buschelman EXTERN_C_BEGIN
2112a23d5eceSKris Buschelman #undef __FUNCT__
2113afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense"
21147087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data)
2115a23d5eceSKris Buschelman {
2116273d9f13SBarry Smith   Mat_SeqDense   *b;
2117dfbe8321SBarry Smith   PetscErrorCode ierr;
2118273d9f13SBarry Smith 
2119273d9f13SBarry Smith   PetscFunctionBegin;
2120273d9f13SBarry Smith   B->preallocated = PETSC_TRUE;
2121a868139aSShri Abhyankar 
212234ef9618SShri Abhyankar   ierr = PetscLayoutSetBlockSize(B->rmap,1);CHKERRQ(ierr);
212334ef9618SShri Abhyankar   ierr = PetscLayoutSetBlockSize(B->cmap,1);CHKERRQ(ierr);
212434ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr);
212534ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr);
212634ef9618SShri Abhyankar 
2127273d9f13SBarry Smith   b       = (Mat_SeqDense*)B->data;
212886d161a7SShri Abhyankar   b->Mmax = B->rmap->n;
212986d161a7SShri Abhyankar   b->Nmax = B->cmap->n;
213086d161a7SShri Abhyankar   if(b->lda <= 0 || b->changelda) b->lda = B->rmap->n;
213186d161a7SShri Abhyankar 
21329e8f95c4SLisandro Dalcin   if (!data) { /* petsc-allocated storage */
21339e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
21345afd5e0cSBarry Smith     ierr = PetscMalloc(b->lda*b->Nmax*sizeof(PetscScalar),&b->v);CHKERRQ(ierr);
2135284134d9SBarry Smith     ierr = PetscMemzero(b->v,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
2136284134d9SBarry Smith     ierr = PetscLogObjectMemory(B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
21379e8f95c4SLisandro Dalcin     b->user_alloc = PETSC_FALSE;
2138273d9f13SBarry Smith   } else { /* user-allocated storage */
21399e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2140273d9f13SBarry Smith     b->v          = data;
2141273d9f13SBarry Smith     b->user_alloc = PETSC_TRUE;
2142273d9f13SBarry Smith   }
21430450473dSBarry Smith   B->assembled = PETSC_TRUE;
2144273d9f13SBarry Smith   PetscFunctionReturn(0);
2145273d9f13SBarry Smith }
2146a23d5eceSKris Buschelman EXTERN_C_END
2147273d9f13SBarry Smith 
21481b807ce4Svictorle #undef __FUNCT__
21491b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA"
21501b807ce4Svictorle /*@C
21511b807ce4Svictorle   MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array
21521b807ce4Svictorle 
21531b807ce4Svictorle   Input parameter:
21541b807ce4Svictorle + A - the matrix
21551b807ce4Svictorle - lda - the leading dimension
21561b807ce4Svictorle 
21571b807ce4Svictorle   Notes:
2158867c911aSBarry Smith   This routine is to be used in conjunction with MatSeqDenseSetPreallocation();
21591b807ce4Svictorle   it asserts that the preallocation has a leading dimension (the LDA parameter
21601b807ce4Svictorle   of Blas and Lapack fame) larger than M, the first dimension of the matrix.
21611b807ce4Svictorle 
21621b807ce4Svictorle   Level: intermediate
21631b807ce4Svictorle 
21641b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS
21651b807ce4Svictorle 
2166284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize()
2167867c911aSBarry Smith 
21681b807ce4Svictorle @*/
21697087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetLDA(Mat B,PetscInt lda)
21701b807ce4Svictorle {
21711b807ce4Svictorle   Mat_SeqDense *b = (Mat_SeqDense*)B->data;
217221a2c019SBarry Smith 
21731b807ce4Svictorle   PetscFunctionBegin;
2174e32f2f54SBarry 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);
21751b807ce4Svictorle   b->lda       = lda;
217621a2c019SBarry Smith   b->changelda = PETSC_FALSE;
217721a2c019SBarry Smith   b->Mmax      = PetscMax(b->Mmax,lda);
21781b807ce4Svictorle   PetscFunctionReturn(0);
21791b807ce4Svictorle }
21801b807ce4Svictorle 
21810bad9183SKris Buschelman /*MC
2182fafad747SKris Buschelman    MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices.
21830bad9183SKris Buschelman 
21840bad9183SKris Buschelman    Options Database Keys:
21850bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions()
21860bad9183SKris Buschelman 
21870bad9183SKris Buschelman   Level: beginner
21880bad9183SKris Buschelman 
218989665df3SBarry Smith .seealso: MatCreateSeqDense()
219089665df3SBarry Smith 
21910bad9183SKris Buschelman M*/
21920bad9183SKris Buschelman 
2193273d9f13SBarry Smith EXTERN_C_BEGIN
21944a2ae208SSatish Balay #undef __FUNCT__
21954a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense"
21967087cfbeSBarry Smith PetscErrorCode  MatCreate_SeqDense(Mat B)
2197273d9f13SBarry Smith {
2198273d9f13SBarry Smith   Mat_SeqDense   *b;
2199dfbe8321SBarry Smith   PetscErrorCode ierr;
22007c334f02SBarry Smith   PetscMPIInt    size;
2201273d9f13SBarry Smith 
2202273d9f13SBarry Smith   PetscFunctionBegin;
22037adad957SLisandro Dalcin   ierr = MPI_Comm_size(((PetscObject)B)->comm,&size);CHKERRQ(ierr);
2204e32f2f54SBarry Smith   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1");
220555659b69SBarry Smith 
220638f2d2fdSLisandro Dalcin   ierr            = PetscNewLog(B,Mat_SeqDense,&b);CHKERRQ(ierr);
2207549d3d68SSatish Balay   ierr            = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr);
220844cd7ae7SLois Curfman McInnes   B->data         = (void*)b;
220918f449edSLois Curfman McInnes 
221044cd7ae7SLois Curfman McInnes   b->pivots       = 0;
2211273d9f13SBarry Smith   b->roworiented  = PETSC_TRUE;
2212273d9f13SBarry Smith   b->v            = 0;
221321a2c019SBarry Smith   b->changelda    = PETSC_FALSE;
22144e220ebcSLois Curfman McInnes 
2215b24902e0SBarry Smith 
22166a63e612SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatConvert_seqdense_seqaij_C","MatConvert_SeqDense_SeqAIJ",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr);
2217ec1065edSBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatGetFactor_petsc_C",
2218b24902e0SBarry Smith                                      "MatGetFactor_seqdense_petsc",
2219b24902e0SBarry Smith                                       MatGetFactor_seqdense_petsc);CHKERRQ(ierr);
2220a23d5eceSKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatSeqDenseSetPreallocation_C",
2221a23d5eceSKris Buschelman                                     "MatSeqDenseSetPreallocation_SeqDense",
2222a23d5eceSKris Buschelman                                      MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr);
22232356f84bSDmitry Karpeev 
22244ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMult_seqaij_seqdense_C",
22254ae313f4SHong Zhang                                      "MatMatMult_SeqAIJ_SeqDense",
22264ae313f4SHong Zhang                                       MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
22272356f84bSDmitry Karpeev 
2228c0c8ee5eSDmitry Karpeev 
22294ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",
22304ae313f4SHong Zhang                                      "MatMatMultSymbolic_SeqAIJ_SeqDense",
22314ae313f4SHong Zhang                                       MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
22324ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",
22334ae313f4SHong Zhang                                      "MatMatMultNumeric_SeqAIJ_SeqDense",
22344ae313f4SHong Zhang                                       MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
223517667f90SBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr);
22363a40ed3dSBarry Smith   PetscFunctionReturn(0);
2237289bc588SBarry Smith }
2238273d9f13SBarry Smith EXTERN_C_END
2239