xref: /petsc/src/mat/impls/dense/seq/dense.c (revision 8e57ea438a4bc929391455041810560decd2c81e)
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);
432*8e57ea43SSatish Balay   ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
433db4efbfdSBarry Smith   LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info);
434*8e57ea43SSatish Balay   ierr = PetscFPTrapPop();CHKERRQ(ierr);
435*8e57ea43SSatish Balay 
436e32f2f54SBarry Smith   if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization");
437e32f2f54SBarry Smith   if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization");
438db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
439db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
440db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
441db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
442d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_LU;
443db4efbfdSBarry Smith 
444dc0b31edSSatish Balay   ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr);
445db4efbfdSBarry Smith #endif
446db4efbfdSBarry Smith   PetscFunctionReturn(0);
447db4efbfdSBarry Smith }
448db4efbfdSBarry Smith 
449db4efbfdSBarry Smith #undef __FUNCT__
450db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactor_SeqDense"
4510481f469SBarry Smith PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo)
452db4efbfdSBarry Smith {
453db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF)
454db4efbfdSBarry Smith   PetscFunctionBegin;
455e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable.");
456db4efbfdSBarry Smith #else
457db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
458db4efbfdSBarry Smith   PetscErrorCode ierr;
459db4efbfdSBarry Smith   PetscBLASInt   info,n = PetscBLASIntCast(A->cmap->n);
460db4efbfdSBarry Smith 
461db4efbfdSBarry Smith   PetscFunctionBegin;
462db4efbfdSBarry Smith   ierr = PetscFree(mat->pivots);CHKERRQ(ierr);
463db4efbfdSBarry Smith 
464db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
465db4efbfdSBarry Smith   LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info);
466e32f2f54SBarry Smith   if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1);
467db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
468db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
469db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
470db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
471d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_CHOLESKY;
472dc0b31edSSatish Balay   ierr = PetscLogFlops((A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr);
473db4efbfdSBarry Smith #endif
474db4efbfdSBarry Smith   PetscFunctionReturn(0);
475db4efbfdSBarry Smith }
476db4efbfdSBarry Smith 
477db4efbfdSBarry Smith 
478db4efbfdSBarry Smith #undef __FUNCT__
479db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense"
4800481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
481db4efbfdSBarry Smith {
482db4efbfdSBarry Smith   PetscErrorCode ierr;
483db4efbfdSBarry Smith   MatFactorInfo  info;
484db4efbfdSBarry Smith 
485db4efbfdSBarry Smith   PetscFunctionBegin;
486db4efbfdSBarry Smith   info.fill = 1.0;
487c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
488719d5645SBarry Smith   ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr);
489db4efbfdSBarry Smith   PetscFunctionReturn(0);
490db4efbfdSBarry Smith }
491db4efbfdSBarry Smith 
492db4efbfdSBarry Smith #undef __FUNCT__
493db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense"
4940481f469SBarry Smith PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info)
495db4efbfdSBarry Smith {
496db4efbfdSBarry Smith   PetscFunctionBegin;
497c3ef05f6SHong Zhang   fact->assembled                  = PETSC_TRUE;
498719d5645SBarry Smith   fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense;
499db4efbfdSBarry Smith   PetscFunctionReturn(0);
500db4efbfdSBarry Smith }
501db4efbfdSBarry Smith 
502db4efbfdSBarry Smith #undef __FUNCT__
503db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactorSymbolic_SeqDense"
5040481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info)
505db4efbfdSBarry Smith {
506db4efbfdSBarry Smith   PetscFunctionBegin;
507b66fe19dSMatthew G Knepley   fact->preallocated         = PETSC_TRUE;
508c3ef05f6SHong Zhang   fact->assembled            = PETSC_TRUE;
509719d5645SBarry Smith   fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense;
510db4efbfdSBarry Smith   PetscFunctionReturn(0);
511db4efbfdSBarry Smith }
512db4efbfdSBarry Smith 
513bb5747d9SMatthew Knepley EXTERN_C_BEGIN
514db4efbfdSBarry Smith #undef __FUNCT__
515db4efbfdSBarry Smith #define __FUNCT__ "MatGetFactor_seqdense_petsc"
516db4efbfdSBarry Smith PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact)
517db4efbfdSBarry Smith {
518db4efbfdSBarry Smith   PetscErrorCode ierr;
519db4efbfdSBarry Smith 
520db4efbfdSBarry Smith   PetscFunctionBegin;
521db4efbfdSBarry Smith   ierr = MatCreate(((PetscObject)A)->comm,fact);CHKERRQ(ierr);
522db4efbfdSBarry Smith   ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
523db4efbfdSBarry Smith   ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr);
524db4efbfdSBarry Smith   if (ftype == MAT_FACTOR_LU){
525db4efbfdSBarry Smith     (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense;
526db4efbfdSBarry Smith   } else {
527db4efbfdSBarry Smith     (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense;
528db4efbfdSBarry Smith   }
529d5f3da31SBarry Smith   (*fact)->factortype = ftype;
530db4efbfdSBarry Smith   PetscFunctionReturn(0);
531db4efbfdSBarry Smith }
532bb5747d9SMatthew Knepley EXTERN_C_END
533db4efbfdSBarry Smith 
534289bc588SBarry Smith /* ------------------------------------------------------------------*/
5354a2ae208SSatish Balay #undef __FUNCT__
53641f059aeSBarry Smith #define __FUNCT__ "MatSOR_SeqDense"
53741f059aeSBarry Smith PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx)
538289bc588SBarry Smith {
539c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
54087828ca2SBarry Smith   PetscScalar    *x,*b,*v = mat->v,zero = 0.0,xt;
541dfbe8321SBarry Smith   PetscErrorCode ierr;
542d0f46423SBarry Smith   PetscInt       m = A->rmap->n,i;
5430805154bSBarry Smith   PetscBLASInt   o = 1,bm = PetscBLASIntCast(m);
544289bc588SBarry Smith 
5453a40ed3dSBarry Smith   PetscFunctionBegin;
546289bc588SBarry Smith   if (flag & SOR_ZERO_INITIAL_GUESS) {
54771044d3cSBarry Smith     /* this is a hack fix, should have another version without the second BLASdot */
5482dcb1b2aSMatthew Knepley     ierr = VecSet(xx,zero);CHKERRQ(ierr);
549289bc588SBarry Smith   }
5501ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
5511ebc52fbSHong Zhang   ierr = VecGetArray(bb,&b);CHKERRQ(ierr);
552b965ef7fSBarry Smith   its  = its*lits;
553e32f2f54SBarry 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);
554289bc588SBarry Smith   while (its--) {
555fccaa45eSBarry Smith     if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP){
556289bc588SBarry Smith       for (i=0; i<m; i++) {
55771044d3cSBarry Smith         xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o);
55855a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
559289bc588SBarry Smith       }
560289bc588SBarry Smith     }
561fccaa45eSBarry Smith     if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP){
562289bc588SBarry Smith       for (i=m-1; i>=0; i--) {
56371044d3cSBarry Smith         xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o);
56455a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
565289bc588SBarry Smith       }
566289bc588SBarry Smith     }
567289bc588SBarry Smith   }
5681ebc52fbSHong Zhang   ierr = VecRestoreArray(bb,&b);CHKERRQ(ierr);
5691ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
5703a40ed3dSBarry Smith   PetscFunctionReturn(0);
571289bc588SBarry Smith }
572289bc588SBarry Smith 
573289bc588SBarry Smith /* -----------------------------------------------------------------*/
5744a2ae208SSatish Balay #undef __FUNCT__
5754a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense"
576dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy)
577289bc588SBarry Smith {
578c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
57987828ca2SBarry Smith   PetscScalar    *v = mat->v,*x,*y;
580dfbe8321SBarry Smith   PetscErrorCode ierr;
5810805154bSBarry Smith   PetscBLASInt   m, n,_One=1;
582ea709b57SSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
5833a40ed3dSBarry Smith 
5843a40ed3dSBarry Smith   PetscFunctionBegin;
585d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
586d0f46423SBarry Smith   n = PetscBLASIntCast(A->cmap->n);
587d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
5881ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
5891ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
59071044d3cSBarry Smith   BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One);
5911ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
5921ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
593dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
5943a40ed3dSBarry Smith   PetscFunctionReturn(0);
595289bc588SBarry Smith }
596800995b7SMatthew Knepley 
5974a2ae208SSatish Balay #undef __FUNCT__
5984a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense"
599dfbe8321SBarry Smith PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy)
600289bc588SBarry Smith {
601c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
60287828ca2SBarry Smith   PetscScalar    *v = mat->v,*x,*y,_DOne=1.0,_DZero=0.0;
603dfbe8321SBarry Smith   PetscErrorCode ierr;
6040805154bSBarry Smith   PetscBLASInt   m, n, _One=1;
6053a40ed3dSBarry Smith 
6063a40ed3dSBarry Smith   PetscFunctionBegin;
607d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
608d0f46423SBarry Smith   n = PetscBLASIntCast(A->cmap->n);
609d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
6101ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
6111ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
61271044d3cSBarry Smith   BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One);
6131ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6141ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
615dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr);
6163a40ed3dSBarry Smith   PetscFunctionReturn(0);
617289bc588SBarry Smith }
6186ee01492SSatish Balay 
6194a2ae208SSatish Balay #undef __FUNCT__
6204a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense"
621dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
622289bc588SBarry Smith {
623c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
62487828ca2SBarry Smith   PetscScalar    *v = mat->v,*x,*y,_DOne=1.0;
625dfbe8321SBarry Smith   PetscErrorCode ierr;
6260805154bSBarry Smith   PetscBLASInt   m, n, _One=1;
6273a40ed3dSBarry Smith 
6283a40ed3dSBarry Smith   PetscFunctionBegin;
629d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
630d0f46423SBarry Smith   n = PetscBLASIntCast(A->cmap->n);
631d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
632600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
6331ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
6341ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
63571044d3cSBarry Smith   BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One);
6361ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6371ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
638dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
6393a40ed3dSBarry Smith   PetscFunctionReturn(0);
640289bc588SBarry Smith }
6416ee01492SSatish Balay 
6424a2ae208SSatish Balay #undef __FUNCT__
6434a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense"
644dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
645289bc588SBarry Smith {
646c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
64787828ca2SBarry Smith   PetscScalar    *v = mat->v,*x,*y;
648dfbe8321SBarry Smith   PetscErrorCode ierr;
6490805154bSBarry Smith   PetscBLASInt   m, n, _One=1;
65087828ca2SBarry Smith   PetscScalar    _DOne=1.0;
6513a40ed3dSBarry Smith 
6523a40ed3dSBarry Smith   PetscFunctionBegin;
653d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
654d0f46423SBarry Smith   n = PetscBLASIntCast(A->cmap->n);
655d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
656600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
6571ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
6581ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
65971044d3cSBarry Smith   BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One);
6601ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6611ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
662dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
6633a40ed3dSBarry Smith   PetscFunctionReturn(0);
664289bc588SBarry Smith }
665289bc588SBarry Smith 
666289bc588SBarry Smith /* -----------------------------------------------------------------*/
6674a2ae208SSatish Balay #undef __FUNCT__
6684a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense"
66913f74950SBarry Smith PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
670289bc588SBarry Smith {
671c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
67287828ca2SBarry Smith   PetscScalar    *v;
6736849ba73SBarry Smith   PetscErrorCode ierr;
67413f74950SBarry Smith   PetscInt       i;
67567e560aaSBarry Smith 
6763a40ed3dSBarry Smith   PetscFunctionBegin;
677d0f46423SBarry Smith   *ncols = A->cmap->n;
678289bc588SBarry Smith   if (cols) {
679d0f46423SBarry Smith     ierr = PetscMalloc((A->cmap->n+1)*sizeof(PetscInt),cols);CHKERRQ(ierr);
680d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) (*cols)[i] = i;
681289bc588SBarry Smith   }
682289bc588SBarry Smith   if (vals) {
683d0f46423SBarry Smith     ierr = PetscMalloc((A->cmap->n+1)*sizeof(PetscScalar),vals);CHKERRQ(ierr);
684289bc588SBarry Smith     v    = mat->v + row;
685d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;}
686289bc588SBarry Smith   }
6873a40ed3dSBarry Smith   PetscFunctionReturn(0);
688289bc588SBarry Smith }
6896ee01492SSatish Balay 
6904a2ae208SSatish Balay #undef __FUNCT__
6914a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense"
69213f74950SBarry Smith PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
693289bc588SBarry Smith {
694dfbe8321SBarry Smith   PetscErrorCode ierr;
695606d414cSSatish Balay   PetscFunctionBegin;
696606d414cSSatish Balay   if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);}
697606d414cSSatish Balay   if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); }
6983a40ed3dSBarry Smith   PetscFunctionReturn(0);
699289bc588SBarry Smith }
700289bc588SBarry Smith /* ----------------------------------------------------------------*/
7014a2ae208SSatish Balay #undef __FUNCT__
7024a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense"
70313f74950SBarry Smith PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv)
704289bc588SBarry Smith {
705c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
70613f74950SBarry Smith   PetscInt     i,j,idx=0;
707d6dfbf8fSBarry Smith 
7083a40ed3dSBarry Smith   PetscFunctionBegin;
70971fd2e92SBarry Smith   if (v) PetscValidScalarPointer(v,6);
710289bc588SBarry Smith   if (!mat->roworiented) {
711dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
712289bc588SBarry Smith       for (j=0; j<n; j++) {
713cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
7142515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
715e32f2f54SBarry 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);
71658804f6dSBarry Smith #endif
717289bc588SBarry Smith         for (i=0; i<m; i++) {
718cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
7192515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
720e32f2f54SBarry 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);
72158804f6dSBarry Smith #endif
722cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
723289bc588SBarry Smith         }
724289bc588SBarry Smith       }
7253a40ed3dSBarry Smith     } else {
726289bc588SBarry Smith       for (j=0; j<n; j++) {
727cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
7282515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
729e32f2f54SBarry 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);
73058804f6dSBarry Smith #endif
731289bc588SBarry Smith         for (i=0; i<m; i++) {
732cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
7332515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
734e32f2f54SBarry 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);
73558804f6dSBarry Smith #endif
736cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
737289bc588SBarry Smith         }
738289bc588SBarry Smith       }
739289bc588SBarry Smith     }
7403a40ed3dSBarry Smith   } else {
741dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
742e8d4e0b9SBarry Smith       for (i=0; i<m; i++) {
743cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
7442515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
745e32f2f54SBarry Smith         if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
74658804f6dSBarry Smith #endif
747e8d4e0b9SBarry Smith         for (j=0; j<n; j++) {
748cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
7492515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
750e32f2f54SBarry 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);
75158804f6dSBarry Smith #endif
752cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
753e8d4e0b9SBarry Smith         }
754e8d4e0b9SBarry Smith       }
7553a40ed3dSBarry Smith     } else {
756289bc588SBarry Smith       for (i=0; i<m; i++) {
757cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
7582515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
759e32f2f54SBarry 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);
76058804f6dSBarry Smith #endif
761289bc588SBarry Smith         for (j=0; j<n; j++) {
762cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
7632515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
764e32f2f54SBarry 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);
76558804f6dSBarry Smith #endif
766cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
767289bc588SBarry Smith         }
768289bc588SBarry Smith       }
769289bc588SBarry Smith     }
770e8d4e0b9SBarry Smith   }
7713a40ed3dSBarry Smith   PetscFunctionReturn(0);
772289bc588SBarry Smith }
773e8d4e0b9SBarry Smith 
7744a2ae208SSatish Balay #undef __FUNCT__
7754a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense"
77613f74950SBarry Smith PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[])
777ae80bb75SLois Curfman McInnes {
778ae80bb75SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
77913f74950SBarry Smith   PetscInt     i,j;
780ae80bb75SLois Curfman McInnes 
7813a40ed3dSBarry Smith   PetscFunctionBegin;
782ae80bb75SLois Curfman McInnes   /* row-oriented output */
783ae80bb75SLois Curfman McInnes   for (i=0; i<m; i++) {
78497e567efSBarry Smith     if (indexm[i] < 0) {v += n;continue;}
785e32f2f54SBarry 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);
786ae80bb75SLois Curfman McInnes     for (j=0; j<n; j++) {
7876f31f424SBarry Smith       if (indexn[j] < 0) {v++; continue;}
788e32f2f54SBarry 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);
78997e567efSBarry Smith       *v++ = mat->v[indexn[j]*mat->lda + indexm[i]];
790ae80bb75SLois Curfman McInnes     }
791ae80bb75SLois Curfman McInnes   }
7923a40ed3dSBarry Smith   PetscFunctionReturn(0);
793ae80bb75SLois Curfman McInnes }
794ae80bb75SLois Curfman McInnes 
795289bc588SBarry Smith /* -----------------------------------------------------------------*/
796289bc588SBarry Smith 
7974a2ae208SSatish Balay #undef __FUNCT__
7985bba2384SShri Abhyankar #define __FUNCT__ "MatLoad_SeqDense"
799112444f4SShri Abhyankar PetscErrorCode MatLoad_SeqDense(Mat newmat,PetscViewer viewer)
800aabbc4fbSShri Abhyankar {
801aabbc4fbSShri Abhyankar   Mat_SeqDense   *a;
802aabbc4fbSShri Abhyankar   PetscErrorCode ierr;
803aabbc4fbSShri Abhyankar   PetscInt       *scols,i,j,nz,header[4];
804aabbc4fbSShri Abhyankar   int            fd;
805aabbc4fbSShri Abhyankar   PetscMPIInt    size;
806aabbc4fbSShri Abhyankar   PetscInt       *rowlengths = 0,M,N,*cols,grows,gcols;
807aabbc4fbSShri Abhyankar   PetscScalar    *vals,*svals,*v,*w;
808aabbc4fbSShri Abhyankar   MPI_Comm       comm = ((PetscObject)viewer)->comm;
809aabbc4fbSShri Abhyankar 
810aabbc4fbSShri Abhyankar   PetscFunctionBegin;
811aabbc4fbSShri Abhyankar   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
812aabbc4fbSShri Abhyankar   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor");
813aabbc4fbSShri Abhyankar   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
814aabbc4fbSShri Abhyankar   ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr);
815aabbc4fbSShri Abhyankar   if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object");
816aabbc4fbSShri Abhyankar   M = header[1]; N = header[2]; nz = header[3];
817aabbc4fbSShri Abhyankar 
818aabbc4fbSShri Abhyankar   /* set global size if not set already*/
819aabbc4fbSShri Abhyankar   if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) {
820aabbc4fbSShri Abhyankar     ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr);
821aabbc4fbSShri Abhyankar   } else {
822aabbc4fbSShri Abhyankar     /* if sizes and type are already set, check if the vector global sizes are correct */
823aabbc4fbSShri Abhyankar     ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr);
824aabbc4fbSShri 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);
825aabbc4fbSShri Abhyankar   }
826aabbc4fbSShri Abhyankar   ierr = MatSeqDenseSetPreallocation(newmat,PETSC_NULL);CHKERRQ(ierr);
827aabbc4fbSShri Abhyankar 
828aabbc4fbSShri Abhyankar   if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */
829aabbc4fbSShri Abhyankar     a    = (Mat_SeqDense*)newmat->data;
830aabbc4fbSShri Abhyankar     v    = a->v;
831aabbc4fbSShri Abhyankar     /* Allocate some temp space to read in the values and then flip them
832aabbc4fbSShri Abhyankar        from row major to column major */
833aabbc4fbSShri Abhyankar     ierr = PetscMalloc((M*N > 0 ? M*N : 1)*sizeof(PetscScalar),&w);CHKERRQ(ierr);
834aabbc4fbSShri Abhyankar     /* read in nonzero values */
835aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr);
836aabbc4fbSShri Abhyankar     /* now flip the values and store them in the matrix*/
837aabbc4fbSShri Abhyankar     for (j=0; j<N; j++) {
838aabbc4fbSShri Abhyankar       for (i=0; i<M; i++) {
839aabbc4fbSShri Abhyankar         *v++ =w[i*N+j];
840aabbc4fbSShri Abhyankar       }
841aabbc4fbSShri Abhyankar     }
842aabbc4fbSShri Abhyankar     ierr = PetscFree(w);CHKERRQ(ierr);
843aabbc4fbSShri Abhyankar   } else {
844aabbc4fbSShri Abhyankar     /* read row lengths */
845aabbc4fbSShri Abhyankar     ierr = PetscMalloc((M+1)*sizeof(PetscInt),&rowlengths);CHKERRQ(ierr);
846aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr);
847aabbc4fbSShri Abhyankar 
848aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
849aabbc4fbSShri Abhyankar     v = a->v;
850aabbc4fbSShri Abhyankar 
851aabbc4fbSShri Abhyankar     /* read column indices and nonzeros */
852aabbc4fbSShri Abhyankar     ierr = PetscMalloc((nz+1)*sizeof(PetscInt),&scols);CHKERRQ(ierr);
853aabbc4fbSShri Abhyankar     cols = scols;
854aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr);
855aabbc4fbSShri Abhyankar     ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&svals);CHKERRQ(ierr);
856aabbc4fbSShri Abhyankar     vals = svals;
857aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr);
858aabbc4fbSShri Abhyankar 
859aabbc4fbSShri Abhyankar     /* insert into matrix */
860aabbc4fbSShri Abhyankar     for (i=0; i<M; i++) {
861aabbc4fbSShri Abhyankar       for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j];
862aabbc4fbSShri Abhyankar       svals += rowlengths[i]; scols += rowlengths[i];
863aabbc4fbSShri Abhyankar     }
864aabbc4fbSShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
865aabbc4fbSShri Abhyankar     ierr = PetscFree(cols);CHKERRQ(ierr);
866aabbc4fbSShri Abhyankar     ierr = PetscFree(rowlengths);CHKERRQ(ierr);
867aabbc4fbSShri Abhyankar   }
868aabbc4fbSShri Abhyankar   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
869aabbc4fbSShri Abhyankar   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
870aabbc4fbSShri Abhyankar 
871aabbc4fbSShri Abhyankar   PetscFunctionReturn(0);
872aabbc4fbSShri Abhyankar }
873aabbc4fbSShri Abhyankar 
874aabbc4fbSShri Abhyankar #undef __FUNCT__
8754a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII"
8766849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer)
877289bc588SBarry Smith {
878932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
879dfbe8321SBarry Smith   PetscErrorCode    ierr;
88013f74950SBarry Smith   PetscInt          i,j;
8812dcb1b2aSMatthew Knepley   const char        *name;
88287828ca2SBarry Smith   PetscScalar       *v;
883f3ef73ceSBarry Smith   PetscViewerFormat format;
8845f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX)
885ace3abfcSBarry Smith   PetscBool         allreal = PETSC_TRUE;
8865f481a85SSatish Balay #endif
887932b0c3eSLois Curfman McInnes 
8883a40ed3dSBarry Smith   PetscFunctionBegin;
889b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
890456192e2SBarry Smith   if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
8913a40ed3dSBarry Smith     PetscFunctionReturn(0);  /* do nothing for now */
892fb9695e5SSatish Balay   } else if (format == PETSC_VIEWER_ASCII_COMMON) {
893d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
8947566de4bSShri Abhyankar     ierr = PetscObjectPrintClassNamePrefixType((PetscObject)A,viewer,"Matrix Object");CHKERRQ(ierr);
895d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
89644cd7ae7SLois Curfman McInnes       v = a->v + i;
89777431f27SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr);
898d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
899aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
900329f5518SBarry Smith         if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) {
901a83599f4SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %G + %G i) ",j,PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr);
902329f5518SBarry Smith         } else if (PetscRealPart(*v)) {
903a83599f4SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,PetscRealPart(*v));CHKERRQ(ierr);
9046831982aSBarry Smith         }
90580cd9d93SLois Curfman McInnes #else
9066831982aSBarry Smith         if (*v) {
907a83599f4SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,*v);CHKERRQ(ierr);
9086831982aSBarry Smith         }
90980cd9d93SLois Curfman McInnes #endif
9101b807ce4Svictorle         v += a->lda;
91180cd9d93SLois Curfman McInnes       }
912b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
91380cd9d93SLois Curfman McInnes     }
914d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
9153a40ed3dSBarry Smith   } else {
916d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
917aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
91847989497SBarry Smith     /* determine if matrix has all real values */
91947989497SBarry Smith     v = a->v;
920d0f46423SBarry Smith     for (i=0; i<A->rmap->n*A->cmap->n; i++) {
921ffac6cdbSBarry Smith 	if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break ;}
92247989497SBarry Smith     }
92347989497SBarry Smith #endif
924fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
9253a7fca6bSBarry Smith       ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr);
926d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr);
927d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
928fb9695e5SSatish Balay       ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr);
9297566de4bSShri Abhyankar     } else {
9307566de4bSShri Abhyankar       ierr = PetscObjectPrintClassNamePrefixType((PetscObject)A,viewer,"Matrix Object");CHKERRQ(ierr);
931ffac6cdbSBarry Smith     }
932ffac6cdbSBarry Smith 
933d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
934932b0c3eSLois Curfman McInnes       v = a->v + i;
935d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
936aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
93747989497SBarry Smith         if (allreal) {
938f32d5d43SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",PetscRealPart(*v));CHKERRQ(ierr);
93947989497SBarry Smith         } else {
940f32d5d43SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr);
94147989497SBarry Smith         }
942289bc588SBarry Smith #else
943f32d5d43SBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",*v);CHKERRQ(ierr);
944289bc588SBarry Smith #endif
9451b807ce4Svictorle 	v += a->lda;
946289bc588SBarry Smith       }
947b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
948289bc588SBarry Smith     }
949fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
950b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr);
951ffac6cdbSBarry Smith     }
952d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
953da3a660dSBarry Smith   }
954b0a32e0cSBarry Smith   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
9553a40ed3dSBarry Smith   PetscFunctionReturn(0);
956289bc588SBarry Smith }
957289bc588SBarry Smith 
9584a2ae208SSatish Balay #undef __FUNCT__
9594a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary"
9606849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer)
961932b0c3eSLois Curfman McInnes {
962932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
9636849ba73SBarry Smith   PetscErrorCode    ierr;
96413f74950SBarry Smith   int               fd;
965d0f46423SBarry Smith   PetscInt          ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n;
966f4403165SShri Abhyankar   PetscScalar       *v,*anonz,*vals;
967f4403165SShri Abhyankar   PetscViewerFormat format;
968932b0c3eSLois Curfman McInnes 
9693a40ed3dSBarry Smith   PetscFunctionBegin;
970b0a32e0cSBarry Smith   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
97190ace30eSBarry Smith 
972f4403165SShri Abhyankar   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
973f4403165SShri Abhyankar   if (format == PETSC_VIEWER_NATIVE) {
974f4403165SShri Abhyankar     /* store the matrix as a dense matrix */
975f4403165SShri Abhyankar     ierr = PetscMalloc(4*sizeof(PetscInt),&col_lens);CHKERRQ(ierr);
976f4403165SShri Abhyankar     col_lens[0] = MAT_FILE_CLASSID;
977f4403165SShri Abhyankar     col_lens[1] = m;
978f4403165SShri Abhyankar     col_lens[2] = n;
979f4403165SShri Abhyankar     col_lens[3] = MATRIX_BINARY_FORMAT_DENSE;
980f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
981f4403165SShri Abhyankar     ierr = PetscFree(col_lens);CHKERRQ(ierr);
982f4403165SShri Abhyankar 
983f4403165SShri Abhyankar     /* write out matrix, by rows */
984f4403165SShri Abhyankar     ierr = PetscMalloc((m*n+1)*sizeof(PetscScalar),&vals);CHKERRQ(ierr);
985f4403165SShri Abhyankar     v    = a->v;
986f4403165SShri Abhyankar     for (j=0; j<n; j++) {
987f4403165SShri Abhyankar       for (i=0; i<m; i++) {
988f4403165SShri Abhyankar         vals[j + i*n] = *v++;
989f4403165SShri Abhyankar       }
990f4403165SShri Abhyankar     }
991f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
992f4403165SShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
993f4403165SShri Abhyankar   } else {
99413f74950SBarry Smith     ierr = PetscMalloc((4+nz)*sizeof(PetscInt),&col_lens);CHKERRQ(ierr);
9950700a824SBarry Smith     col_lens[0] = MAT_FILE_CLASSID;
996932b0c3eSLois Curfman McInnes     col_lens[1] = m;
997932b0c3eSLois Curfman McInnes     col_lens[2] = n;
998932b0c3eSLois Curfman McInnes     col_lens[3] = nz;
999932b0c3eSLois Curfman McInnes 
1000932b0c3eSLois Curfman McInnes     /* store lengths of each row and write (including header) to file */
1001932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) col_lens[4+i] = n;
10026f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
1003932b0c3eSLois Curfman McInnes 
1004932b0c3eSLois Curfman McInnes     /* Possibly should write in smaller increments, not whole matrix at once? */
1005932b0c3eSLois Curfman McInnes     /* store column indices (zero start index) */
1006932b0c3eSLois Curfman McInnes     ict = 0;
1007932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1008932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) col_lens[ict++] = j;
1009932b0c3eSLois Curfman McInnes     }
10106f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
1011606d414cSSatish Balay     ierr = PetscFree(col_lens);CHKERRQ(ierr);
1012932b0c3eSLois Curfman McInnes 
1013932b0c3eSLois Curfman McInnes     /* store nonzero values */
101487828ca2SBarry Smith     ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&anonz);CHKERRQ(ierr);
1015932b0c3eSLois Curfman McInnes     ict  = 0;
1016932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1017932b0c3eSLois Curfman McInnes       v = a->v + i;
1018932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) {
10191b807ce4Svictorle         anonz[ict++] = *v; v += a->lda;
1020932b0c3eSLois Curfman McInnes       }
1021932b0c3eSLois Curfman McInnes     }
10226f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
1023606d414cSSatish Balay     ierr = PetscFree(anonz);CHKERRQ(ierr);
1024f4403165SShri Abhyankar   }
10253a40ed3dSBarry Smith   PetscFunctionReturn(0);
1026932b0c3eSLois Curfman McInnes }
1027932b0c3eSLois Curfman McInnes 
10284a2ae208SSatish Balay #undef __FUNCT__
10294a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom"
1030dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa)
1031f1af5d2fSBarry Smith {
1032f1af5d2fSBarry Smith   Mat               A = (Mat) Aa;
1033f1af5d2fSBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
10346849ba73SBarry Smith   PetscErrorCode    ierr;
1035d0f46423SBarry Smith   PetscInt          m = A->rmap->n,n = A->cmap->n,color,i,j;
103687828ca2SBarry Smith   PetscScalar       *v = a->v;
1037b0a32e0cSBarry Smith   PetscViewer       viewer;
1038b0a32e0cSBarry Smith   PetscDraw         popup;
1039329f5518SBarry Smith   PetscReal         xl,yl,xr,yr,x_l,x_r,y_l,y_r,scale,maxv = 0.0;
1040f3ef73ceSBarry Smith   PetscViewerFormat format;
1041f1af5d2fSBarry Smith 
1042f1af5d2fSBarry Smith   PetscFunctionBegin;
1043f1af5d2fSBarry Smith 
1044f1af5d2fSBarry Smith   ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr);
1045b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1046b0a32e0cSBarry Smith   ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr);
1047f1af5d2fSBarry Smith 
1048f1af5d2fSBarry Smith   /* Loop over matrix elements drawing boxes */
1049fb9695e5SSatish Balay   if (format != PETSC_VIEWER_DRAW_CONTOUR) {
1050f1af5d2fSBarry Smith     /* Blue for negative and Red for positive */
1051b0a32e0cSBarry Smith     color = PETSC_DRAW_BLUE;
1052f1af5d2fSBarry Smith     for(j = 0; j < n; j++) {
1053f1af5d2fSBarry Smith       x_l = j;
1054f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1055f1af5d2fSBarry Smith       for(i = 0; i < m; i++) {
1056f1af5d2fSBarry Smith         y_l = m - i - 1.0;
1057f1af5d2fSBarry Smith         y_r = y_l + 1.0;
1058f1af5d2fSBarry Smith #if defined(PETSC_USE_COMPLEX)
1059329f5518SBarry Smith         if (PetscRealPart(v[j*m+i]) >  0.) {
1060b0a32e0cSBarry Smith           color = PETSC_DRAW_RED;
1061329f5518SBarry Smith         } else if (PetscRealPart(v[j*m+i]) <  0.) {
1062b0a32e0cSBarry Smith           color = PETSC_DRAW_BLUE;
1063f1af5d2fSBarry Smith         } else {
1064f1af5d2fSBarry Smith           continue;
1065f1af5d2fSBarry Smith         }
1066f1af5d2fSBarry Smith #else
1067f1af5d2fSBarry Smith         if (v[j*m+i] >  0.) {
1068b0a32e0cSBarry Smith           color = PETSC_DRAW_RED;
1069f1af5d2fSBarry Smith         } else if (v[j*m+i] <  0.) {
1070b0a32e0cSBarry Smith           color = PETSC_DRAW_BLUE;
1071f1af5d2fSBarry Smith         } else {
1072f1af5d2fSBarry Smith           continue;
1073f1af5d2fSBarry Smith         }
1074f1af5d2fSBarry Smith #endif
1075b0a32e0cSBarry Smith         ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1076f1af5d2fSBarry Smith       }
1077f1af5d2fSBarry Smith     }
1078f1af5d2fSBarry Smith   } else {
1079f1af5d2fSBarry Smith     /* use contour shading to indicate magnitude of values */
1080f1af5d2fSBarry Smith     /* first determine max of all nonzero values */
1081f1af5d2fSBarry Smith     for(i = 0; i < m*n; i++) {
1082f1af5d2fSBarry Smith       if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]);
1083f1af5d2fSBarry Smith     }
1084b0a32e0cSBarry Smith     scale = (245.0 - PETSC_DRAW_BASIC_COLORS)/maxv;
1085b0a32e0cSBarry Smith     ierr  = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr);
1086b0a32e0cSBarry Smith     if (popup) {ierr  = PetscDrawScalePopup(popup,0.0,maxv);CHKERRQ(ierr);}
1087f1af5d2fSBarry Smith     for(j = 0; j < n; j++) {
1088f1af5d2fSBarry Smith       x_l = j;
1089f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1090f1af5d2fSBarry Smith       for(i = 0; i < m; i++) {
1091f1af5d2fSBarry Smith         y_l   = m - i - 1.0;
1092f1af5d2fSBarry Smith         y_r   = y_l + 1.0;
1093b0a32e0cSBarry Smith         color = PETSC_DRAW_BASIC_COLORS + (int)(scale*PetscAbsScalar(v[j*m+i]));
1094b0a32e0cSBarry Smith         ierr  = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1095f1af5d2fSBarry Smith       }
1096f1af5d2fSBarry Smith     }
1097f1af5d2fSBarry Smith   }
1098f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1099f1af5d2fSBarry Smith }
1100f1af5d2fSBarry Smith 
11014a2ae208SSatish Balay #undef __FUNCT__
11024a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw"
1103dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer)
1104f1af5d2fSBarry Smith {
1105b0a32e0cSBarry Smith   PetscDraw      draw;
1106ace3abfcSBarry Smith   PetscBool      isnull;
1107329f5518SBarry Smith   PetscReal      xr,yr,xl,yl,h,w;
1108dfbe8321SBarry Smith   PetscErrorCode ierr;
1109f1af5d2fSBarry Smith 
1110f1af5d2fSBarry Smith   PetscFunctionBegin;
1111b0a32e0cSBarry Smith   ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
1112b0a32e0cSBarry Smith   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
1113abc0a331SBarry Smith   if (isnull) PetscFunctionReturn(0);
1114f1af5d2fSBarry Smith 
1115f1af5d2fSBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr);
1116d0f46423SBarry Smith   xr  = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0;
1117f1af5d2fSBarry Smith   xr += w;    yr += h;  xl = -w;     yl = -h;
1118b0a32e0cSBarry Smith   ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr);
1119b0a32e0cSBarry Smith   ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr);
1120f1af5d2fSBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",PETSC_NULL);CHKERRQ(ierr);
1121f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1122f1af5d2fSBarry Smith }
1123f1af5d2fSBarry Smith 
11244a2ae208SSatish Balay #undef __FUNCT__
11254a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense"
1126dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer)
1127932b0c3eSLois Curfman McInnes {
1128dfbe8321SBarry Smith   PetscErrorCode ierr;
1129ace3abfcSBarry Smith   PetscBool      iascii,isbinary,isdraw;
1130932b0c3eSLois Curfman McInnes 
11313a40ed3dSBarry Smith   PetscFunctionBegin;
11322692d6eeSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
11332692d6eeSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
11342692d6eeSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
11350f5bd95cSBarry Smith 
1136c45a1595SBarry Smith   if (iascii) {
1137c45a1595SBarry Smith     ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr);
11380f5bd95cSBarry Smith   } else if (isbinary) {
11393a40ed3dSBarry Smith     ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr);
1140f1af5d2fSBarry Smith   } else if (isdraw) {
1141f1af5d2fSBarry Smith     ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr);
11425cd90555SBarry Smith   } else {
1143e32f2f54SBarry Smith     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Viewer type %s not supported by dense matrix",((PetscObject)viewer)->type_name);
1144932b0c3eSLois Curfman McInnes   }
11453a40ed3dSBarry Smith   PetscFunctionReturn(0);
1146932b0c3eSLois Curfman McInnes }
1147289bc588SBarry Smith 
11484a2ae208SSatish Balay #undef __FUNCT__
11494a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense"
1150dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqDense(Mat mat)
1151289bc588SBarry Smith {
1152ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)mat->data;
1153dfbe8321SBarry Smith   PetscErrorCode ierr;
115490f02eecSBarry Smith 
11553a40ed3dSBarry Smith   PetscFunctionBegin;
1156aa482453SBarry Smith #if defined(PETSC_USE_LOG)
1157d0f46423SBarry Smith   PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n);
1158a5a9c739SBarry Smith #endif
115905b42c5fSBarry Smith   ierr = PetscFree(l->pivots);CHKERRQ(ierr);
11606857c123SSatish Balay   if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);}
1161bf0cc555SLisandro Dalcin   ierr = PetscFree(mat->data);CHKERRQ(ierr);
1162dbd8c25aSHong Zhang 
1163dbd8c25aSHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr);
1164901853e0SKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatSeqDenseSetPreallocation_C","",PETSC_NULL);CHKERRQ(ierr);
11654ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMult_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr);
11664ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr);
11674ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr);
11683a40ed3dSBarry Smith   PetscFunctionReturn(0);
1169289bc588SBarry Smith }
1170289bc588SBarry Smith 
11714a2ae208SSatish Balay #undef __FUNCT__
11724a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense"
1173fc4dec0aSBarry Smith PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout)
1174289bc588SBarry Smith {
1175c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
11766849ba73SBarry Smith   PetscErrorCode ierr;
117713f74950SBarry Smith   PetscInt       k,j,m,n,M;
117887828ca2SBarry Smith   PetscScalar    *v,tmp;
117948b35521SBarry Smith 
11803a40ed3dSBarry Smith   PetscFunctionBegin;
1181d0f46423SBarry Smith   v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n;
1182e9695a30SBarry Smith   if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */
1183e7e72b3dSBarry Smith     if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place");
1184e7e72b3dSBarry Smith     else {
1185d3e5ee88SLois Curfman McInnes       for (j=0; j<m; j++) {
1186289bc588SBarry Smith         for (k=0; k<j; k++) {
11871b807ce4Svictorle           tmp = v[j + k*M];
11881b807ce4Svictorle           v[j + k*M] = v[k + j*M];
11891b807ce4Svictorle           v[k + j*M] = tmp;
1190289bc588SBarry Smith         }
1191289bc588SBarry Smith       }
1192d64ed03dSBarry Smith     }
11933a40ed3dSBarry Smith   } else { /* out-of-place transpose */
1194d3e5ee88SLois Curfman McInnes     Mat          tmat;
1195ec8511deSBarry Smith     Mat_SeqDense *tmatd;
119687828ca2SBarry Smith     PetscScalar  *v2;
1197ea709b57SSatish Balay 
1198fc4dec0aSBarry Smith     if (reuse == MAT_INITIAL_MATRIX) {
11997adad957SLisandro Dalcin       ierr  = MatCreate(((PetscObject)A)->comm,&tmat);CHKERRQ(ierr);
1200d0f46423SBarry Smith       ierr  = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr);
12017adad957SLisandro Dalcin       ierr  = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
12025c5985e7SKris Buschelman       ierr  = MatSeqDenseSetPreallocation(tmat,PETSC_NULL);CHKERRQ(ierr);
1203fc4dec0aSBarry Smith     } else {
1204fc4dec0aSBarry Smith       tmat = *matout;
1205fc4dec0aSBarry Smith     }
1206ec8511deSBarry Smith     tmatd = (Mat_SeqDense*)tmat->data;
12070de55854SLois Curfman McInnes     v = mat->v; v2 = tmatd->v;
1208d3e5ee88SLois Curfman McInnes     for (j=0; j<n; j++) {
12091b807ce4Svictorle       for (k=0; k<m; k++) v2[j + k*n] = v[k + j*M];
1210d3e5ee88SLois Curfman McInnes     }
12116d4a8577SBarry Smith     ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
12126d4a8577SBarry Smith     ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1213d3e5ee88SLois Curfman McInnes     *matout = tmat;
121448b35521SBarry Smith   }
12153a40ed3dSBarry Smith   PetscFunctionReturn(0);
1216289bc588SBarry Smith }
1217289bc588SBarry Smith 
12184a2ae208SSatish Balay #undef __FUNCT__
12194a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense"
1220ace3abfcSBarry Smith PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool  *flg)
1221289bc588SBarry Smith {
1222c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data;
1223c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data;
122413f74950SBarry Smith   PetscInt     i,j;
122587828ca2SBarry Smith   PetscScalar  *v1 = mat1->v,*v2 = mat2->v;
12269ea5d5aeSSatish Balay 
12273a40ed3dSBarry Smith   PetscFunctionBegin;
1228d0f46423SBarry Smith   if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1229d0f46423SBarry Smith   if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1230d0f46423SBarry Smith   for (i=0; i<A1->rmap->n; i++) {
12311b807ce4Svictorle     v1 = mat1->v+i; v2 = mat2->v+i;
1232d0f46423SBarry Smith     for (j=0; j<A1->cmap->n; j++) {
12333a40ed3dSBarry Smith       if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
12341b807ce4Svictorle       v1 += mat1->lda; v2 += mat2->lda;
12351b807ce4Svictorle     }
1236289bc588SBarry Smith   }
123777c4ece6SBarry Smith   *flg = PETSC_TRUE;
12383a40ed3dSBarry Smith   PetscFunctionReturn(0);
1239289bc588SBarry Smith }
1240289bc588SBarry Smith 
12414a2ae208SSatish Balay #undef __FUNCT__
12424a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense"
1243dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v)
1244289bc588SBarry Smith {
1245c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
1246dfbe8321SBarry Smith   PetscErrorCode ierr;
124713f74950SBarry Smith   PetscInt       i,n,len;
124887828ca2SBarry Smith   PetscScalar    *x,zero = 0.0;
124944cd7ae7SLois Curfman McInnes 
12503a40ed3dSBarry Smith   PetscFunctionBegin;
12512dcb1b2aSMatthew Knepley   ierr = VecSet(v,zero);CHKERRQ(ierr);
12527a97a34bSBarry Smith   ierr = VecGetSize(v,&n);CHKERRQ(ierr);
12531ebc52fbSHong Zhang   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1254d0f46423SBarry Smith   len = PetscMin(A->rmap->n,A->cmap->n);
1255e32f2f54SBarry Smith   if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec");
125644cd7ae7SLois Curfman McInnes   for (i=0; i<len; i++) {
12571b807ce4Svictorle     x[i] = mat->v[i*mat->lda + i];
1258289bc588SBarry Smith   }
12591ebc52fbSHong Zhang   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
12603a40ed3dSBarry Smith   PetscFunctionReturn(0);
1261289bc588SBarry Smith }
1262289bc588SBarry Smith 
12634a2ae208SSatish Balay #undef __FUNCT__
12644a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense"
1265dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr)
1266289bc588SBarry Smith {
1267c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
126887828ca2SBarry Smith   PetscScalar    *l,*r,x,*v;
1269dfbe8321SBarry Smith   PetscErrorCode ierr;
1270d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n;
127155659b69SBarry Smith 
12723a40ed3dSBarry Smith   PetscFunctionBegin;
127328988994SBarry Smith   if (ll) {
12747a97a34bSBarry Smith     ierr = VecGetSize(ll,&m);CHKERRQ(ierr);
12751ebc52fbSHong Zhang     ierr = VecGetArray(ll,&l);CHKERRQ(ierr);
1276e32f2f54SBarry Smith     if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size");
1277da3a660dSBarry Smith     for (i=0; i<m; i++) {
1278da3a660dSBarry Smith       x = l[i];
1279da3a660dSBarry Smith       v = mat->v + i;
1280da3a660dSBarry Smith       for (j=0; j<n; j++) { (*v) *= x; v+= m;}
1281da3a660dSBarry Smith     }
12821ebc52fbSHong Zhang     ierr = VecRestoreArray(ll,&l);CHKERRQ(ierr);
1283efee365bSSatish Balay     ierr = PetscLogFlops(n*m);CHKERRQ(ierr);
1284da3a660dSBarry Smith   }
128528988994SBarry Smith   if (rr) {
12867a97a34bSBarry Smith     ierr = VecGetSize(rr,&n);CHKERRQ(ierr);
12871ebc52fbSHong Zhang     ierr = VecGetArray(rr,&r);CHKERRQ(ierr);
1288e32f2f54SBarry Smith     if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size");
1289da3a660dSBarry Smith     for (i=0; i<n; i++) {
1290da3a660dSBarry Smith       x = r[i];
1291da3a660dSBarry Smith       v = mat->v + i*m;
1292da3a660dSBarry Smith       for (j=0; j<m; j++) { (*v++) *= x;}
1293da3a660dSBarry Smith     }
12941ebc52fbSHong Zhang     ierr = VecRestoreArray(rr,&r);CHKERRQ(ierr);
1295efee365bSSatish Balay     ierr = PetscLogFlops(n*m);CHKERRQ(ierr);
1296da3a660dSBarry Smith   }
12973a40ed3dSBarry Smith   PetscFunctionReturn(0);
1298289bc588SBarry Smith }
1299289bc588SBarry Smith 
13004a2ae208SSatish Balay #undef __FUNCT__
13014a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense"
1302dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm)
1303289bc588SBarry Smith {
1304c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
130587828ca2SBarry Smith   PetscScalar  *v = mat->v;
1306329f5518SBarry Smith   PetscReal    sum = 0.0;
1307d0f46423SBarry Smith   PetscInt     lda=mat->lda,m=A->rmap->n,i,j;
1308efee365bSSatish Balay   PetscErrorCode ierr;
130955659b69SBarry Smith 
13103a40ed3dSBarry Smith   PetscFunctionBegin;
1311289bc588SBarry Smith   if (type == NORM_FROBENIUS) {
1312a5ce6ee0Svictorle     if (lda>m) {
1313d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1314a5ce6ee0Svictorle 	v = mat->v+j*lda;
1315a5ce6ee0Svictorle 	for (i=0; i<m; i++) {
1316a5ce6ee0Svictorle #if defined(PETSC_USE_COMPLEX)
1317a5ce6ee0Svictorle 	  sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1318a5ce6ee0Svictorle #else
1319a5ce6ee0Svictorle 	  sum += (*v)*(*v); v++;
1320a5ce6ee0Svictorle #endif
1321a5ce6ee0Svictorle 	}
1322a5ce6ee0Svictorle       }
1323a5ce6ee0Svictorle     } else {
1324d0f46423SBarry Smith       for (i=0; i<A->cmap->n*A->rmap->n; i++) {
1325aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
1326329f5518SBarry Smith 	sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1327289bc588SBarry Smith #else
1328289bc588SBarry Smith 	sum += (*v)*(*v); v++;
1329289bc588SBarry Smith #endif
1330289bc588SBarry Smith       }
1331a5ce6ee0Svictorle     }
13328f1a2a5eSBarry Smith     *nrm = PetscSqrtReal(sum);
1333dc0b31edSSatish Balay     ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
13343a40ed3dSBarry Smith   } else if (type == NORM_1) {
1335064f8208SBarry Smith     *nrm = 0.0;
1336d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
13371b807ce4Svictorle       v = mat->v + j*mat->lda;
1338289bc588SBarry Smith       sum = 0.0;
1339d0f46423SBarry Smith       for (i=0; i<A->rmap->n; i++) {
134033a8263dSBarry Smith         sum += PetscAbsScalar(*v);  v++;
1341289bc588SBarry Smith       }
1342064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1343289bc588SBarry Smith     }
1344d0f46423SBarry Smith     ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr);
13453a40ed3dSBarry Smith   } else if (type == NORM_INFINITY) {
1346064f8208SBarry Smith     *nrm = 0.0;
1347d0f46423SBarry Smith     for (j=0; j<A->rmap->n; j++) {
1348289bc588SBarry Smith       v = mat->v + j;
1349289bc588SBarry Smith       sum = 0.0;
1350d0f46423SBarry Smith       for (i=0; i<A->cmap->n; i++) {
13511b807ce4Svictorle         sum += PetscAbsScalar(*v); v += mat->lda;
1352289bc588SBarry Smith       }
1353064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1354289bc588SBarry Smith     }
1355d0f46423SBarry Smith     ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr);
1356e7e72b3dSBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm");
13573a40ed3dSBarry Smith   PetscFunctionReturn(0);
1358289bc588SBarry Smith }
1359289bc588SBarry Smith 
13604a2ae208SSatish Balay #undef __FUNCT__
13614a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense"
1362ace3abfcSBarry Smith PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool  flg)
1363289bc588SBarry Smith {
1364c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *aij = (Mat_SeqDense*)A->data;
136563ba0a88SBarry Smith   PetscErrorCode ierr;
136667e560aaSBarry Smith 
13673a40ed3dSBarry Smith   PetscFunctionBegin;
1368b5a2b587SKris Buschelman   switch (op) {
1369b5a2b587SKris Buschelman   case MAT_ROW_ORIENTED:
13704e0d8c25SBarry Smith     aij->roworiented = flg;
1371b5a2b587SKris Buschelman     break;
1372512a5fc5SBarry Smith   case MAT_NEW_NONZERO_LOCATIONS:
1373b5a2b587SKris Buschelman   case MAT_NEW_NONZERO_LOCATION_ERR:
13743971808eSMatthew Knepley   case MAT_NEW_NONZERO_ALLOCATION_ERR:
13754e0d8c25SBarry Smith   case MAT_NEW_DIAGONALS:
137613fa8e87SLisandro Dalcin   case MAT_KEEP_NONZERO_PATTERN:
1377b5a2b587SKris Buschelman   case MAT_IGNORE_OFF_PROC_ENTRIES:
1378b5a2b587SKris Buschelman   case MAT_USE_HASH_TABLE:
137977e54ba9SKris Buschelman   case MAT_SYMMETRIC:
138077e54ba9SKris Buschelman   case MAT_STRUCTURALLY_SYMMETRIC:
13819a4540c5SBarry Smith   case MAT_HERMITIAN:
13829a4540c5SBarry Smith   case MAT_SYMMETRY_ETERNAL:
1383600fe468SBarry Smith   case MAT_IGNORE_LOWER_TRIANGULAR:
1384290bbb0aSBarry Smith     ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr);
138577e54ba9SKris Buschelman     break;
1386b5a2b587SKris Buschelman   default:
1387e32f2f54SBarry Smith     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]);
13883a40ed3dSBarry Smith   }
13893a40ed3dSBarry Smith   PetscFunctionReturn(0);
1390289bc588SBarry Smith }
1391289bc588SBarry Smith 
13924a2ae208SSatish Balay #undef __FUNCT__
13934a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense"
1394dfbe8321SBarry Smith PetscErrorCode MatZeroEntries_SeqDense(Mat A)
13956f0a148fSBarry Smith {
1396ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)A->data;
13976849ba73SBarry Smith   PetscErrorCode ierr;
1398d0f46423SBarry Smith   PetscInt       lda=l->lda,m=A->rmap->n,j;
13993a40ed3dSBarry Smith 
14003a40ed3dSBarry Smith   PetscFunctionBegin;
1401a5ce6ee0Svictorle   if (lda>m) {
1402d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1403a5ce6ee0Svictorle       ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
1404a5ce6ee0Svictorle     }
1405a5ce6ee0Svictorle   } else {
1406d0f46423SBarry Smith     ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1407a5ce6ee0Svictorle   }
14083a40ed3dSBarry Smith   PetscFunctionReturn(0);
14096f0a148fSBarry Smith }
14106f0a148fSBarry Smith 
14114a2ae208SSatish Balay #undef __FUNCT__
14124a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense"
14132b40b63fSBarry Smith PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b)
14146f0a148fSBarry Smith {
141597b48c8fSBarry Smith   PetscErrorCode    ierr;
1416ec8511deSBarry Smith   Mat_SeqDense      *l = (Mat_SeqDense*)A->data;
1417b9679d65SBarry Smith   PetscInt          m = l->lda, n = A->cmap->n, i,j;
141897b48c8fSBarry Smith   PetscScalar       *slot,*bb;
141997b48c8fSBarry Smith   const PetscScalar *xx;
142055659b69SBarry Smith 
14213a40ed3dSBarry Smith   PetscFunctionBegin;
1422b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG)
1423b9679d65SBarry Smith   for (i=0; i<N; i++) {
1424b9679d65SBarry Smith     if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed");
1425b9679d65SBarry 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);
1426b9679d65SBarry Smith   }
1427b9679d65SBarry Smith #endif
1428b9679d65SBarry Smith 
142997b48c8fSBarry Smith   /* fix right hand side if needed */
143097b48c8fSBarry Smith   if (x && b) {
143197b48c8fSBarry Smith     ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr);
143297b48c8fSBarry Smith     ierr = VecGetArray(b,&bb);CHKERRQ(ierr);
143397b48c8fSBarry Smith     for (i=0; i<N; i++) {
143497b48c8fSBarry Smith       bb[rows[i]] = diag*xx[rows[i]];
143597b48c8fSBarry Smith     }
143697b48c8fSBarry Smith     ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr);
143797b48c8fSBarry Smith     ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr);
143897b48c8fSBarry Smith   }
143997b48c8fSBarry Smith 
14406f0a148fSBarry Smith   for (i=0; i<N; i++) {
14416f0a148fSBarry Smith     slot = l->v + rows[i];
1442b9679d65SBarry Smith     for (j=0; j<n; j++) { *slot = 0.0; slot += m;}
14436f0a148fSBarry Smith   }
1444f4df32b1SMatthew Knepley   if (diag != 0.0) {
1445b9679d65SBarry Smith     if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices");
14466f0a148fSBarry Smith     for (i=0; i<N; i++) {
1447b9679d65SBarry Smith       slot = l->v + (m+1)*rows[i];
1448f4df32b1SMatthew Knepley       *slot = diag;
14496f0a148fSBarry Smith     }
14506f0a148fSBarry Smith   }
14513a40ed3dSBarry Smith   PetscFunctionReturn(0);
14526f0a148fSBarry Smith }
1453557bce09SLois Curfman McInnes 
14544a2ae208SSatish Balay #undef __FUNCT__
14554a2ae208SSatish Balay #define __FUNCT__ "MatGetArray_SeqDense"
1456dfbe8321SBarry Smith PetscErrorCode MatGetArray_SeqDense(Mat A,PetscScalar *array[])
145764e87e97SBarry Smith {
1458c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
14593a40ed3dSBarry Smith 
14603a40ed3dSBarry Smith   PetscFunctionBegin;
1461e32f2f54SBarry 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");
146264e87e97SBarry Smith   *array = mat->v;
14633a40ed3dSBarry Smith   PetscFunctionReturn(0);
146464e87e97SBarry Smith }
14650754003eSLois Curfman McInnes 
14664a2ae208SSatish Balay #undef __FUNCT__
14674a2ae208SSatish Balay #define __FUNCT__ "MatRestoreArray_SeqDense"
1468dfbe8321SBarry Smith PetscErrorCode MatRestoreArray_SeqDense(Mat A,PetscScalar *array[])
1469ff14e315SSatish Balay {
14703a40ed3dSBarry Smith   PetscFunctionBegin;
147109b544d4SBarry Smith   *array = 0; /* user cannot accidently use the array later */
14723a40ed3dSBarry Smith   PetscFunctionReturn(0);
1473ff14e315SSatish Balay }
14740754003eSLois Curfman McInnes 
14754a2ae208SSatish Balay #undef __FUNCT__
14764a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense"
147713f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B)
14780754003eSLois Curfman McInnes {
1479c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
14806849ba73SBarry Smith   PetscErrorCode ierr;
14815d0c19d7SBarry Smith   PetscInt       i,j,nrows,ncols;
14825d0c19d7SBarry Smith   const PetscInt *irow,*icol;
148387828ca2SBarry Smith   PetscScalar    *av,*bv,*v = mat->v;
14840754003eSLois Curfman McInnes   Mat            newmat;
14850754003eSLois Curfman McInnes 
14863a40ed3dSBarry Smith   PetscFunctionBegin;
148778b31e54SBarry Smith   ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr);
148878b31e54SBarry Smith   ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr);
1489e03a110bSBarry Smith   ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr);
1490e03a110bSBarry Smith   ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr);
14910754003eSLois Curfman McInnes 
1492182d2002SSatish Balay   /* Check submatrixcall */
1493182d2002SSatish Balay   if (scall == MAT_REUSE_MATRIX) {
149413f74950SBarry Smith     PetscInt n_cols,n_rows;
1495182d2002SSatish Balay     ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr);
149621a2c019SBarry Smith     if (n_rows != nrows || n_cols != ncols) {
1497f746d493SDmitry Karpeev       /* resize the result matrix to match number of requested rows/columns */
1498c61587bbSBarry Smith       ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
149921a2c019SBarry Smith     }
1500182d2002SSatish Balay     newmat = *B;
1501182d2002SSatish Balay   } else {
15020754003eSLois Curfman McInnes     /* Create and fill new matrix */
15037adad957SLisandro Dalcin     ierr = MatCreate(((PetscObject)A)->comm,&newmat);CHKERRQ(ierr);
1504f69a0ea3SMatthew Knepley     ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
15057adad957SLisandro Dalcin     ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
15065c5985e7SKris Buschelman     ierr = MatSeqDenseSetPreallocation(newmat,PETSC_NULL);CHKERRQ(ierr);
1507182d2002SSatish Balay   }
1508182d2002SSatish Balay 
1509182d2002SSatish Balay   /* Now extract the data pointers and do the copy,column at a time */
1510182d2002SSatish Balay   bv = ((Mat_SeqDense*)newmat->data)->v;
1511182d2002SSatish Balay 
1512182d2002SSatish Balay   for (i=0; i<ncols; i++) {
15136de62eeeSBarry Smith     av = v + mat->lda*icol[i];
1514182d2002SSatish Balay     for (j=0; j<nrows; j++) {
1515182d2002SSatish Balay       *bv++ = av[irow[j]];
15160754003eSLois Curfman McInnes     }
15170754003eSLois Curfman McInnes   }
1518182d2002SSatish Balay 
1519182d2002SSatish Balay   /* Assemble the matrices so that the correct flags are set */
15206d4a8577SBarry Smith   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
15216d4a8577SBarry Smith   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
15220754003eSLois Curfman McInnes 
15230754003eSLois Curfman McInnes   /* Free work space */
152478b31e54SBarry Smith   ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr);
152578b31e54SBarry Smith   ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr);
1526182d2002SSatish Balay   *B = newmat;
15273a40ed3dSBarry Smith   PetscFunctionReturn(0);
15280754003eSLois Curfman McInnes }
15290754003eSLois Curfman McInnes 
15304a2ae208SSatish Balay #undef __FUNCT__
15314a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense"
153213f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[])
1533905e6a2fSBarry Smith {
15346849ba73SBarry Smith   PetscErrorCode ierr;
153513f74950SBarry Smith   PetscInt       i;
1536905e6a2fSBarry Smith 
15373a40ed3dSBarry Smith   PetscFunctionBegin;
1538905e6a2fSBarry Smith   if (scall == MAT_INITIAL_MATRIX) {
1539b0a32e0cSBarry Smith     ierr = PetscMalloc((n+1)*sizeof(Mat),B);CHKERRQ(ierr);
1540905e6a2fSBarry Smith   }
1541905e6a2fSBarry Smith 
1542905e6a2fSBarry Smith   for (i=0; i<n; i++) {
15436a6a5d1dSBarry Smith     ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr);
1544905e6a2fSBarry Smith   }
15453a40ed3dSBarry Smith   PetscFunctionReturn(0);
1546905e6a2fSBarry Smith }
1547905e6a2fSBarry Smith 
15484a2ae208SSatish Balay #undef __FUNCT__
1549c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense"
1550c0aa2d19SHong Zhang PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode)
1551c0aa2d19SHong Zhang {
1552c0aa2d19SHong Zhang   PetscFunctionBegin;
1553c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1554c0aa2d19SHong Zhang }
1555c0aa2d19SHong Zhang 
1556c0aa2d19SHong Zhang #undef __FUNCT__
1557c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense"
1558c0aa2d19SHong Zhang PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode)
1559c0aa2d19SHong Zhang {
1560c0aa2d19SHong Zhang   PetscFunctionBegin;
1561c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1562c0aa2d19SHong Zhang }
1563c0aa2d19SHong Zhang 
1564c0aa2d19SHong Zhang #undef __FUNCT__
15654a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense"
1566dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str)
15674b0e389bSBarry Smith {
15684b0e389bSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense *)B->data;
15696849ba73SBarry Smith   PetscErrorCode ierr;
1570d0f46423SBarry Smith   PetscInt       lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j;
15713a40ed3dSBarry Smith 
15723a40ed3dSBarry Smith   PetscFunctionBegin;
157333f4a19fSKris Buschelman   /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */
157433f4a19fSKris Buschelman   if (A->ops->copy != B->ops->copy) {
1575cb5b572fSBarry Smith     ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr);
15763a40ed3dSBarry Smith     PetscFunctionReturn(0);
15773a40ed3dSBarry Smith   }
1578e32f2f54SBarry Smith   if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)");
1579a5ce6ee0Svictorle   if (lda1>m || lda2>m) {
15800dbb7854Svictorle     for (j=0; j<n; j++) {
1581a5ce6ee0Svictorle       ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr);
1582a5ce6ee0Svictorle     }
1583a5ce6ee0Svictorle   } else {
1584d0f46423SBarry Smith     ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1585a5ce6ee0Svictorle   }
1586273d9f13SBarry Smith   PetscFunctionReturn(0);
1587273d9f13SBarry Smith }
1588273d9f13SBarry Smith 
15894a2ae208SSatish Balay #undef __FUNCT__
15904994cf47SJed Brown #define __FUNCT__ "MatSetUp_SeqDense"
15914994cf47SJed Brown PetscErrorCode MatSetUp_SeqDense(Mat A)
1592273d9f13SBarry Smith {
1593dfbe8321SBarry Smith   PetscErrorCode ierr;
1594273d9f13SBarry Smith 
1595273d9f13SBarry Smith   PetscFunctionBegin;
1596273d9f13SBarry Smith   ierr =  MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr);
15973a40ed3dSBarry Smith   PetscFunctionReturn(0);
15984b0e389bSBarry Smith }
15994b0e389bSBarry Smith 
1600284134d9SBarry Smith #undef __FUNCT__
1601284134d9SBarry Smith #define __FUNCT__ "MatSetSizes_SeqDense"
1602284134d9SBarry Smith PetscErrorCode MatSetSizes_SeqDense(Mat A,PetscInt m,PetscInt n,PetscInt M,PetscInt N)
1603284134d9SBarry Smith {
1604284134d9SBarry Smith   PetscFunctionBegin;
160521a2c019SBarry Smith   /* this will not be called before lda, Mmax,  and Nmax have been set */
1606284134d9SBarry Smith   m = PetscMax(m,M);
1607284134d9SBarry Smith   n = PetscMax(n,N);
1608a868139aSShri Abhyankar 
160986d161a7SShri 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);
161086d161a7SShri 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);
161186d161a7SShri Abhyankar   */
1612dc5cefdeSJed Brown   A->rmap->n = A->rmap->N = m;
1613d0f46423SBarry Smith   A->cmap->n = A->cmap->N = n;
1614284134d9SBarry Smith   PetscFunctionReturn(0);
1615284134d9SBarry Smith }
1616170fe5c8SBarry Smith 
1617ba337c44SJed Brown #undef __FUNCT__
1618ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense"
1619ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A)
1620ba337c44SJed Brown {
1621ba337c44SJed Brown   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1622ba337c44SJed Brown   PetscInt       i,nz = A->rmap->n*A->cmap->n;
1623ba337c44SJed Brown   PetscScalar    *aa = a->v;
1624ba337c44SJed Brown 
1625ba337c44SJed Brown   PetscFunctionBegin;
1626ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]);
1627ba337c44SJed Brown   PetscFunctionReturn(0);
1628ba337c44SJed Brown }
1629ba337c44SJed Brown 
1630ba337c44SJed Brown #undef __FUNCT__
1631ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense"
1632ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A)
1633ba337c44SJed Brown {
1634ba337c44SJed Brown   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1635ba337c44SJed Brown   PetscInt       i,nz = A->rmap->n*A->cmap->n;
1636ba337c44SJed Brown   PetscScalar    *aa = a->v;
1637ba337c44SJed Brown 
1638ba337c44SJed Brown   PetscFunctionBegin;
1639ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]);
1640ba337c44SJed Brown   PetscFunctionReturn(0);
1641ba337c44SJed Brown }
1642ba337c44SJed Brown 
1643ba337c44SJed Brown #undef __FUNCT__
1644ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense"
1645ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A)
1646ba337c44SJed Brown {
1647ba337c44SJed Brown   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1648ba337c44SJed Brown   PetscInt       i,nz = A->rmap->n*A->cmap->n;
1649ba337c44SJed Brown   PetscScalar    *aa = a->v;
1650ba337c44SJed Brown 
1651ba337c44SJed Brown   PetscFunctionBegin;
1652ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]);
1653ba337c44SJed Brown   PetscFunctionReturn(0);
1654ba337c44SJed Brown }
1655284134d9SBarry Smith 
1656a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/
1657a9fe9ddaSSatish Balay #undef __FUNCT__
1658a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense"
1659a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1660a9fe9ddaSSatish Balay {
1661a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1662a9fe9ddaSSatish Balay 
1663a9fe9ddaSSatish Balay   PetscFunctionBegin;
1664a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX){
1665a9fe9ddaSSatish Balay     ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
1666a9fe9ddaSSatish Balay   }
1667a9fe9ddaSSatish Balay   ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
1668a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1669a9fe9ddaSSatish Balay }
1670a9fe9ddaSSatish Balay 
1671a9fe9ddaSSatish Balay #undef __FUNCT__
1672a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense"
1673a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1674a9fe9ddaSSatish Balay {
1675ee16a9a1SHong Zhang   PetscErrorCode ierr;
1676d0f46423SBarry Smith   PetscInt       m=A->rmap->n,n=B->cmap->n;
1677ee16a9a1SHong Zhang   Mat            Cmat;
1678a9fe9ddaSSatish Balay 
1679ee16a9a1SHong Zhang   PetscFunctionBegin;
1680e32f2f54SBarry 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);
1681ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1682ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1683ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
1684ee16a9a1SHong Zhang   ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr);
1685ee16a9a1SHong Zhang   Cmat->assembled    = PETSC_TRUE;
16868cdbd757SHong Zhang   Cmat->ops->matmult = MatMatMult_SeqDense_SeqDense;
1687ee16a9a1SHong Zhang   *C = Cmat;
1688ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1689ee16a9a1SHong Zhang }
1690a9fe9ddaSSatish Balay 
169198a3b096SSatish Balay #undef __FUNCT__
1692a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense"
1693a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1694a9fe9ddaSSatish Balay {
1695a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1696a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1697a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
16980805154bSBarry Smith   PetscBLASInt   m,n,k;
1699a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1700a9fe9ddaSSatish Balay 
1701a9fe9ddaSSatish Balay   PetscFunctionBegin;
1702d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
1703d0f46423SBarry Smith   n = PetscBLASIntCast(B->cmap->n);
1704d0f46423SBarry Smith   k = PetscBLASIntCast(A->cmap->n);
1705a9fe9ddaSSatish Balay   BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda);
1706a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1707a9fe9ddaSSatish Balay }
1708a9fe9ddaSSatish Balay 
1709a9fe9ddaSSatish Balay #undef __FUNCT__
171075648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqDense_SeqDense"
171175648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1712a9fe9ddaSSatish Balay {
1713a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1714a9fe9ddaSSatish Balay 
1715a9fe9ddaSSatish Balay   PetscFunctionBegin;
1716a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX){
171775648e8dSHong Zhang     ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
1718a9fe9ddaSSatish Balay   }
171975648e8dSHong Zhang   ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
1720a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1721a9fe9ddaSSatish Balay }
1722a9fe9ddaSSatish Balay 
1723a9fe9ddaSSatish Balay #undef __FUNCT__
172475648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqDense_SeqDense"
172575648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1726a9fe9ddaSSatish Balay {
1727ee16a9a1SHong Zhang   PetscErrorCode ierr;
1728d0f46423SBarry Smith   PetscInt       m=A->cmap->n,n=B->cmap->n;
1729ee16a9a1SHong Zhang   Mat            Cmat;
1730a9fe9ddaSSatish Balay 
1731ee16a9a1SHong Zhang   PetscFunctionBegin;
1732e32f2f54SBarry 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);
1733ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1734ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1735ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
1736ee16a9a1SHong Zhang   ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr);
1737ee16a9a1SHong Zhang   Cmat->assembled = PETSC_TRUE;
1738ee16a9a1SHong Zhang   *C = Cmat;
1739ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1740ee16a9a1SHong Zhang }
1741a9fe9ddaSSatish Balay 
1742a9fe9ddaSSatish Balay #undef __FUNCT__
174375648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqDense_SeqDense"
174475648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1745a9fe9ddaSSatish Balay {
1746a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1747a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1748a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
17490805154bSBarry Smith   PetscBLASInt   m,n,k;
1750a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1751a9fe9ddaSSatish Balay 
1752a9fe9ddaSSatish Balay   PetscFunctionBegin;
1753d0f46423SBarry Smith   m = PetscBLASIntCast(A->cmap->n);
1754d0f46423SBarry Smith   n = PetscBLASIntCast(B->cmap->n);
1755d0f46423SBarry Smith   k = PetscBLASIntCast(A->rmap->n);
17562fbe02b9SBarry Smith   /*
17572fbe02b9SBarry Smith      Note the m and n arguments below are the number rows and columns of A', not A!
17582fbe02b9SBarry Smith   */
1759a9fe9ddaSSatish Balay   BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda);
1760a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1761a9fe9ddaSSatish Balay }
1762985db425SBarry Smith 
1763985db425SBarry Smith #undef __FUNCT__
1764985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense"
1765985db425SBarry Smith PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[])
1766985db425SBarry Smith {
1767985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1768985db425SBarry Smith   PetscErrorCode ierr;
1769d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1770985db425SBarry Smith   PetscScalar    *x;
1771985db425SBarry Smith   MatScalar      *aa = a->v;
1772985db425SBarry Smith 
1773985db425SBarry Smith   PetscFunctionBegin;
1774e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1775985db425SBarry Smith 
1776985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1777985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1778985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1779e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1780985db425SBarry Smith   for (i=0; i<m; i++) {
1781985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1782985db425SBarry Smith     for (j=1; j<n; j++){
1783985db425SBarry Smith       if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1784985db425SBarry Smith     }
1785985db425SBarry Smith   }
1786985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1787985db425SBarry Smith   PetscFunctionReturn(0);
1788985db425SBarry Smith }
1789985db425SBarry Smith 
1790985db425SBarry Smith #undef __FUNCT__
1791985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense"
1792985db425SBarry Smith PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[])
1793985db425SBarry Smith {
1794985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1795985db425SBarry Smith   PetscErrorCode ierr;
1796d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1797985db425SBarry Smith   PetscScalar    *x;
1798985db425SBarry Smith   PetscReal      atmp;
1799985db425SBarry Smith   MatScalar      *aa = a->v;
1800985db425SBarry Smith 
1801985db425SBarry Smith   PetscFunctionBegin;
1802e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1803985db425SBarry Smith 
1804985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1805985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1806985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1807e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1808985db425SBarry Smith   for (i=0; i<m; i++) {
18099189402eSHong Zhang     x[i] = PetscAbsScalar(aa[i]);
1810985db425SBarry Smith     for (j=1; j<n; j++){
1811985db425SBarry Smith       atmp = PetscAbsScalar(aa[i+m*j]);
1812985db425SBarry Smith       if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;}
1813985db425SBarry Smith     }
1814985db425SBarry Smith   }
1815985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1816985db425SBarry Smith   PetscFunctionReturn(0);
1817985db425SBarry Smith }
1818985db425SBarry Smith 
1819985db425SBarry Smith #undef __FUNCT__
1820985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense"
1821985db425SBarry Smith PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[])
1822985db425SBarry Smith {
1823985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1824985db425SBarry Smith   PetscErrorCode ierr;
1825d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1826985db425SBarry Smith   PetscScalar    *x;
1827985db425SBarry Smith   MatScalar      *aa = a->v;
1828985db425SBarry Smith 
1829985db425SBarry Smith   PetscFunctionBegin;
1830e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1831985db425SBarry Smith 
1832985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1833985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1834985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1835e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1836985db425SBarry Smith   for (i=0; i<m; i++) {
1837985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1838985db425SBarry Smith     for (j=1; j<n; j++){
1839985db425SBarry Smith       if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1840985db425SBarry Smith     }
1841985db425SBarry Smith   }
1842985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1843985db425SBarry Smith   PetscFunctionReturn(0);
1844985db425SBarry Smith }
1845985db425SBarry Smith 
18468d0534beSBarry Smith #undef __FUNCT__
18478d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense"
18488d0534beSBarry Smith PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col)
18498d0534beSBarry Smith {
18508d0534beSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
18518d0534beSBarry Smith   PetscErrorCode ierr;
18528d0534beSBarry Smith   PetscScalar    *x;
18538d0534beSBarry Smith 
18548d0534beSBarry Smith   PetscFunctionBegin;
1855e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
18568d0534beSBarry Smith 
18578d0534beSBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1858d0f46423SBarry Smith   ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
18598d0534beSBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
18608d0534beSBarry Smith   PetscFunctionReturn(0);
18618d0534beSBarry Smith }
18628d0534beSBarry Smith 
18630716a85fSBarry Smith 
18640716a85fSBarry Smith #undef __FUNCT__
18650716a85fSBarry Smith #define __FUNCT__ "MatGetColumnNorms_SeqDense"
18660716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms)
18670716a85fSBarry Smith {
18680716a85fSBarry Smith   PetscErrorCode ierr;
18690716a85fSBarry Smith   PetscInt       i,j,m,n;
18700716a85fSBarry Smith   PetscScalar    *a;
18710716a85fSBarry Smith 
18720716a85fSBarry Smith   PetscFunctionBegin;
18730716a85fSBarry Smith   ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr);
18740716a85fSBarry Smith   ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr);
18750716a85fSBarry Smith   ierr = MatGetArray(A,&a);CHKERRQ(ierr);
18760716a85fSBarry Smith   if (type == NORM_2) {
18770716a85fSBarry Smith     for (i=0; i<n; i++ ){
18780716a85fSBarry Smith       for (j=0; j<m; j++) {
18790716a85fSBarry Smith 	norms[i] += PetscAbsScalar(a[j]*a[j]);
18800716a85fSBarry Smith       }
18810716a85fSBarry Smith       a += m;
18820716a85fSBarry Smith     }
18830716a85fSBarry Smith   } else if (type == NORM_1) {
18840716a85fSBarry Smith     for (i=0; i<n; i++ ){
18850716a85fSBarry Smith       for (j=0; j<m; j++) {
18860716a85fSBarry Smith 	norms[i] += PetscAbsScalar(a[j]);
18870716a85fSBarry Smith       }
18880716a85fSBarry Smith       a += m;
18890716a85fSBarry Smith     }
18900716a85fSBarry Smith   } else if (type == NORM_INFINITY) {
18910716a85fSBarry Smith     for (i=0; i<n; i++ ){
18920716a85fSBarry Smith       for (j=0; j<m; j++) {
18930716a85fSBarry Smith 	norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]);
18940716a85fSBarry Smith       }
18950716a85fSBarry Smith       a += m;
18960716a85fSBarry Smith     }
18970716a85fSBarry Smith   } else SETERRQ(((PetscObject)A)->comm,PETSC_ERR_ARG_WRONG,"Unknown NormType");
18980716a85fSBarry Smith   if (type == NORM_2) {
18998f1a2a5eSBarry Smith     for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]);
19000716a85fSBarry Smith   }
19010716a85fSBarry Smith   PetscFunctionReturn(0);
19020716a85fSBarry Smith }
19030716a85fSBarry Smith 
1904289bc588SBarry Smith /* -------------------------------------------------------------------*/
1905a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = {MatSetValues_SeqDense,
1906905e6a2fSBarry Smith        MatGetRow_SeqDense,
1907905e6a2fSBarry Smith        MatRestoreRow_SeqDense,
1908905e6a2fSBarry Smith        MatMult_SeqDense,
190997304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense,
19107c922b88SBarry Smith        MatMultTranspose_SeqDense,
19117c922b88SBarry Smith        MatMultTransposeAdd_SeqDense,
1912db4efbfdSBarry Smith        0,
1913db4efbfdSBarry Smith        0,
1914db4efbfdSBarry Smith        0,
1915db4efbfdSBarry Smith /*10*/ 0,
1916905e6a2fSBarry Smith        MatLUFactor_SeqDense,
1917905e6a2fSBarry Smith        MatCholeskyFactor_SeqDense,
191841f059aeSBarry Smith        MatSOR_SeqDense,
1919ec8511deSBarry Smith        MatTranspose_SeqDense,
192097304618SKris Buschelman /*15*/ MatGetInfo_SeqDense,
1921905e6a2fSBarry Smith        MatEqual_SeqDense,
1922905e6a2fSBarry Smith        MatGetDiagonal_SeqDense,
1923905e6a2fSBarry Smith        MatDiagonalScale_SeqDense,
1924905e6a2fSBarry Smith        MatNorm_SeqDense,
1925c0aa2d19SHong Zhang /*20*/ MatAssemblyBegin_SeqDense,
1926c0aa2d19SHong Zhang        MatAssemblyEnd_SeqDense,
1927905e6a2fSBarry Smith        MatSetOption_SeqDense,
1928905e6a2fSBarry Smith        MatZeroEntries_SeqDense,
1929d519adbfSMatthew Knepley /*24*/ MatZeroRows_SeqDense,
1930db4efbfdSBarry Smith        0,
1931db4efbfdSBarry Smith        0,
1932db4efbfdSBarry Smith        0,
1933db4efbfdSBarry Smith        0,
19344994cf47SJed Brown /*29*/ MatSetUp_SeqDense,
1935273d9f13SBarry Smith        0,
1936905e6a2fSBarry Smith        0,
1937905e6a2fSBarry Smith        MatGetArray_SeqDense,
1938905e6a2fSBarry Smith        MatRestoreArray_SeqDense,
1939d519adbfSMatthew Knepley /*34*/ MatDuplicate_SeqDense,
1940a5ae1ecdSBarry Smith        0,
1941a5ae1ecdSBarry Smith        0,
1942a5ae1ecdSBarry Smith        0,
1943a5ae1ecdSBarry Smith        0,
1944d519adbfSMatthew Knepley /*39*/ MatAXPY_SeqDense,
1945a5ae1ecdSBarry Smith        MatGetSubMatrices_SeqDense,
1946a5ae1ecdSBarry Smith        0,
19474b0e389bSBarry Smith        MatGetValues_SeqDense,
1948a5ae1ecdSBarry Smith        MatCopy_SeqDense,
1949d519adbfSMatthew Knepley /*44*/ MatGetRowMax_SeqDense,
1950a5ae1ecdSBarry Smith        MatScale_SeqDense,
1951a5ae1ecdSBarry Smith        0,
1952a5ae1ecdSBarry Smith        0,
1953a5ae1ecdSBarry Smith        0,
1954d519adbfSMatthew Knepley /*49*/ 0,
1955a5ae1ecdSBarry Smith        0,
1956a5ae1ecdSBarry Smith        0,
1957a5ae1ecdSBarry Smith        0,
1958a5ae1ecdSBarry Smith        0,
1959d519adbfSMatthew Knepley /*54*/ 0,
1960a5ae1ecdSBarry Smith        0,
1961a5ae1ecdSBarry Smith        0,
1962a5ae1ecdSBarry Smith        0,
1963a5ae1ecdSBarry Smith        0,
1964d519adbfSMatthew Knepley /*59*/ 0,
1965e03a110bSBarry Smith        MatDestroy_SeqDense,
1966e03a110bSBarry Smith        MatView_SeqDense,
1967357abbc8SBarry Smith        0,
196897304618SKris Buschelman        0,
1969d519adbfSMatthew Knepley /*64*/ 0,
197097304618SKris Buschelman        0,
197197304618SKris Buschelman        0,
197297304618SKris Buschelman        0,
197397304618SKris Buschelman        0,
1974d519adbfSMatthew Knepley /*69*/ MatGetRowMaxAbs_SeqDense,
197597304618SKris Buschelman        0,
197697304618SKris Buschelman        0,
197797304618SKris Buschelman        0,
197897304618SKris Buschelman        0,
1979d519adbfSMatthew Knepley /*74*/ 0,
198097304618SKris Buschelman        0,
198197304618SKris Buschelman        0,
198297304618SKris Buschelman        0,
198397304618SKris Buschelman        0,
1984d519adbfSMatthew Knepley /*79*/ 0,
198597304618SKris Buschelman        0,
198697304618SKris Buschelman        0,
198797304618SKris Buschelman        0,
19885bba2384SShri Abhyankar /*83*/ MatLoad_SeqDense,
1989865e5f61SKris Buschelman        0,
19901cbb95d3SBarry Smith        MatIsHermitian_SeqDense,
1991865e5f61SKris Buschelman        0,
1992865e5f61SKris Buschelman        0,
1993865e5f61SKris Buschelman        0,
1994d519adbfSMatthew Knepley /*89*/ MatMatMult_SeqDense_SeqDense,
1995a9fe9ddaSSatish Balay        MatMatMultSymbolic_SeqDense_SeqDense,
1996a9fe9ddaSSatish Balay        MatMatMultNumeric_SeqDense_SeqDense,
1997865e5f61SKris Buschelman        0,
1998865e5f61SKris Buschelman        0,
1999d519adbfSMatthew Knepley /*94*/ 0,
20005df89d91SHong Zhang        0,
20015df89d91SHong Zhang        0,
20025df89d91SHong Zhang        0,
2003284134d9SBarry Smith        0,
2004d519adbfSMatthew Knepley /*99*/ 0,
2005284134d9SBarry Smith        0,
2006284134d9SBarry Smith        0,
2007ba337c44SJed Brown        MatConjugate_SeqDense,
2008985db425SBarry Smith        MatSetSizes_SeqDense,
2009ba337c44SJed Brown /*104*/0,
2010ba337c44SJed Brown        MatRealPart_SeqDense,
2011ba337c44SJed Brown        MatImaginaryPart_SeqDense,
2012985db425SBarry Smith        0,
2013985db425SBarry Smith        0,
201485e2c93fSHong Zhang /*109*/MatMatSolve_SeqDense,
2015985db425SBarry Smith        0,
20168d0534beSBarry Smith        MatGetRowMin_SeqDense,
2017aabbc4fbSShri Abhyankar        MatGetColumnVector_SeqDense,
2018aabbc4fbSShri Abhyankar        0,
2019aabbc4fbSShri Abhyankar /*114*/0,
2020aabbc4fbSShri Abhyankar        0,
2021aabbc4fbSShri Abhyankar        0,
2022aabbc4fbSShri Abhyankar        0,
2023aabbc4fbSShri Abhyankar        0,
2024aabbc4fbSShri Abhyankar /*119*/0,
2025aabbc4fbSShri Abhyankar        0,
2026aabbc4fbSShri Abhyankar        0,
20270716a85fSBarry Smith        0,
20280716a85fSBarry Smith        0,
20290716a85fSBarry Smith /*124*/0,
20305df89d91SHong Zhang        MatGetColumnNorms_SeqDense,
20315df89d91SHong Zhang        0,
20325df89d91SHong Zhang        0,
20335df89d91SHong Zhang        0,
20345df89d91SHong Zhang /*129*/0,
203575648e8dSHong Zhang        MatTransposeMatMult_SeqDense_SeqDense,
203675648e8dSHong Zhang        MatTransposeMatMultSymbolic_SeqDense_SeqDense,
203775648e8dSHong Zhang        MatTransposeMatMultNumeric_SeqDense_SeqDense,
2038985db425SBarry Smith };
203990ace30eSBarry Smith 
20404a2ae208SSatish Balay #undef __FUNCT__
20414a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense"
20424b828684SBarry Smith /*@C
2043fafbff53SBarry Smith    MatCreateSeqDense - Creates a sequential dense matrix that
2044d65003e9SLois Curfman McInnes    is stored in column major order (the usual Fortran 77 manner). Many
2045d65003e9SLois Curfman McInnes    of the matrix operations use the BLAS and LAPACK routines.
2046289bc588SBarry Smith 
2047db81eaa0SLois Curfman McInnes    Collective on MPI_Comm
2048db81eaa0SLois Curfman McInnes 
204920563c6bSBarry Smith    Input Parameters:
2050db81eaa0SLois Curfman McInnes +  comm - MPI communicator, set to PETSC_COMM_SELF
20510c775827SLois Curfman McInnes .  m - number of rows
205218f449edSLois Curfman McInnes .  n - number of columns
2053c0235b3cSMatthew Knepley -  data - optional location of matrix data in column major order.  Set data=PETSC_NULL for PETSc
2054dfc5480cSLois Curfman McInnes    to control all matrix memory allocation.
205520563c6bSBarry Smith 
205620563c6bSBarry Smith    Output Parameter:
205744cd7ae7SLois Curfman McInnes .  A - the matrix
205820563c6bSBarry Smith 
2059b259b22eSLois Curfman McInnes    Notes:
206018f449edSLois Curfman McInnes    The data input variable is intended primarily for Fortran programmers
206118f449edSLois Curfman McInnes    who wish to allocate their own matrix memory space.  Most users should
2062b4fd4287SBarry Smith    set data=PETSC_NULL.
206318f449edSLois Curfman McInnes 
2064027ccd11SLois Curfman McInnes    Level: intermediate
2065027ccd11SLois Curfman McInnes 
2066dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS
2067d65003e9SLois Curfman McInnes 
206869b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues()
206920563c6bSBarry Smith @*/
20707087cfbeSBarry Smith PetscErrorCode  MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A)
2071289bc588SBarry Smith {
2072dfbe8321SBarry Smith   PetscErrorCode ierr;
20733b2fbd54SBarry Smith 
20743a40ed3dSBarry Smith   PetscFunctionBegin;
2075f69a0ea3SMatthew Knepley   ierr = MatCreate(comm,A);CHKERRQ(ierr);
2076f69a0ea3SMatthew Knepley   ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr);
2077273d9f13SBarry Smith   ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr);
2078273d9f13SBarry Smith   ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr);
2079273d9f13SBarry Smith   PetscFunctionReturn(0);
2080273d9f13SBarry Smith }
2081273d9f13SBarry Smith 
20824a2ae208SSatish Balay #undef __FUNCT__
2083afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation"
2084273d9f13SBarry Smith /*@C
2085273d9f13SBarry Smith    MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements
2086273d9f13SBarry Smith 
2087273d9f13SBarry Smith    Collective on MPI_Comm
2088273d9f13SBarry Smith 
2089273d9f13SBarry Smith    Input Parameters:
2090273d9f13SBarry Smith +  A - the matrix
2091273d9f13SBarry Smith -  data - the array (or PETSC_NULL)
2092273d9f13SBarry Smith 
2093273d9f13SBarry Smith    Notes:
2094273d9f13SBarry Smith    The data input variable is intended primarily for Fortran programmers
2095273d9f13SBarry Smith    who wish to allocate their own matrix memory space.  Most users should
2096284134d9SBarry Smith    need not call this routine.
2097273d9f13SBarry Smith 
2098273d9f13SBarry Smith    Level: intermediate
2099273d9f13SBarry Smith 
2100273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS
2101273d9f13SBarry Smith 
210269b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA()
2103867c911aSBarry Smith 
2104273d9f13SBarry Smith @*/
21057087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation(Mat B,PetscScalar data[])
2106273d9f13SBarry Smith {
21074ac538c5SBarry Smith   PetscErrorCode ierr;
2108a23d5eceSKris Buschelman 
2109a23d5eceSKris Buschelman   PetscFunctionBegin;
21104ac538c5SBarry Smith   ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr);
2111a23d5eceSKris Buschelman   PetscFunctionReturn(0);
2112a23d5eceSKris Buschelman }
2113a23d5eceSKris Buschelman 
2114a23d5eceSKris Buschelman EXTERN_C_BEGIN
2115a23d5eceSKris Buschelman #undef __FUNCT__
2116afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense"
21177087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data)
2118a23d5eceSKris Buschelman {
2119273d9f13SBarry Smith   Mat_SeqDense   *b;
2120dfbe8321SBarry Smith   PetscErrorCode ierr;
2121273d9f13SBarry Smith 
2122273d9f13SBarry Smith   PetscFunctionBegin;
2123273d9f13SBarry Smith   B->preallocated = PETSC_TRUE;
2124a868139aSShri Abhyankar 
212534ef9618SShri Abhyankar   ierr = PetscLayoutSetBlockSize(B->rmap,1);CHKERRQ(ierr);
212634ef9618SShri Abhyankar   ierr = PetscLayoutSetBlockSize(B->cmap,1);CHKERRQ(ierr);
212734ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr);
212834ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr);
212934ef9618SShri Abhyankar 
2130273d9f13SBarry Smith   b       = (Mat_SeqDense*)B->data;
213186d161a7SShri Abhyankar   b->Mmax = B->rmap->n;
213286d161a7SShri Abhyankar   b->Nmax = B->cmap->n;
213386d161a7SShri Abhyankar   if(b->lda <= 0 || b->changelda) b->lda = B->rmap->n;
213486d161a7SShri Abhyankar 
21359e8f95c4SLisandro Dalcin   if (!data) { /* petsc-allocated storage */
21369e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
21375afd5e0cSBarry Smith     ierr = PetscMalloc(b->lda*b->Nmax*sizeof(PetscScalar),&b->v);CHKERRQ(ierr);
2138284134d9SBarry Smith     ierr = PetscMemzero(b->v,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
2139284134d9SBarry Smith     ierr = PetscLogObjectMemory(B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
21409e8f95c4SLisandro Dalcin     b->user_alloc = PETSC_FALSE;
2141273d9f13SBarry Smith   } else { /* user-allocated storage */
21429e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2143273d9f13SBarry Smith     b->v          = data;
2144273d9f13SBarry Smith     b->user_alloc = PETSC_TRUE;
2145273d9f13SBarry Smith   }
21460450473dSBarry Smith   B->assembled = PETSC_TRUE;
2147273d9f13SBarry Smith   PetscFunctionReturn(0);
2148273d9f13SBarry Smith }
2149a23d5eceSKris Buschelman EXTERN_C_END
2150273d9f13SBarry Smith 
21511b807ce4Svictorle #undef __FUNCT__
21521b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA"
21531b807ce4Svictorle /*@C
21541b807ce4Svictorle   MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array
21551b807ce4Svictorle 
21561b807ce4Svictorle   Input parameter:
21571b807ce4Svictorle + A - the matrix
21581b807ce4Svictorle - lda - the leading dimension
21591b807ce4Svictorle 
21601b807ce4Svictorle   Notes:
2161867c911aSBarry Smith   This routine is to be used in conjunction with MatSeqDenseSetPreallocation();
21621b807ce4Svictorle   it asserts that the preallocation has a leading dimension (the LDA parameter
21631b807ce4Svictorle   of Blas and Lapack fame) larger than M, the first dimension of the matrix.
21641b807ce4Svictorle 
21651b807ce4Svictorle   Level: intermediate
21661b807ce4Svictorle 
21671b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS
21681b807ce4Svictorle 
2169284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize()
2170867c911aSBarry Smith 
21711b807ce4Svictorle @*/
21727087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetLDA(Mat B,PetscInt lda)
21731b807ce4Svictorle {
21741b807ce4Svictorle   Mat_SeqDense *b = (Mat_SeqDense*)B->data;
217521a2c019SBarry Smith 
21761b807ce4Svictorle   PetscFunctionBegin;
2177e32f2f54SBarry 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);
21781b807ce4Svictorle   b->lda       = lda;
217921a2c019SBarry Smith   b->changelda = PETSC_FALSE;
218021a2c019SBarry Smith   b->Mmax      = PetscMax(b->Mmax,lda);
21811b807ce4Svictorle   PetscFunctionReturn(0);
21821b807ce4Svictorle }
21831b807ce4Svictorle 
21840bad9183SKris Buschelman /*MC
2185fafad747SKris Buschelman    MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices.
21860bad9183SKris Buschelman 
21870bad9183SKris Buschelman    Options Database Keys:
21880bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions()
21890bad9183SKris Buschelman 
21900bad9183SKris Buschelman   Level: beginner
21910bad9183SKris Buschelman 
219289665df3SBarry Smith .seealso: MatCreateSeqDense()
219389665df3SBarry Smith 
21940bad9183SKris Buschelman M*/
21950bad9183SKris Buschelman 
2196273d9f13SBarry Smith EXTERN_C_BEGIN
21974a2ae208SSatish Balay #undef __FUNCT__
21984a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense"
21997087cfbeSBarry Smith PetscErrorCode  MatCreate_SeqDense(Mat B)
2200273d9f13SBarry Smith {
2201273d9f13SBarry Smith   Mat_SeqDense   *b;
2202dfbe8321SBarry Smith   PetscErrorCode ierr;
22037c334f02SBarry Smith   PetscMPIInt    size;
2204273d9f13SBarry Smith 
2205273d9f13SBarry Smith   PetscFunctionBegin;
22067adad957SLisandro Dalcin   ierr = MPI_Comm_size(((PetscObject)B)->comm,&size);CHKERRQ(ierr);
2207e32f2f54SBarry Smith   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1");
220855659b69SBarry Smith 
220938f2d2fdSLisandro Dalcin   ierr            = PetscNewLog(B,Mat_SeqDense,&b);CHKERRQ(ierr);
2210549d3d68SSatish Balay   ierr            = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr);
221144cd7ae7SLois Curfman McInnes   B->data         = (void*)b;
221218f449edSLois Curfman McInnes 
221344cd7ae7SLois Curfman McInnes   b->pivots       = 0;
2214273d9f13SBarry Smith   b->roworiented  = PETSC_TRUE;
2215273d9f13SBarry Smith   b->v            = 0;
221621a2c019SBarry Smith   b->changelda    = PETSC_FALSE;
22174e220ebcSLois Curfman McInnes 
2218b24902e0SBarry Smith 
22196a63e612SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatConvert_seqdense_seqaij_C","MatConvert_SeqDense_SeqAIJ",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr);
2220ec1065edSBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatGetFactor_petsc_C",
2221b24902e0SBarry Smith                                      "MatGetFactor_seqdense_petsc",
2222b24902e0SBarry Smith                                       MatGetFactor_seqdense_petsc);CHKERRQ(ierr);
2223a23d5eceSKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatSeqDenseSetPreallocation_C",
2224a23d5eceSKris Buschelman                                     "MatSeqDenseSetPreallocation_SeqDense",
2225a23d5eceSKris Buschelman                                      MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr);
22262356f84bSDmitry Karpeev 
22274ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMult_seqaij_seqdense_C",
22284ae313f4SHong Zhang                                      "MatMatMult_SeqAIJ_SeqDense",
22294ae313f4SHong Zhang                                       MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
22302356f84bSDmitry Karpeev 
2231c0c8ee5eSDmitry Karpeev 
22324ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",
22334ae313f4SHong Zhang                                      "MatMatMultSymbolic_SeqAIJ_SeqDense",
22344ae313f4SHong Zhang                                       MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
22354ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",
22364ae313f4SHong Zhang                                      "MatMatMultNumeric_SeqAIJ_SeqDense",
22374ae313f4SHong Zhang                                       MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
223817667f90SBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr);
22393a40ed3dSBarry Smith   PetscFunctionReturn(0);
2240289bc588SBarry Smith }
2241273d9f13SBarry Smith EXTERN_C_END
2242