xref: /petsc/src/mat/impls/dense/seq/dense.c (revision 783b601ec4171f4546b813924bbf4c52fcf06a42)
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;
239*783b601eSJed Brown   PetscBLASInt   nrhs,info,m;
240bda8bf91SBarry Smith   PetscBool      flg;
24185e2c93fSHong Zhang 
24285e2c93fSHong Zhang   PetscFunctionBegin;
243*783b601eSJed Brown   m = PetscBLASIntCast(A->rmap->n);
244251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATMPIDENSE,PETSC_NULL);CHKERRQ(ierr);
245bda8bf91SBarry Smith   if (!flg) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_ARG_WRONG,"Matrix B must be MATDENSE matrix");
246251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompareAny((PetscObject)X,&flg,MATSEQDENSE,MATMPIDENSE,PETSC_NULL);CHKERRQ(ierr);
247bda8bf91SBarry Smith   if (!flg) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_ARG_WRONG,"Matrix X must be MATDENSE matrix");
248bda8bf91SBarry Smith 
249efb80c78SLisandro Dalcin   ierr = MatGetSize(B,PETSC_NULL,&n);CHKERRQ(ierr);
250efb80c78SLisandro Dalcin   nrhs = PetscBLASIntCast(n);
25185e2c93fSHong Zhang   ierr = MatGetArray(B,&b);CHKERRQ(ierr);
25285e2c93fSHong Zhang   ierr = MatGetArray(X,&x);CHKERRQ(ierr);
25385e2c93fSHong Zhang 
254f272c775SHong Zhang   ierr = PetscMemcpy(x,b,m*nrhs*sizeof(PetscScalar));CHKERRQ(ierr);
25585e2c93fSHong Zhang 
25685e2c93fSHong Zhang   if (A->factortype == MAT_FACTOR_LU) {
25785e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_GETRS)
25885e2c93fSHong Zhang     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
25985e2c93fSHong Zhang #else
26085e2c93fSHong Zhang     LAPACKgetrs_("N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info);
26185e2c93fSHong Zhang     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
26285e2c93fSHong Zhang #endif
26385e2c93fSHong Zhang   } else if (A->factortype == MAT_FACTOR_CHOLESKY){
26485e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_POTRS)
26585e2c93fSHong Zhang     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
26685e2c93fSHong Zhang #else
26785e2c93fSHong Zhang     LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info);
26885e2c93fSHong Zhang     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
26985e2c93fSHong Zhang #endif
27085e2c93fSHong Zhang   }
27185e2c93fSHong Zhang   else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
27285e2c93fSHong Zhang 
27385e2c93fSHong Zhang   ierr = MatRestoreArray(B,&b);CHKERRQ(ierr);
27485e2c93fSHong Zhang   ierr = MatRestoreArray(X,&x);CHKERRQ(ierr);
27585e2c93fSHong Zhang   ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr);
27685e2c93fSHong Zhang   PetscFunctionReturn(0);
27785e2c93fSHong Zhang }
27885e2c93fSHong Zhang 
27985e2c93fSHong Zhang #undef __FUNCT__
2804a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense"
281dfbe8321SBarry Smith PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy)
282da3a660dSBarry Smith {
283c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
284dfbe8321SBarry Smith   PetscErrorCode ierr;
28587828ca2SBarry Smith   PetscScalar    *x,*y;
286d0f46423SBarry Smith   PetscBLASInt   one = 1,info,m = PetscBLASIntCast(A->rmap->n);
28767e560aaSBarry Smith 
2883a40ed3dSBarry Smith   PetscFunctionBegin;
2891ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
2901ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
291d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
292752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
293da3a660dSBarry Smith   if (mat->pivots) {
294ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
295e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
296ae7cfcebSSatish Balay #else
29771044d3cSBarry Smith     LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info);
298e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve");
299ae7cfcebSSatish Balay #endif
3007a97a34bSBarry Smith   } else {
301ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
302e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
303ae7cfcebSSatish Balay #else
30471044d3cSBarry Smith     LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info);
305e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve");
306ae7cfcebSSatish Balay #endif
307da3a660dSBarry Smith   }
3081ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
3091ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
310dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
3113a40ed3dSBarry Smith   PetscFunctionReturn(0);
312da3a660dSBarry Smith }
3136ee01492SSatish Balay 
3144a2ae208SSatish Balay #undef __FUNCT__
3154a2ae208SSatish Balay #define __FUNCT__ "MatSolveAdd_SeqDense"
316dfbe8321SBarry Smith PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
317da3a660dSBarry Smith {
318c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
319dfbe8321SBarry Smith   PetscErrorCode ierr;
32087828ca2SBarry Smith   PetscScalar    *x,*y,sone = 1.0;
321da3a660dSBarry Smith   Vec            tmp = 0;
322d0f46423SBarry Smith   PetscBLASInt   one = 1,info,m = PetscBLASIntCast(A->rmap->n);
32367e560aaSBarry Smith 
3243a40ed3dSBarry Smith   PetscFunctionBegin;
3251ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
3261ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
327d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
328da3a660dSBarry Smith   if (yy == zz) {
32978b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
33052e6d16bSBarry Smith     ierr = PetscLogObjectParent(A,tmp);CHKERRQ(ierr);
33178b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
332da3a660dSBarry Smith   }
333d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
334752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
335da3a660dSBarry Smith   if (mat->pivots) {
336ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
337e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
338ae7cfcebSSatish Balay #else
33971044d3cSBarry Smith     LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info);
340e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
341ae7cfcebSSatish Balay #endif
342a8c6a408SBarry Smith   } else {
343ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
344e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
345ae7cfcebSSatish Balay #else
34671044d3cSBarry Smith     LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info);
347e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
348ae7cfcebSSatish Balay #endif
349da3a660dSBarry Smith   }
3506bf464f9SBarry Smith   if (tmp) {
3516bf464f9SBarry Smith     ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr);
3526bf464f9SBarry Smith     ierr = VecDestroy(&tmp);CHKERRQ(ierr);
3536bf464f9SBarry Smith   } else {
3546bf464f9SBarry Smith     ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);
3556bf464f9SBarry Smith   }
3561ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
3571ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
358dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
3593a40ed3dSBarry Smith   PetscFunctionReturn(0);
360da3a660dSBarry Smith }
36167e560aaSBarry Smith 
3624a2ae208SSatish Balay #undef __FUNCT__
3634a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense"
364dfbe8321SBarry Smith PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
365da3a660dSBarry Smith {
366c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
3676849ba73SBarry Smith   PetscErrorCode ierr;
36887828ca2SBarry Smith   PetscScalar    *x,*y,sone = 1.0;
369da3a660dSBarry Smith   Vec            tmp;
370d0f46423SBarry Smith   PetscBLASInt   one = 1,info,m = PetscBLASIntCast(A->rmap->n);
37167e560aaSBarry Smith 
3723a40ed3dSBarry Smith   PetscFunctionBegin;
373d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
3741ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
3751ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
376da3a660dSBarry Smith   if (yy == zz) {
37778b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
37852e6d16bSBarry Smith     ierr = PetscLogObjectParent(A,tmp);CHKERRQ(ierr);
37978b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
380da3a660dSBarry Smith   }
381d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
382752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
383da3a660dSBarry Smith   if (mat->pivots) {
384ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
385e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
386ae7cfcebSSatish Balay #else
38771044d3cSBarry Smith     LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info);
388e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
389ae7cfcebSSatish Balay #endif
3903a40ed3dSBarry Smith   } else {
391ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
392e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
393ae7cfcebSSatish Balay #else
39471044d3cSBarry Smith     LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info);
395e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
396ae7cfcebSSatish Balay #endif
397da3a660dSBarry Smith   }
39890f02eecSBarry Smith   if (tmp) {
3992dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr);
4006bf464f9SBarry Smith     ierr = VecDestroy(&tmp);CHKERRQ(ierr);
4013a40ed3dSBarry Smith   } else {
4022dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);
40390f02eecSBarry Smith   }
4041ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
4051ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
406dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
4073a40ed3dSBarry Smith   PetscFunctionReturn(0);
408da3a660dSBarry Smith }
409db4efbfdSBarry Smith 
410db4efbfdSBarry Smith /* ---------------------------------------------------------------*/
411db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots,
412db4efbfdSBarry Smith    rather than put it in the Mat->row slot.*/
413db4efbfdSBarry Smith #undef __FUNCT__
414db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactor_SeqDense"
4150481f469SBarry Smith PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo)
416db4efbfdSBarry Smith {
417db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF)
418db4efbfdSBarry Smith   PetscFunctionBegin;
419e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable.");
420db4efbfdSBarry Smith #else
421db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
422db4efbfdSBarry Smith   PetscErrorCode ierr;
423db4efbfdSBarry Smith   PetscBLASInt   n,m,info;
424db4efbfdSBarry Smith 
425db4efbfdSBarry Smith   PetscFunctionBegin;
426db4efbfdSBarry Smith   n = PetscBLASIntCast(A->cmap->n);
427db4efbfdSBarry Smith   m = PetscBLASIntCast(A->rmap->n);
428db4efbfdSBarry Smith   if (!mat->pivots) {
429db4efbfdSBarry Smith     ierr = PetscMalloc((A->rmap->n+1)*sizeof(PetscBLASInt),&mat->pivots);CHKERRQ(ierr);
430db4efbfdSBarry Smith     ierr = PetscLogObjectMemory(A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr);
431db4efbfdSBarry Smith   }
432db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
4338e57ea43SSatish Balay   ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
434db4efbfdSBarry Smith   LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info);
4358e57ea43SSatish Balay   ierr = PetscFPTrapPop();CHKERRQ(ierr);
4368e57ea43SSatish Balay 
437e32f2f54SBarry Smith   if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization");
438e32f2f54SBarry Smith   if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization");
439db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
440db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
441db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
442db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
443d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_LU;
444db4efbfdSBarry Smith 
445dc0b31edSSatish Balay   ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr);
446db4efbfdSBarry Smith #endif
447db4efbfdSBarry Smith   PetscFunctionReturn(0);
448db4efbfdSBarry Smith }
449db4efbfdSBarry Smith 
450db4efbfdSBarry Smith #undef __FUNCT__
451db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactor_SeqDense"
4520481f469SBarry Smith PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo)
453db4efbfdSBarry Smith {
454db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF)
455db4efbfdSBarry Smith   PetscFunctionBegin;
456e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable.");
457db4efbfdSBarry Smith #else
458db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
459db4efbfdSBarry Smith   PetscErrorCode ierr;
460db4efbfdSBarry Smith   PetscBLASInt   info,n = PetscBLASIntCast(A->cmap->n);
461db4efbfdSBarry Smith 
462db4efbfdSBarry Smith   PetscFunctionBegin;
463db4efbfdSBarry Smith   ierr = PetscFree(mat->pivots);CHKERRQ(ierr);
464db4efbfdSBarry Smith 
465db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
466db4efbfdSBarry Smith   LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info);
467e32f2f54SBarry Smith   if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1);
468db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
469db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
470db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
471db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
472d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_CHOLESKY;
473dc0b31edSSatish Balay   ierr = PetscLogFlops((A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr);
474db4efbfdSBarry Smith #endif
475db4efbfdSBarry Smith   PetscFunctionReturn(0);
476db4efbfdSBarry Smith }
477db4efbfdSBarry Smith 
478db4efbfdSBarry Smith 
479db4efbfdSBarry Smith #undef __FUNCT__
480db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense"
4810481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
482db4efbfdSBarry Smith {
483db4efbfdSBarry Smith   PetscErrorCode ierr;
484db4efbfdSBarry Smith   MatFactorInfo  info;
485db4efbfdSBarry Smith 
486db4efbfdSBarry Smith   PetscFunctionBegin;
487db4efbfdSBarry Smith   info.fill = 1.0;
488c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
489719d5645SBarry Smith   ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr);
490db4efbfdSBarry Smith   PetscFunctionReturn(0);
491db4efbfdSBarry Smith }
492db4efbfdSBarry Smith 
493db4efbfdSBarry Smith #undef __FUNCT__
494db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense"
4950481f469SBarry Smith PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info)
496db4efbfdSBarry Smith {
497db4efbfdSBarry Smith   PetscFunctionBegin;
498c3ef05f6SHong Zhang   fact->assembled                  = PETSC_TRUE;
4991bbcc794SSatish Balay   fact->preallocated               = PETSC_TRUE;
500719d5645SBarry Smith   fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense;
501db4efbfdSBarry Smith   PetscFunctionReturn(0);
502db4efbfdSBarry Smith }
503db4efbfdSBarry Smith 
504db4efbfdSBarry Smith #undef __FUNCT__
505db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactorSymbolic_SeqDense"
5060481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info)
507db4efbfdSBarry Smith {
508db4efbfdSBarry Smith   PetscFunctionBegin;
509b66fe19dSMatthew G Knepley   fact->preallocated         = PETSC_TRUE;
510c3ef05f6SHong Zhang   fact->assembled            = PETSC_TRUE;
511719d5645SBarry Smith   fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense;
512db4efbfdSBarry Smith   PetscFunctionReturn(0);
513db4efbfdSBarry Smith }
514db4efbfdSBarry Smith 
515bb5747d9SMatthew Knepley EXTERN_C_BEGIN
516db4efbfdSBarry Smith #undef __FUNCT__
517db4efbfdSBarry Smith #define __FUNCT__ "MatGetFactor_seqdense_petsc"
518db4efbfdSBarry Smith PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact)
519db4efbfdSBarry Smith {
520db4efbfdSBarry Smith   PetscErrorCode ierr;
521db4efbfdSBarry Smith 
522db4efbfdSBarry Smith   PetscFunctionBegin;
523db4efbfdSBarry Smith   ierr = MatCreate(((PetscObject)A)->comm,fact);CHKERRQ(ierr);
524db4efbfdSBarry Smith   ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
525db4efbfdSBarry Smith   ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr);
526db4efbfdSBarry Smith   if (ftype == MAT_FACTOR_LU){
527db4efbfdSBarry Smith     (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense;
528db4efbfdSBarry Smith   } else {
529db4efbfdSBarry Smith     (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense;
530db4efbfdSBarry Smith   }
531d5f3da31SBarry Smith   (*fact)->factortype = ftype;
532db4efbfdSBarry Smith   PetscFunctionReturn(0);
533db4efbfdSBarry Smith }
534bb5747d9SMatthew Knepley EXTERN_C_END
535db4efbfdSBarry Smith 
536289bc588SBarry Smith /* ------------------------------------------------------------------*/
5374a2ae208SSatish Balay #undef __FUNCT__
53841f059aeSBarry Smith #define __FUNCT__ "MatSOR_SeqDense"
53941f059aeSBarry Smith PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx)
540289bc588SBarry Smith {
541c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
54287828ca2SBarry Smith   PetscScalar    *x,*b,*v = mat->v,zero = 0.0,xt;
543dfbe8321SBarry Smith   PetscErrorCode ierr;
544d0f46423SBarry Smith   PetscInt       m = A->rmap->n,i;
5450805154bSBarry Smith   PetscBLASInt   o = 1,bm = PetscBLASIntCast(m);
546289bc588SBarry Smith 
5473a40ed3dSBarry Smith   PetscFunctionBegin;
548289bc588SBarry Smith   if (flag & SOR_ZERO_INITIAL_GUESS) {
54971044d3cSBarry Smith     /* this is a hack fix, should have another version without the second BLASdot */
5502dcb1b2aSMatthew Knepley     ierr = VecSet(xx,zero);CHKERRQ(ierr);
551289bc588SBarry Smith   }
5521ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
5531ebc52fbSHong Zhang   ierr = VecGetArray(bb,&b);CHKERRQ(ierr);
554b965ef7fSBarry Smith   its  = its*lits;
555e32f2f54SBarry 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);
556289bc588SBarry Smith   while (its--) {
557fccaa45eSBarry Smith     if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP){
558289bc588SBarry Smith       for (i=0; i<m; i++) {
55971044d3cSBarry Smith         xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o);
56055a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
561289bc588SBarry Smith       }
562289bc588SBarry Smith     }
563fccaa45eSBarry Smith     if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP){
564289bc588SBarry Smith       for (i=m-1; i>=0; i--) {
56571044d3cSBarry Smith         xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o);
56655a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
567289bc588SBarry Smith       }
568289bc588SBarry Smith     }
569289bc588SBarry Smith   }
5701ebc52fbSHong Zhang   ierr = VecRestoreArray(bb,&b);CHKERRQ(ierr);
5711ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
5723a40ed3dSBarry Smith   PetscFunctionReturn(0);
573289bc588SBarry Smith }
574289bc588SBarry Smith 
575289bc588SBarry Smith /* -----------------------------------------------------------------*/
5764a2ae208SSatish Balay #undef __FUNCT__
5774a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense"
578dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy)
579289bc588SBarry Smith {
580c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
58187828ca2SBarry Smith   PetscScalar    *v = mat->v,*x,*y;
582dfbe8321SBarry Smith   PetscErrorCode ierr;
5830805154bSBarry Smith   PetscBLASInt   m, n,_One=1;
584ea709b57SSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
5853a40ed3dSBarry Smith 
5863a40ed3dSBarry Smith   PetscFunctionBegin;
587d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
588d0f46423SBarry Smith   n = PetscBLASIntCast(A->cmap->n);
589d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
5901ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
5911ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
59271044d3cSBarry Smith   BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One);
5931ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
5941ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
595dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
5963a40ed3dSBarry Smith   PetscFunctionReturn(0);
597289bc588SBarry Smith }
598800995b7SMatthew Knepley 
5994a2ae208SSatish Balay #undef __FUNCT__
6004a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense"
601dfbe8321SBarry Smith PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy)
602289bc588SBarry Smith {
603c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
60487828ca2SBarry Smith   PetscScalar    *v = mat->v,*x,*y,_DOne=1.0,_DZero=0.0;
605dfbe8321SBarry Smith   PetscErrorCode ierr;
6060805154bSBarry Smith   PetscBLASInt   m, n, _One=1;
6073a40ed3dSBarry Smith 
6083a40ed3dSBarry Smith   PetscFunctionBegin;
609d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
610d0f46423SBarry Smith   n = PetscBLASIntCast(A->cmap->n);
611d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
6121ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
6131ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
61471044d3cSBarry Smith   BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One);
6151ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6161ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
617dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr);
6183a40ed3dSBarry Smith   PetscFunctionReturn(0);
619289bc588SBarry Smith }
6206ee01492SSatish Balay 
6214a2ae208SSatish Balay #undef __FUNCT__
6224a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense"
623dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
624289bc588SBarry Smith {
625c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
62687828ca2SBarry Smith   PetscScalar    *v = mat->v,*x,*y,_DOne=1.0;
627dfbe8321SBarry Smith   PetscErrorCode ierr;
6280805154bSBarry Smith   PetscBLASInt   m, n, _One=1;
6293a40ed3dSBarry Smith 
6303a40ed3dSBarry Smith   PetscFunctionBegin;
631d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
632d0f46423SBarry Smith   n = PetscBLASIntCast(A->cmap->n);
633d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
634600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
6351ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
6361ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
63771044d3cSBarry Smith   BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One);
6381ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6391ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
640dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
6413a40ed3dSBarry Smith   PetscFunctionReturn(0);
642289bc588SBarry Smith }
6436ee01492SSatish Balay 
6444a2ae208SSatish Balay #undef __FUNCT__
6454a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense"
646dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
647289bc588SBarry Smith {
648c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
64987828ca2SBarry Smith   PetscScalar    *v = mat->v,*x,*y;
650dfbe8321SBarry Smith   PetscErrorCode ierr;
6510805154bSBarry Smith   PetscBLASInt   m, n, _One=1;
65287828ca2SBarry Smith   PetscScalar    _DOne=1.0;
6533a40ed3dSBarry Smith 
6543a40ed3dSBarry Smith   PetscFunctionBegin;
655d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
656d0f46423SBarry Smith   n = PetscBLASIntCast(A->cmap->n);
657d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
658600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
6591ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
6601ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
66171044d3cSBarry Smith   BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One);
6621ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6631ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
664dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
6653a40ed3dSBarry Smith   PetscFunctionReturn(0);
666289bc588SBarry Smith }
667289bc588SBarry Smith 
668289bc588SBarry Smith /* -----------------------------------------------------------------*/
6694a2ae208SSatish Balay #undef __FUNCT__
6704a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense"
67113f74950SBarry Smith PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
672289bc588SBarry Smith {
673c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
67487828ca2SBarry Smith   PetscScalar    *v;
6756849ba73SBarry Smith   PetscErrorCode ierr;
67613f74950SBarry Smith   PetscInt       i;
67767e560aaSBarry Smith 
6783a40ed3dSBarry Smith   PetscFunctionBegin;
679d0f46423SBarry Smith   *ncols = A->cmap->n;
680289bc588SBarry Smith   if (cols) {
681d0f46423SBarry Smith     ierr = PetscMalloc((A->cmap->n+1)*sizeof(PetscInt),cols);CHKERRQ(ierr);
682d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) (*cols)[i] = i;
683289bc588SBarry Smith   }
684289bc588SBarry Smith   if (vals) {
685d0f46423SBarry Smith     ierr = PetscMalloc((A->cmap->n+1)*sizeof(PetscScalar),vals);CHKERRQ(ierr);
686289bc588SBarry Smith     v    = mat->v + row;
687d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;}
688289bc588SBarry Smith   }
6893a40ed3dSBarry Smith   PetscFunctionReturn(0);
690289bc588SBarry Smith }
6916ee01492SSatish Balay 
6924a2ae208SSatish Balay #undef __FUNCT__
6934a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense"
69413f74950SBarry Smith PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
695289bc588SBarry Smith {
696dfbe8321SBarry Smith   PetscErrorCode ierr;
697606d414cSSatish Balay   PetscFunctionBegin;
698606d414cSSatish Balay   if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);}
699606d414cSSatish Balay   if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); }
7003a40ed3dSBarry Smith   PetscFunctionReturn(0);
701289bc588SBarry Smith }
702289bc588SBarry Smith /* ----------------------------------------------------------------*/
7034a2ae208SSatish Balay #undef __FUNCT__
7044a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense"
70513f74950SBarry Smith PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv)
706289bc588SBarry Smith {
707c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
70813f74950SBarry Smith   PetscInt     i,j,idx=0;
709d6dfbf8fSBarry Smith 
7103a40ed3dSBarry Smith   PetscFunctionBegin;
71171fd2e92SBarry Smith   if (v) PetscValidScalarPointer(v,6);
712289bc588SBarry Smith   if (!mat->roworiented) {
713dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
714289bc588SBarry Smith       for (j=0; j<n; j++) {
715cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
7162515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
717e32f2f54SBarry 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);
71858804f6dSBarry Smith #endif
719289bc588SBarry Smith         for (i=0; i<m; i++) {
720cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
7212515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
722e32f2f54SBarry 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);
72358804f6dSBarry Smith #endif
724cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
725289bc588SBarry Smith         }
726289bc588SBarry Smith       }
7273a40ed3dSBarry Smith     } else {
728289bc588SBarry Smith       for (j=0; j<n; j++) {
729cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
7302515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
731e32f2f54SBarry Smith         if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1);
73258804f6dSBarry Smith #endif
733289bc588SBarry Smith         for (i=0; i<m; i++) {
734cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
7352515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
736e32f2f54SBarry Smith           if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
73758804f6dSBarry Smith #endif
738cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
739289bc588SBarry Smith         }
740289bc588SBarry Smith       }
741289bc588SBarry Smith     }
7423a40ed3dSBarry Smith   } else {
743dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
744e8d4e0b9SBarry Smith       for (i=0; i<m; i++) {
745cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
7462515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
747e32f2f54SBarry 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);
74858804f6dSBarry Smith #endif
749e8d4e0b9SBarry Smith         for (j=0; j<n; j++) {
750cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
7512515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
752e32f2f54SBarry 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);
75358804f6dSBarry Smith #endif
754cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
755e8d4e0b9SBarry Smith         }
756e8d4e0b9SBarry Smith       }
7573a40ed3dSBarry Smith     } else {
758289bc588SBarry Smith       for (i=0; i<m; i++) {
759cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
7602515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
761e32f2f54SBarry Smith         if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
76258804f6dSBarry Smith #endif
763289bc588SBarry Smith         for (j=0; j<n; j++) {
764cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
7652515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
766e32f2f54SBarry Smith           if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1);
76758804f6dSBarry Smith #endif
768cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
769289bc588SBarry Smith         }
770289bc588SBarry Smith       }
771289bc588SBarry Smith     }
772e8d4e0b9SBarry Smith   }
7733a40ed3dSBarry Smith   PetscFunctionReturn(0);
774289bc588SBarry Smith }
775e8d4e0b9SBarry Smith 
7764a2ae208SSatish Balay #undef __FUNCT__
7774a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense"
77813f74950SBarry Smith PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[])
779ae80bb75SLois Curfman McInnes {
780ae80bb75SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
78113f74950SBarry Smith   PetscInt     i,j;
782ae80bb75SLois Curfman McInnes 
7833a40ed3dSBarry Smith   PetscFunctionBegin;
784ae80bb75SLois Curfman McInnes   /* row-oriented output */
785ae80bb75SLois Curfman McInnes   for (i=0; i<m; i++) {
78697e567efSBarry Smith     if (indexm[i] < 0) {v += n;continue;}
787e32f2f54SBarry 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);
788ae80bb75SLois Curfman McInnes     for (j=0; j<n; j++) {
7896f31f424SBarry Smith       if (indexn[j] < 0) {v++; continue;}
790e32f2f54SBarry 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);
79197e567efSBarry Smith       *v++ = mat->v[indexn[j]*mat->lda + indexm[i]];
792ae80bb75SLois Curfman McInnes     }
793ae80bb75SLois Curfman McInnes   }
7943a40ed3dSBarry Smith   PetscFunctionReturn(0);
795ae80bb75SLois Curfman McInnes }
796ae80bb75SLois Curfman McInnes 
797289bc588SBarry Smith /* -----------------------------------------------------------------*/
798289bc588SBarry Smith 
7994a2ae208SSatish Balay #undef __FUNCT__
8005bba2384SShri Abhyankar #define __FUNCT__ "MatLoad_SeqDense"
801112444f4SShri Abhyankar PetscErrorCode MatLoad_SeqDense(Mat newmat,PetscViewer viewer)
802aabbc4fbSShri Abhyankar {
803aabbc4fbSShri Abhyankar   Mat_SeqDense   *a;
804aabbc4fbSShri Abhyankar   PetscErrorCode ierr;
805aabbc4fbSShri Abhyankar   PetscInt       *scols,i,j,nz,header[4];
806aabbc4fbSShri Abhyankar   int            fd;
807aabbc4fbSShri Abhyankar   PetscMPIInt    size;
808aabbc4fbSShri Abhyankar   PetscInt       *rowlengths = 0,M,N,*cols,grows,gcols;
809aabbc4fbSShri Abhyankar   PetscScalar    *vals,*svals,*v,*w;
810aabbc4fbSShri Abhyankar   MPI_Comm       comm = ((PetscObject)viewer)->comm;
811aabbc4fbSShri Abhyankar 
812aabbc4fbSShri Abhyankar   PetscFunctionBegin;
813aabbc4fbSShri Abhyankar   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
814aabbc4fbSShri Abhyankar   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor");
815aabbc4fbSShri Abhyankar   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
816aabbc4fbSShri Abhyankar   ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr);
817aabbc4fbSShri Abhyankar   if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object");
818aabbc4fbSShri Abhyankar   M = header[1]; N = header[2]; nz = header[3];
819aabbc4fbSShri Abhyankar 
820aabbc4fbSShri Abhyankar   /* set global size if not set already*/
821aabbc4fbSShri Abhyankar   if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) {
822aabbc4fbSShri Abhyankar     ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr);
823aabbc4fbSShri Abhyankar   } else {
824aabbc4fbSShri Abhyankar     /* if sizes and type are already set, check if the vector global sizes are correct */
825aabbc4fbSShri Abhyankar     ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr);
826aabbc4fbSShri 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);
827aabbc4fbSShri Abhyankar   }
828aabbc4fbSShri Abhyankar   ierr = MatSeqDenseSetPreallocation(newmat,PETSC_NULL);CHKERRQ(ierr);
829aabbc4fbSShri Abhyankar 
830aabbc4fbSShri Abhyankar   if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */
831aabbc4fbSShri Abhyankar     a    = (Mat_SeqDense*)newmat->data;
832aabbc4fbSShri Abhyankar     v    = a->v;
833aabbc4fbSShri Abhyankar     /* Allocate some temp space to read in the values and then flip them
834aabbc4fbSShri Abhyankar        from row major to column major */
835aabbc4fbSShri Abhyankar     ierr = PetscMalloc((M*N > 0 ? M*N : 1)*sizeof(PetscScalar),&w);CHKERRQ(ierr);
836aabbc4fbSShri Abhyankar     /* read in nonzero values */
837aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr);
838aabbc4fbSShri Abhyankar     /* now flip the values and store them in the matrix*/
839aabbc4fbSShri Abhyankar     for (j=0; j<N; j++) {
840aabbc4fbSShri Abhyankar       for (i=0; i<M; i++) {
841aabbc4fbSShri Abhyankar         *v++ =w[i*N+j];
842aabbc4fbSShri Abhyankar       }
843aabbc4fbSShri Abhyankar     }
844aabbc4fbSShri Abhyankar     ierr = PetscFree(w);CHKERRQ(ierr);
845aabbc4fbSShri Abhyankar   } else {
846aabbc4fbSShri Abhyankar     /* read row lengths */
847aabbc4fbSShri Abhyankar     ierr = PetscMalloc((M+1)*sizeof(PetscInt),&rowlengths);CHKERRQ(ierr);
848aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr);
849aabbc4fbSShri Abhyankar 
850aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
851aabbc4fbSShri Abhyankar     v = a->v;
852aabbc4fbSShri Abhyankar 
853aabbc4fbSShri Abhyankar     /* read column indices and nonzeros */
854aabbc4fbSShri Abhyankar     ierr = PetscMalloc((nz+1)*sizeof(PetscInt),&scols);CHKERRQ(ierr);
855aabbc4fbSShri Abhyankar     cols = scols;
856aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr);
857aabbc4fbSShri Abhyankar     ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&svals);CHKERRQ(ierr);
858aabbc4fbSShri Abhyankar     vals = svals;
859aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr);
860aabbc4fbSShri Abhyankar 
861aabbc4fbSShri Abhyankar     /* insert into matrix */
862aabbc4fbSShri Abhyankar     for (i=0; i<M; i++) {
863aabbc4fbSShri Abhyankar       for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j];
864aabbc4fbSShri Abhyankar       svals += rowlengths[i]; scols += rowlengths[i];
865aabbc4fbSShri Abhyankar     }
866aabbc4fbSShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
867aabbc4fbSShri Abhyankar     ierr = PetscFree(cols);CHKERRQ(ierr);
868aabbc4fbSShri Abhyankar     ierr = PetscFree(rowlengths);CHKERRQ(ierr);
869aabbc4fbSShri Abhyankar   }
870aabbc4fbSShri Abhyankar   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
871aabbc4fbSShri Abhyankar   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
872aabbc4fbSShri Abhyankar 
873aabbc4fbSShri Abhyankar   PetscFunctionReturn(0);
874aabbc4fbSShri Abhyankar }
875aabbc4fbSShri Abhyankar 
876aabbc4fbSShri Abhyankar #undef __FUNCT__
8774a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII"
8786849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer)
879289bc588SBarry Smith {
880932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
881dfbe8321SBarry Smith   PetscErrorCode    ierr;
88213f74950SBarry Smith   PetscInt          i,j;
8832dcb1b2aSMatthew Knepley   const char        *name;
88487828ca2SBarry Smith   PetscScalar       *v;
885f3ef73ceSBarry Smith   PetscViewerFormat format;
8865f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX)
887ace3abfcSBarry Smith   PetscBool         allreal = PETSC_TRUE;
8885f481a85SSatish Balay #endif
889932b0c3eSLois Curfman McInnes 
8903a40ed3dSBarry Smith   PetscFunctionBegin;
891b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
892456192e2SBarry Smith   if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
8933a40ed3dSBarry Smith     PetscFunctionReturn(0);  /* do nothing for now */
894fb9695e5SSatish Balay   } else if (format == PETSC_VIEWER_ASCII_COMMON) {
895d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
8967566de4bSShri Abhyankar     ierr = PetscObjectPrintClassNamePrefixType((PetscObject)A,viewer,"Matrix Object");CHKERRQ(ierr);
897d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
89844cd7ae7SLois Curfman McInnes       v = a->v + i;
89977431f27SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr);
900d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
901aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
902329f5518SBarry Smith         if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) {
903a83599f4SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %G + %G i) ",j,PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr);
904329f5518SBarry Smith         } else if (PetscRealPart(*v)) {
905a83599f4SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,PetscRealPart(*v));CHKERRQ(ierr);
9066831982aSBarry Smith         }
90780cd9d93SLois Curfman McInnes #else
9086831982aSBarry Smith         if (*v) {
909a83599f4SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,*v);CHKERRQ(ierr);
9106831982aSBarry Smith         }
91180cd9d93SLois Curfman McInnes #endif
9121b807ce4Svictorle         v += a->lda;
91380cd9d93SLois Curfman McInnes       }
914b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
91580cd9d93SLois Curfman McInnes     }
916d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
9173a40ed3dSBarry Smith   } else {
918d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
919aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
92047989497SBarry Smith     /* determine if matrix has all real values */
92147989497SBarry Smith     v = a->v;
922d0f46423SBarry Smith     for (i=0; i<A->rmap->n*A->cmap->n; i++) {
923ffac6cdbSBarry Smith 	if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break ;}
92447989497SBarry Smith     }
92547989497SBarry Smith #endif
926fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
9273a7fca6bSBarry Smith       ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr);
928d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr);
929d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
930fb9695e5SSatish Balay       ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr);
9317566de4bSShri Abhyankar     } else {
9327566de4bSShri Abhyankar       ierr = PetscObjectPrintClassNamePrefixType((PetscObject)A,viewer,"Matrix Object");CHKERRQ(ierr);
933ffac6cdbSBarry Smith     }
934ffac6cdbSBarry Smith 
935d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
936932b0c3eSLois Curfman McInnes       v = a->v + i;
937d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
938aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
93947989497SBarry Smith         if (allreal) {
940c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr);
94147989497SBarry Smith         } else {
942c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr);
94347989497SBarry Smith         }
944289bc588SBarry Smith #else
945c61cd2faSJed Brown         ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr);
946289bc588SBarry Smith #endif
9471b807ce4Svictorle 	v += a->lda;
948289bc588SBarry Smith       }
949b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
950289bc588SBarry Smith     }
951fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
952b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr);
953ffac6cdbSBarry Smith     }
954d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
955da3a660dSBarry Smith   }
956b0a32e0cSBarry Smith   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
9573a40ed3dSBarry Smith   PetscFunctionReturn(0);
958289bc588SBarry Smith }
959289bc588SBarry Smith 
9604a2ae208SSatish Balay #undef __FUNCT__
9614a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary"
9626849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer)
963932b0c3eSLois Curfman McInnes {
964932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
9656849ba73SBarry Smith   PetscErrorCode    ierr;
96613f74950SBarry Smith   int               fd;
967d0f46423SBarry Smith   PetscInt          ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n;
968f4403165SShri Abhyankar   PetscScalar       *v,*anonz,*vals;
969f4403165SShri Abhyankar   PetscViewerFormat format;
970932b0c3eSLois Curfman McInnes 
9713a40ed3dSBarry Smith   PetscFunctionBegin;
972b0a32e0cSBarry Smith   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
97390ace30eSBarry Smith 
974f4403165SShri Abhyankar   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
975f4403165SShri Abhyankar   if (format == PETSC_VIEWER_NATIVE) {
976f4403165SShri Abhyankar     /* store the matrix as a dense matrix */
977f4403165SShri Abhyankar     ierr = PetscMalloc(4*sizeof(PetscInt),&col_lens);CHKERRQ(ierr);
978f4403165SShri Abhyankar     col_lens[0] = MAT_FILE_CLASSID;
979f4403165SShri Abhyankar     col_lens[1] = m;
980f4403165SShri Abhyankar     col_lens[2] = n;
981f4403165SShri Abhyankar     col_lens[3] = MATRIX_BINARY_FORMAT_DENSE;
982f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
983f4403165SShri Abhyankar     ierr = PetscFree(col_lens);CHKERRQ(ierr);
984f4403165SShri Abhyankar 
985f4403165SShri Abhyankar     /* write out matrix, by rows */
986f4403165SShri Abhyankar     ierr = PetscMalloc((m*n+1)*sizeof(PetscScalar),&vals);CHKERRQ(ierr);
987f4403165SShri Abhyankar     v    = a->v;
988f4403165SShri Abhyankar     for (j=0; j<n; j++) {
989f4403165SShri Abhyankar       for (i=0; i<m; i++) {
990f4403165SShri Abhyankar         vals[j + i*n] = *v++;
991f4403165SShri Abhyankar       }
992f4403165SShri Abhyankar     }
993f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
994f4403165SShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
995f4403165SShri Abhyankar   } else {
99613f74950SBarry Smith     ierr = PetscMalloc((4+nz)*sizeof(PetscInt),&col_lens);CHKERRQ(ierr);
9970700a824SBarry Smith     col_lens[0] = MAT_FILE_CLASSID;
998932b0c3eSLois Curfman McInnes     col_lens[1] = m;
999932b0c3eSLois Curfman McInnes     col_lens[2] = n;
1000932b0c3eSLois Curfman McInnes     col_lens[3] = nz;
1001932b0c3eSLois Curfman McInnes 
1002932b0c3eSLois Curfman McInnes     /* store lengths of each row and write (including header) to file */
1003932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) col_lens[4+i] = n;
10046f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
1005932b0c3eSLois Curfman McInnes 
1006932b0c3eSLois Curfman McInnes     /* Possibly should write in smaller increments, not whole matrix at once? */
1007932b0c3eSLois Curfman McInnes     /* store column indices (zero start index) */
1008932b0c3eSLois Curfman McInnes     ict = 0;
1009932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1010932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) col_lens[ict++] = j;
1011932b0c3eSLois Curfman McInnes     }
10126f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
1013606d414cSSatish Balay     ierr = PetscFree(col_lens);CHKERRQ(ierr);
1014932b0c3eSLois Curfman McInnes 
1015932b0c3eSLois Curfman McInnes     /* store nonzero values */
101687828ca2SBarry Smith     ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&anonz);CHKERRQ(ierr);
1017932b0c3eSLois Curfman McInnes     ict  = 0;
1018932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1019932b0c3eSLois Curfman McInnes       v = a->v + i;
1020932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) {
10211b807ce4Svictorle         anonz[ict++] = *v; v += a->lda;
1022932b0c3eSLois Curfman McInnes       }
1023932b0c3eSLois Curfman McInnes     }
10246f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
1025606d414cSSatish Balay     ierr = PetscFree(anonz);CHKERRQ(ierr);
1026f4403165SShri Abhyankar   }
10273a40ed3dSBarry Smith   PetscFunctionReturn(0);
1028932b0c3eSLois Curfman McInnes }
1029932b0c3eSLois Curfman McInnes 
10304a2ae208SSatish Balay #undef __FUNCT__
10314a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom"
1032dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa)
1033f1af5d2fSBarry Smith {
1034f1af5d2fSBarry Smith   Mat               A = (Mat) Aa;
1035f1af5d2fSBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
10366849ba73SBarry Smith   PetscErrorCode    ierr;
1037d0f46423SBarry Smith   PetscInt          m = A->rmap->n,n = A->cmap->n,color,i,j;
103887828ca2SBarry Smith   PetscScalar       *v = a->v;
1039b0a32e0cSBarry Smith   PetscViewer       viewer;
1040b0a32e0cSBarry Smith   PetscDraw         popup;
1041329f5518SBarry Smith   PetscReal         xl,yl,xr,yr,x_l,x_r,y_l,y_r,scale,maxv = 0.0;
1042f3ef73ceSBarry Smith   PetscViewerFormat format;
1043f1af5d2fSBarry Smith 
1044f1af5d2fSBarry Smith   PetscFunctionBegin;
1045f1af5d2fSBarry Smith 
1046f1af5d2fSBarry Smith   ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr);
1047b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1048b0a32e0cSBarry Smith   ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr);
1049f1af5d2fSBarry Smith 
1050f1af5d2fSBarry Smith   /* Loop over matrix elements drawing boxes */
1051fb9695e5SSatish Balay   if (format != PETSC_VIEWER_DRAW_CONTOUR) {
1052f1af5d2fSBarry Smith     /* Blue for negative and Red for positive */
1053b0a32e0cSBarry Smith     color = PETSC_DRAW_BLUE;
1054f1af5d2fSBarry Smith     for(j = 0; j < n; j++) {
1055f1af5d2fSBarry Smith       x_l = j;
1056f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1057f1af5d2fSBarry Smith       for(i = 0; i < m; i++) {
1058f1af5d2fSBarry Smith         y_l = m - i - 1.0;
1059f1af5d2fSBarry Smith         y_r = y_l + 1.0;
1060f1af5d2fSBarry Smith #if defined(PETSC_USE_COMPLEX)
1061329f5518SBarry Smith         if (PetscRealPart(v[j*m+i]) >  0.) {
1062b0a32e0cSBarry Smith           color = PETSC_DRAW_RED;
1063329f5518SBarry Smith         } else if (PetscRealPart(v[j*m+i]) <  0.) {
1064b0a32e0cSBarry Smith           color = PETSC_DRAW_BLUE;
1065f1af5d2fSBarry Smith         } else {
1066f1af5d2fSBarry Smith           continue;
1067f1af5d2fSBarry Smith         }
1068f1af5d2fSBarry Smith #else
1069f1af5d2fSBarry Smith         if (v[j*m+i] >  0.) {
1070b0a32e0cSBarry Smith           color = PETSC_DRAW_RED;
1071f1af5d2fSBarry Smith         } else if (v[j*m+i] <  0.) {
1072b0a32e0cSBarry Smith           color = PETSC_DRAW_BLUE;
1073f1af5d2fSBarry Smith         } else {
1074f1af5d2fSBarry Smith           continue;
1075f1af5d2fSBarry Smith         }
1076f1af5d2fSBarry Smith #endif
1077b0a32e0cSBarry Smith         ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1078f1af5d2fSBarry Smith       }
1079f1af5d2fSBarry Smith     }
1080f1af5d2fSBarry Smith   } else {
1081f1af5d2fSBarry Smith     /* use contour shading to indicate magnitude of values */
1082f1af5d2fSBarry Smith     /* first determine max of all nonzero values */
1083f1af5d2fSBarry Smith     for(i = 0; i < m*n; i++) {
1084f1af5d2fSBarry Smith       if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]);
1085f1af5d2fSBarry Smith     }
1086b0a32e0cSBarry Smith     scale = (245.0 - PETSC_DRAW_BASIC_COLORS)/maxv;
1087b0a32e0cSBarry Smith     ierr  = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr);
1088b0a32e0cSBarry Smith     if (popup) {ierr  = PetscDrawScalePopup(popup,0.0,maxv);CHKERRQ(ierr);}
1089f1af5d2fSBarry Smith     for(j = 0; j < n; j++) {
1090f1af5d2fSBarry Smith       x_l = j;
1091f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1092f1af5d2fSBarry Smith       for(i = 0; i < m; i++) {
1093f1af5d2fSBarry Smith         y_l   = m - i - 1.0;
1094f1af5d2fSBarry Smith         y_r   = y_l + 1.0;
1095b0a32e0cSBarry Smith         color = PETSC_DRAW_BASIC_COLORS + (int)(scale*PetscAbsScalar(v[j*m+i]));
1096b0a32e0cSBarry Smith         ierr  = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1097f1af5d2fSBarry Smith       }
1098f1af5d2fSBarry Smith     }
1099f1af5d2fSBarry Smith   }
1100f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1101f1af5d2fSBarry Smith }
1102f1af5d2fSBarry Smith 
11034a2ae208SSatish Balay #undef __FUNCT__
11044a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw"
1105dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer)
1106f1af5d2fSBarry Smith {
1107b0a32e0cSBarry Smith   PetscDraw      draw;
1108ace3abfcSBarry Smith   PetscBool      isnull;
1109329f5518SBarry Smith   PetscReal      xr,yr,xl,yl,h,w;
1110dfbe8321SBarry Smith   PetscErrorCode ierr;
1111f1af5d2fSBarry Smith 
1112f1af5d2fSBarry Smith   PetscFunctionBegin;
1113b0a32e0cSBarry Smith   ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
1114b0a32e0cSBarry Smith   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
1115abc0a331SBarry Smith   if (isnull) PetscFunctionReturn(0);
1116f1af5d2fSBarry Smith 
1117f1af5d2fSBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr);
1118d0f46423SBarry Smith   xr  = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0;
1119f1af5d2fSBarry Smith   xr += w;    yr += h;  xl = -w;     yl = -h;
1120b0a32e0cSBarry Smith   ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr);
1121b0a32e0cSBarry Smith   ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr);
1122f1af5d2fSBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",PETSC_NULL);CHKERRQ(ierr);
1123f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1124f1af5d2fSBarry Smith }
1125f1af5d2fSBarry Smith 
11264a2ae208SSatish Balay #undef __FUNCT__
11274a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense"
1128dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer)
1129932b0c3eSLois Curfman McInnes {
1130dfbe8321SBarry Smith   PetscErrorCode ierr;
1131ace3abfcSBarry Smith   PetscBool      iascii,isbinary,isdraw;
1132932b0c3eSLois Curfman McInnes 
11333a40ed3dSBarry Smith   PetscFunctionBegin;
1134251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
1135251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
1136251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
11370f5bd95cSBarry Smith 
1138c45a1595SBarry Smith   if (iascii) {
1139c45a1595SBarry Smith     ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr);
11400f5bd95cSBarry Smith   } else if (isbinary) {
11413a40ed3dSBarry Smith     ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr);
1142f1af5d2fSBarry Smith   } else if (isdraw) {
1143f1af5d2fSBarry Smith     ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr);
11445cd90555SBarry Smith   } else {
1145e32f2f54SBarry Smith     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Viewer type %s not supported by dense matrix",((PetscObject)viewer)->type_name);
1146932b0c3eSLois Curfman McInnes   }
11473a40ed3dSBarry Smith   PetscFunctionReturn(0);
1148932b0c3eSLois Curfman McInnes }
1149289bc588SBarry Smith 
11504a2ae208SSatish Balay #undef __FUNCT__
11514a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense"
1152dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqDense(Mat mat)
1153289bc588SBarry Smith {
1154ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)mat->data;
1155dfbe8321SBarry Smith   PetscErrorCode ierr;
115690f02eecSBarry Smith 
11573a40ed3dSBarry Smith   PetscFunctionBegin;
1158aa482453SBarry Smith #if defined(PETSC_USE_LOG)
1159d0f46423SBarry Smith   PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n);
1160a5a9c739SBarry Smith #endif
116105b42c5fSBarry Smith   ierr = PetscFree(l->pivots);CHKERRQ(ierr);
11626857c123SSatish Balay   if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);}
1163bf0cc555SLisandro Dalcin   ierr = PetscFree(mat->data);CHKERRQ(ierr);
1164dbd8c25aSHong Zhang 
1165dbd8c25aSHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr);
1166901853e0SKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatSeqDenseSetPreallocation_C","",PETSC_NULL);CHKERRQ(ierr);
11674ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMult_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr);
11684ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr);
11694ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr);
11703a40ed3dSBarry Smith   PetscFunctionReturn(0);
1171289bc588SBarry Smith }
1172289bc588SBarry Smith 
11734a2ae208SSatish Balay #undef __FUNCT__
11744a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense"
1175fc4dec0aSBarry Smith PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout)
1176289bc588SBarry Smith {
1177c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
11786849ba73SBarry Smith   PetscErrorCode ierr;
117913f74950SBarry Smith   PetscInt       k,j,m,n,M;
118087828ca2SBarry Smith   PetscScalar    *v,tmp;
118148b35521SBarry Smith 
11823a40ed3dSBarry Smith   PetscFunctionBegin;
1183d0f46423SBarry Smith   v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n;
1184e9695a30SBarry Smith   if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */
1185e7e72b3dSBarry Smith     if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place");
1186e7e72b3dSBarry Smith     else {
1187d3e5ee88SLois Curfman McInnes       for (j=0; j<m; j++) {
1188289bc588SBarry Smith         for (k=0; k<j; k++) {
11891b807ce4Svictorle           tmp = v[j + k*M];
11901b807ce4Svictorle           v[j + k*M] = v[k + j*M];
11911b807ce4Svictorle           v[k + j*M] = tmp;
1192289bc588SBarry Smith         }
1193289bc588SBarry Smith       }
1194d64ed03dSBarry Smith     }
11953a40ed3dSBarry Smith   } else { /* out-of-place transpose */
1196d3e5ee88SLois Curfman McInnes     Mat          tmat;
1197ec8511deSBarry Smith     Mat_SeqDense *tmatd;
119887828ca2SBarry Smith     PetscScalar  *v2;
1199ea709b57SSatish Balay 
1200fc4dec0aSBarry Smith     if (reuse == MAT_INITIAL_MATRIX) {
12017adad957SLisandro Dalcin       ierr  = MatCreate(((PetscObject)A)->comm,&tmat);CHKERRQ(ierr);
1202d0f46423SBarry Smith       ierr  = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr);
12037adad957SLisandro Dalcin       ierr  = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
12045c5985e7SKris Buschelman       ierr  = MatSeqDenseSetPreallocation(tmat,PETSC_NULL);CHKERRQ(ierr);
1205fc4dec0aSBarry Smith     } else {
1206fc4dec0aSBarry Smith       tmat = *matout;
1207fc4dec0aSBarry Smith     }
1208ec8511deSBarry Smith     tmatd = (Mat_SeqDense*)tmat->data;
12090de55854SLois Curfman McInnes     v = mat->v; v2 = tmatd->v;
1210d3e5ee88SLois Curfman McInnes     for (j=0; j<n; j++) {
12111b807ce4Svictorle       for (k=0; k<m; k++) v2[j + k*n] = v[k + j*M];
1212d3e5ee88SLois Curfman McInnes     }
12136d4a8577SBarry Smith     ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
12146d4a8577SBarry Smith     ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1215d3e5ee88SLois Curfman McInnes     *matout = tmat;
121648b35521SBarry Smith   }
12173a40ed3dSBarry Smith   PetscFunctionReturn(0);
1218289bc588SBarry Smith }
1219289bc588SBarry Smith 
12204a2ae208SSatish Balay #undef __FUNCT__
12214a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense"
1222ace3abfcSBarry Smith PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool  *flg)
1223289bc588SBarry Smith {
1224c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data;
1225c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data;
122613f74950SBarry Smith   PetscInt     i,j;
122787828ca2SBarry Smith   PetscScalar  *v1 = mat1->v,*v2 = mat2->v;
12289ea5d5aeSSatish Balay 
12293a40ed3dSBarry Smith   PetscFunctionBegin;
1230d0f46423SBarry Smith   if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1231d0f46423SBarry Smith   if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1232d0f46423SBarry Smith   for (i=0; i<A1->rmap->n; i++) {
12331b807ce4Svictorle     v1 = mat1->v+i; v2 = mat2->v+i;
1234d0f46423SBarry Smith     for (j=0; j<A1->cmap->n; j++) {
12353a40ed3dSBarry Smith       if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
12361b807ce4Svictorle       v1 += mat1->lda; v2 += mat2->lda;
12371b807ce4Svictorle     }
1238289bc588SBarry Smith   }
123977c4ece6SBarry Smith   *flg = PETSC_TRUE;
12403a40ed3dSBarry Smith   PetscFunctionReturn(0);
1241289bc588SBarry Smith }
1242289bc588SBarry Smith 
12434a2ae208SSatish Balay #undef __FUNCT__
12444a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense"
1245dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v)
1246289bc588SBarry Smith {
1247c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
1248dfbe8321SBarry Smith   PetscErrorCode ierr;
124913f74950SBarry Smith   PetscInt       i,n,len;
125087828ca2SBarry Smith   PetscScalar    *x,zero = 0.0;
125144cd7ae7SLois Curfman McInnes 
12523a40ed3dSBarry Smith   PetscFunctionBegin;
12532dcb1b2aSMatthew Knepley   ierr = VecSet(v,zero);CHKERRQ(ierr);
12547a97a34bSBarry Smith   ierr = VecGetSize(v,&n);CHKERRQ(ierr);
12551ebc52fbSHong Zhang   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1256d0f46423SBarry Smith   len = PetscMin(A->rmap->n,A->cmap->n);
1257e32f2f54SBarry Smith   if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec");
125844cd7ae7SLois Curfman McInnes   for (i=0; i<len; i++) {
12591b807ce4Svictorle     x[i] = mat->v[i*mat->lda + i];
1260289bc588SBarry Smith   }
12611ebc52fbSHong Zhang   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
12623a40ed3dSBarry Smith   PetscFunctionReturn(0);
1263289bc588SBarry Smith }
1264289bc588SBarry Smith 
12654a2ae208SSatish Balay #undef __FUNCT__
12664a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense"
1267dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr)
1268289bc588SBarry Smith {
1269c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
127087828ca2SBarry Smith   PetscScalar    *l,*r,x,*v;
1271dfbe8321SBarry Smith   PetscErrorCode ierr;
1272d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n;
127355659b69SBarry Smith 
12743a40ed3dSBarry Smith   PetscFunctionBegin;
127528988994SBarry Smith   if (ll) {
12767a97a34bSBarry Smith     ierr = VecGetSize(ll,&m);CHKERRQ(ierr);
12771ebc52fbSHong Zhang     ierr = VecGetArray(ll,&l);CHKERRQ(ierr);
1278e32f2f54SBarry Smith     if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size");
1279da3a660dSBarry Smith     for (i=0; i<m; i++) {
1280da3a660dSBarry Smith       x = l[i];
1281da3a660dSBarry Smith       v = mat->v + i;
1282da3a660dSBarry Smith       for (j=0; j<n; j++) { (*v) *= x; v+= m;}
1283da3a660dSBarry Smith     }
12841ebc52fbSHong Zhang     ierr = VecRestoreArray(ll,&l);CHKERRQ(ierr);
1285efee365bSSatish Balay     ierr = PetscLogFlops(n*m);CHKERRQ(ierr);
1286da3a660dSBarry Smith   }
128728988994SBarry Smith   if (rr) {
12887a97a34bSBarry Smith     ierr = VecGetSize(rr,&n);CHKERRQ(ierr);
12891ebc52fbSHong Zhang     ierr = VecGetArray(rr,&r);CHKERRQ(ierr);
1290e32f2f54SBarry Smith     if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size");
1291da3a660dSBarry Smith     for (i=0; i<n; i++) {
1292da3a660dSBarry Smith       x = r[i];
1293da3a660dSBarry Smith       v = mat->v + i*m;
1294da3a660dSBarry Smith       for (j=0; j<m; j++) { (*v++) *= x;}
1295da3a660dSBarry Smith     }
12961ebc52fbSHong Zhang     ierr = VecRestoreArray(rr,&r);CHKERRQ(ierr);
1297efee365bSSatish Balay     ierr = PetscLogFlops(n*m);CHKERRQ(ierr);
1298da3a660dSBarry Smith   }
12993a40ed3dSBarry Smith   PetscFunctionReturn(0);
1300289bc588SBarry Smith }
1301289bc588SBarry Smith 
13024a2ae208SSatish Balay #undef __FUNCT__
13034a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense"
1304dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm)
1305289bc588SBarry Smith {
1306c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
130787828ca2SBarry Smith   PetscScalar  *v = mat->v;
1308329f5518SBarry Smith   PetscReal    sum = 0.0;
1309d0f46423SBarry Smith   PetscInt     lda=mat->lda,m=A->rmap->n,i,j;
1310efee365bSSatish Balay   PetscErrorCode ierr;
131155659b69SBarry Smith 
13123a40ed3dSBarry Smith   PetscFunctionBegin;
1313289bc588SBarry Smith   if (type == NORM_FROBENIUS) {
1314a5ce6ee0Svictorle     if (lda>m) {
1315d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1316a5ce6ee0Svictorle 	v = mat->v+j*lda;
1317a5ce6ee0Svictorle 	for (i=0; i<m; i++) {
1318a5ce6ee0Svictorle #if defined(PETSC_USE_COMPLEX)
1319a5ce6ee0Svictorle 	  sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1320a5ce6ee0Svictorle #else
1321a5ce6ee0Svictorle 	  sum += (*v)*(*v); v++;
1322a5ce6ee0Svictorle #endif
1323a5ce6ee0Svictorle 	}
1324a5ce6ee0Svictorle       }
1325a5ce6ee0Svictorle     } else {
1326d0f46423SBarry Smith       for (i=0; i<A->cmap->n*A->rmap->n; i++) {
1327aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
1328329f5518SBarry Smith 	sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1329289bc588SBarry Smith #else
1330289bc588SBarry Smith 	sum += (*v)*(*v); v++;
1331289bc588SBarry Smith #endif
1332289bc588SBarry Smith       }
1333a5ce6ee0Svictorle     }
13348f1a2a5eSBarry Smith     *nrm = PetscSqrtReal(sum);
1335dc0b31edSSatish Balay     ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
13363a40ed3dSBarry Smith   } else if (type == NORM_1) {
1337064f8208SBarry Smith     *nrm = 0.0;
1338d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
13391b807ce4Svictorle       v = mat->v + j*mat->lda;
1340289bc588SBarry Smith       sum = 0.0;
1341d0f46423SBarry Smith       for (i=0; i<A->rmap->n; i++) {
134233a8263dSBarry Smith         sum += PetscAbsScalar(*v);  v++;
1343289bc588SBarry Smith       }
1344064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1345289bc588SBarry Smith     }
1346d0f46423SBarry Smith     ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr);
13473a40ed3dSBarry Smith   } else if (type == NORM_INFINITY) {
1348064f8208SBarry Smith     *nrm = 0.0;
1349d0f46423SBarry Smith     for (j=0; j<A->rmap->n; j++) {
1350289bc588SBarry Smith       v = mat->v + j;
1351289bc588SBarry Smith       sum = 0.0;
1352d0f46423SBarry Smith       for (i=0; i<A->cmap->n; i++) {
13531b807ce4Svictorle         sum += PetscAbsScalar(*v); v += mat->lda;
1354289bc588SBarry Smith       }
1355064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1356289bc588SBarry Smith     }
1357d0f46423SBarry Smith     ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr);
1358e7e72b3dSBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm");
13593a40ed3dSBarry Smith   PetscFunctionReturn(0);
1360289bc588SBarry Smith }
1361289bc588SBarry Smith 
13624a2ae208SSatish Balay #undef __FUNCT__
13634a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense"
1364ace3abfcSBarry Smith PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool  flg)
1365289bc588SBarry Smith {
1366c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *aij = (Mat_SeqDense*)A->data;
136763ba0a88SBarry Smith   PetscErrorCode ierr;
136867e560aaSBarry Smith 
13693a40ed3dSBarry Smith   PetscFunctionBegin;
1370b5a2b587SKris Buschelman   switch (op) {
1371b5a2b587SKris Buschelman   case MAT_ROW_ORIENTED:
13724e0d8c25SBarry Smith     aij->roworiented = flg;
1373b5a2b587SKris Buschelman     break;
1374512a5fc5SBarry Smith   case MAT_NEW_NONZERO_LOCATIONS:
1375b5a2b587SKris Buschelman   case MAT_NEW_NONZERO_LOCATION_ERR:
13763971808eSMatthew Knepley   case MAT_NEW_NONZERO_ALLOCATION_ERR:
13774e0d8c25SBarry Smith   case MAT_NEW_DIAGONALS:
137813fa8e87SLisandro Dalcin   case MAT_KEEP_NONZERO_PATTERN:
1379b5a2b587SKris Buschelman   case MAT_IGNORE_OFF_PROC_ENTRIES:
1380b5a2b587SKris Buschelman   case MAT_USE_HASH_TABLE:
138177e54ba9SKris Buschelman   case MAT_SYMMETRIC:
138277e54ba9SKris Buschelman   case MAT_STRUCTURALLY_SYMMETRIC:
13839a4540c5SBarry Smith   case MAT_HERMITIAN:
13849a4540c5SBarry Smith   case MAT_SYMMETRY_ETERNAL:
1385600fe468SBarry Smith   case MAT_IGNORE_LOWER_TRIANGULAR:
1386290bbb0aSBarry Smith     ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr);
138777e54ba9SKris Buschelman     break;
1388b5a2b587SKris Buschelman   default:
1389e32f2f54SBarry Smith     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]);
13903a40ed3dSBarry Smith   }
13913a40ed3dSBarry Smith   PetscFunctionReturn(0);
1392289bc588SBarry Smith }
1393289bc588SBarry Smith 
13944a2ae208SSatish Balay #undef __FUNCT__
13954a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense"
1396dfbe8321SBarry Smith PetscErrorCode MatZeroEntries_SeqDense(Mat A)
13976f0a148fSBarry Smith {
1398ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)A->data;
13996849ba73SBarry Smith   PetscErrorCode ierr;
1400d0f46423SBarry Smith   PetscInt       lda=l->lda,m=A->rmap->n,j;
14013a40ed3dSBarry Smith 
14023a40ed3dSBarry Smith   PetscFunctionBegin;
1403a5ce6ee0Svictorle   if (lda>m) {
1404d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1405a5ce6ee0Svictorle       ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
1406a5ce6ee0Svictorle     }
1407a5ce6ee0Svictorle   } else {
1408d0f46423SBarry Smith     ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1409a5ce6ee0Svictorle   }
14103a40ed3dSBarry Smith   PetscFunctionReturn(0);
14116f0a148fSBarry Smith }
14126f0a148fSBarry Smith 
14134a2ae208SSatish Balay #undef __FUNCT__
14144a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense"
14152b40b63fSBarry Smith PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b)
14166f0a148fSBarry Smith {
141797b48c8fSBarry Smith   PetscErrorCode    ierr;
1418ec8511deSBarry Smith   Mat_SeqDense      *l = (Mat_SeqDense*)A->data;
1419b9679d65SBarry Smith   PetscInt          m = l->lda, n = A->cmap->n, i,j;
142097b48c8fSBarry Smith   PetscScalar       *slot,*bb;
142197b48c8fSBarry Smith   const PetscScalar *xx;
142255659b69SBarry Smith 
14233a40ed3dSBarry Smith   PetscFunctionBegin;
1424b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG)
1425b9679d65SBarry Smith   for (i=0; i<N; i++) {
1426b9679d65SBarry Smith     if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed");
1427b9679d65SBarry 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);
1428b9679d65SBarry Smith   }
1429b9679d65SBarry Smith #endif
1430b9679d65SBarry Smith 
143197b48c8fSBarry Smith   /* fix right hand side if needed */
143297b48c8fSBarry Smith   if (x && b) {
143397b48c8fSBarry Smith     ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr);
143497b48c8fSBarry Smith     ierr = VecGetArray(b,&bb);CHKERRQ(ierr);
143597b48c8fSBarry Smith     for (i=0; i<N; i++) {
143697b48c8fSBarry Smith       bb[rows[i]] = diag*xx[rows[i]];
143797b48c8fSBarry Smith     }
143897b48c8fSBarry Smith     ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr);
143997b48c8fSBarry Smith     ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr);
144097b48c8fSBarry Smith   }
144197b48c8fSBarry Smith 
14426f0a148fSBarry Smith   for (i=0; i<N; i++) {
14436f0a148fSBarry Smith     slot = l->v + rows[i];
1444b9679d65SBarry Smith     for (j=0; j<n; j++) { *slot = 0.0; slot += m;}
14456f0a148fSBarry Smith   }
1446f4df32b1SMatthew Knepley   if (diag != 0.0) {
1447b9679d65SBarry Smith     if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices");
14486f0a148fSBarry Smith     for (i=0; i<N; i++) {
1449b9679d65SBarry Smith       slot = l->v + (m+1)*rows[i];
1450f4df32b1SMatthew Knepley       *slot = diag;
14516f0a148fSBarry Smith     }
14526f0a148fSBarry Smith   }
14533a40ed3dSBarry Smith   PetscFunctionReturn(0);
14546f0a148fSBarry Smith }
1455557bce09SLois Curfman McInnes 
14564a2ae208SSatish Balay #undef __FUNCT__
14574a2ae208SSatish Balay #define __FUNCT__ "MatGetArray_SeqDense"
1458dfbe8321SBarry Smith PetscErrorCode MatGetArray_SeqDense(Mat A,PetscScalar *array[])
145964e87e97SBarry Smith {
1460c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
14613a40ed3dSBarry Smith 
14623a40ed3dSBarry Smith   PetscFunctionBegin;
1463e32f2f54SBarry 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");
146464e87e97SBarry Smith   *array = mat->v;
14653a40ed3dSBarry Smith   PetscFunctionReturn(0);
146664e87e97SBarry Smith }
14670754003eSLois Curfman McInnes 
14684a2ae208SSatish Balay #undef __FUNCT__
14694a2ae208SSatish Balay #define __FUNCT__ "MatRestoreArray_SeqDense"
1470dfbe8321SBarry Smith PetscErrorCode MatRestoreArray_SeqDense(Mat A,PetscScalar *array[])
1471ff14e315SSatish Balay {
14723a40ed3dSBarry Smith   PetscFunctionBegin;
147309b544d4SBarry Smith   *array = 0; /* user cannot accidently use the array later */
14743a40ed3dSBarry Smith   PetscFunctionReturn(0);
1475ff14e315SSatish Balay }
14760754003eSLois Curfman McInnes 
14774a2ae208SSatish Balay #undef __FUNCT__
14784a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense"
147913f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B)
14800754003eSLois Curfman McInnes {
1481c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
14826849ba73SBarry Smith   PetscErrorCode ierr;
14835d0c19d7SBarry Smith   PetscInt       i,j,nrows,ncols;
14845d0c19d7SBarry Smith   const PetscInt *irow,*icol;
148587828ca2SBarry Smith   PetscScalar    *av,*bv,*v = mat->v;
14860754003eSLois Curfman McInnes   Mat            newmat;
14870754003eSLois Curfman McInnes 
14883a40ed3dSBarry Smith   PetscFunctionBegin;
148978b31e54SBarry Smith   ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr);
149078b31e54SBarry Smith   ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr);
1491e03a110bSBarry Smith   ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr);
1492e03a110bSBarry Smith   ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr);
14930754003eSLois Curfman McInnes 
1494182d2002SSatish Balay   /* Check submatrixcall */
1495182d2002SSatish Balay   if (scall == MAT_REUSE_MATRIX) {
149613f74950SBarry Smith     PetscInt n_cols,n_rows;
1497182d2002SSatish Balay     ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr);
149821a2c019SBarry Smith     if (n_rows != nrows || n_cols != ncols) {
1499f746d493SDmitry Karpeev       /* resize the result matrix to match number of requested rows/columns */
1500c61587bbSBarry Smith       ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
150121a2c019SBarry Smith     }
1502182d2002SSatish Balay     newmat = *B;
1503182d2002SSatish Balay   } else {
15040754003eSLois Curfman McInnes     /* Create and fill new matrix */
15057adad957SLisandro Dalcin     ierr = MatCreate(((PetscObject)A)->comm,&newmat);CHKERRQ(ierr);
1506f69a0ea3SMatthew Knepley     ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
15077adad957SLisandro Dalcin     ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
15085c5985e7SKris Buschelman     ierr = MatSeqDenseSetPreallocation(newmat,PETSC_NULL);CHKERRQ(ierr);
1509182d2002SSatish Balay   }
1510182d2002SSatish Balay 
1511182d2002SSatish Balay   /* Now extract the data pointers and do the copy,column at a time */
1512182d2002SSatish Balay   bv = ((Mat_SeqDense*)newmat->data)->v;
1513182d2002SSatish Balay 
1514182d2002SSatish Balay   for (i=0; i<ncols; i++) {
15156de62eeeSBarry Smith     av = v + mat->lda*icol[i];
1516182d2002SSatish Balay     for (j=0; j<nrows; j++) {
1517182d2002SSatish Balay       *bv++ = av[irow[j]];
15180754003eSLois Curfman McInnes     }
15190754003eSLois Curfman McInnes   }
1520182d2002SSatish Balay 
1521182d2002SSatish Balay   /* Assemble the matrices so that the correct flags are set */
15226d4a8577SBarry Smith   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
15236d4a8577SBarry Smith   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
15240754003eSLois Curfman McInnes 
15250754003eSLois Curfman McInnes   /* Free work space */
152678b31e54SBarry Smith   ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr);
152778b31e54SBarry Smith   ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr);
1528182d2002SSatish Balay   *B = newmat;
15293a40ed3dSBarry Smith   PetscFunctionReturn(0);
15300754003eSLois Curfman McInnes }
15310754003eSLois Curfman McInnes 
15324a2ae208SSatish Balay #undef __FUNCT__
15334a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense"
153413f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[])
1535905e6a2fSBarry Smith {
15366849ba73SBarry Smith   PetscErrorCode ierr;
153713f74950SBarry Smith   PetscInt       i;
1538905e6a2fSBarry Smith 
15393a40ed3dSBarry Smith   PetscFunctionBegin;
1540905e6a2fSBarry Smith   if (scall == MAT_INITIAL_MATRIX) {
1541b0a32e0cSBarry Smith     ierr = PetscMalloc((n+1)*sizeof(Mat),B);CHKERRQ(ierr);
1542905e6a2fSBarry Smith   }
1543905e6a2fSBarry Smith 
1544905e6a2fSBarry Smith   for (i=0; i<n; i++) {
15456a6a5d1dSBarry Smith     ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr);
1546905e6a2fSBarry Smith   }
15473a40ed3dSBarry Smith   PetscFunctionReturn(0);
1548905e6a2fSBarry Smith }
1549905e6a2fSBarry Smith 
15504a2ae208SSatish Balay #undef __FUNCT__
1551c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense"
1552c0aa2d19SHong Zhang PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode)
1553c0aa2d19SHong Zhang {
1554c0aa2d19SHong Zhang   PetscFunctionBegin;
1555c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1556c0aa2d19SHong Zhang }
1557c0aa2d19SHong Zhang 
1558c0aa2d19SHong Zhang #undef __FUNCT__
1559c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense"
1560c0aa2d19SHong Zhang PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode)
1561c0aa2d19SHong Zhang {
1562c0aa2d19SHong Zhang   PetscFunctionBegin;
1563c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1564c0aa2d19SHong Zhang }
1565c0aa2d19SHong Zhang 
1566c0aa2d19SHong Zhang #undef __FUNCT__
15674a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense"
1568dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str)
15694b0e389bSBarry Smith {
15704b0e389bSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense *)B->data;
15716849ba73SBarry Smith   PetscErrorCode ierr;
1572d0f46423SBarry Smith   PetscInt       lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j;
15733a40ed3dSBarry Smith 
15743a40ed3dSBarry Smith   PetscFunctionBegin;
157533f4a19fSKris Buschelman   /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */
157633f4a19fSKris Buschelman   if (A->ops->copy != B->ops->copy) {
1577cb5b572fSBarry Smith     ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr);
15783a40ed3dSBarry Smith     PetscFunctionReturn(0);
15793a40ed3dSBarry Smith   }
1580e32f2f54SBarry Smith   if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)");
1581a5ce6ee0Svictorle   if (lda1>m || lda2>m) {
15820dbb7854Svictorle     for (j=0; j<n; j++) {
1583a5ce6ee0Svictorle       ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr);
1584a5ce6ee0Svictorle     }
1585a5ce6ee0Svictorle   } else {
1586d0f46423SBarry Smith     ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1587a5ce6ee0Svictorle   }
1588273d9f13SBarry Smith   PetscFunctionReturn(0);
1589273d9f13SBarry Smith }
1590273d9f13SBarry Smith 
15914a2ae208SSatish Balay #undef __FUNCT__
15924994cf47SJed Brown #define __FUNCT__ "MatSetUp_SeqDense"
15934994cf47SJed Brown PetscErrorCode MatSetUp_SeqDense(Mat A)
1594273d9f13SBarry Smith {
1595dfbe8321SBarry Smith   PetscErrorCode ierr;
1596273d9f13SBarry Smith 
1597273d9f13SBarry Smith   PetscFunctionBegin;
1598273d9f13SBarry Smith   ierr =  MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr);
15993a40ed3dSBarry Smith   PetscFunctionReturn(0);
16004b0e389bSBarry Smith }
16014b0e389bSBarry Smith 
1602284134d9SBarry Smith #undef __FUNCT__
1603ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense"
1604ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A)
1605ba337c44SJed Brown {
1606ba337c44SJed Brown   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1607ba337c44SJed Brown   PetscInt       i,nz = A->rmap->n*A->cmap->n;
1608ba337c44SJed Brown   PetscScalar    *aa = a->v;
1609ba337c44SJed Brown 
1610ba337c44SJed Brown   PetscFunctionBegin;
1611ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]);
1612ba337c44SJed Brown   PetscFunctionReturn(0);
1613ba337c44SJed Brown }
1614ba337c44SJed Brown 
1615ba337c44SJed Brown #undef __FUNCT__
1616ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense"
1617ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A)
1618ba337c44SJed Brown {
1619ba337c44SJed Brown   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1620ba337c44SJed Brown   PetscInt       i,nz = A->rmap->n*A->cmap->n;
1621ba337c44SJed Brown   PetscScalar    *aa = a->v;
1622ba337c44SJed Brown 
1623ba337c44SJed Brown   PetscFunctionBegin;
1624ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]);
1625ba337c44SJed Brown   PetscFunctionReturn(0);
1626ba337c44SJed Brown }
1627ba337c44SJed Brown 
1628ba337c44SJed Brown #undef __FUNCT__
1629ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense"
1630ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A)
1631ba337c44SJed Brown {
1632ba337c44SJed Brown   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1633ba337c44SJed Brown   PetscInt       i,nz = A->rmap->n*A->cmap->n;
1634ba337c44SJed Brown   PetscScalar    *aa = a->v;
1635ba337c44SJed Brown 
1636ba337c44SJed Brown   PetscFunctionBegin;
1637ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]);
1638ba337c44SJed Brown   PetscFunctionReturn(0);
1639ba337c44SJed Brown }
1640284134d9SBarry Smith 
1641a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/
1642a9fe9ddaSSatish Balay #undef __FUNCT__
1643a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense"
1644a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1645a9fe9ddaSSatish Balay {
1646a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1647a9fe9ddaSSatish Balay 
1648a9fe9ddaSSatish Balay   PetscFunctionBegin;
1649a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX){
1650a9fe9ddaSSatish Balay     ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
1651a9fe9ddaSSatish Balay   }
1652a9fe9ddaSSatish Balay   ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
1653a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1654a9fe9ddaSSatish Balay }
1655a9fe9ddaSSatish Balay 
1656a9fe9ddaSSatish Balay #undef __FUNCT__
1657a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense"
1658a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1659a9fe9ddaSSatish Balay {
1660ee16a9a1SHong Zhang   PetscErrorCode ierr;
1661d0f46423SBarry Smith   PetscInt       m=A->rmap->n,n=B->cmap->n;
1662ee16a9a1SHong Zhang   Mat            Cmat;
1663a9fe9ddaSSatish Balay 
1664ee16a9a1SHong Zhang   PetscFunctionBegin;
1665e32f2f54SBarry 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);
1666ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1667ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1668ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
1669ee16a9a1SHong Zhang   ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr);
1670ee16a9a1SHong Zhang   Cmat->assembled    = PETSC_TRUE;
16718cdbd757SHong Zhang   Cmat->ops->matmult = MatMatMult_SeqDense_SeqDense;
1672ee16a9a1SHong Zhang   *C = Cmat;
1673ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1674ee16a9a1SHong Zhang }
1675a9fe9ddaSSatish Balay 
167698a3b096SSatish Balay #undef __FUNCT__
1677a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense"
1678a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1679a9fe9ddaSSatish Balay {
1680a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1681a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1682a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
16830805154bSBarry Smith   PetscBLASInt   m,n,k;
1684a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1685a9fe9ddaSSatish Balay 
1686a9fe9ddaSSatish Balay   PetscFunctionBegin;
1687d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
1688d0f46423SBarry Smith   n = PetscBLASIntCast(B->cmap->n);
1689d0f46423SBarry Smith   k = PetscBLASIntCast(A->cmap->n);
1690a9fe9ddaSSatish Balay   BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda);
1691a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1692a9fe9ddaSSatish Balay }
1693a9fe9ddaSSatish Balay 
1694a9fe9ddaSSatish Balay #undef __FUNCT__
169575648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqDense_SeqDense"
169675648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1697a9fe9ddaSSatish Balay {
1698a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1699a9fe9ddaSSatish Balay 
1700a9fe9ddaSSatish Balay   PetscFunctionBegin;
1701a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX){
170275648e8dSHong Zhang     ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
1703a9fe9ddaSSatish Balay   }
170475648e8dSHong Zhang   ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
1705a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1706a9fe9ddaSSatish Balay }
1707a9fe9ddaSSatish Balay 
1708a9fe9ddaSSatish Balay #undef __FUNCT__
170975648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqDense_SeqDense"
171075648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1711a9fe9ddaSSatish Balay {
1712ee16a9a1SHong Zhang   PetscErrorCode ierr;
1713d0f46423SBarry Smith   PetscInt       m=A->cmap->n,n=B->cmap->n;
1714ee16a9a1SHong Zhang   Mat            Cmat;
1715a9fe9ddaSSatish Balay 
1716ee16a9a1SHong Zhang   PetscFunctionBegin;
1717e32f2f54SBarry 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);
1718ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1719ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1720ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
1721ee16a9a1SHong Zhang   ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr);
1722ee16a9a1SHong Zhang   Cmat->assembled = PETSC_TRUE;
1723ee16a9a1SHong Zhang   *C = Cmat;
1724ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1725ee16a9a1SHong Zhang }
1726a9fe9ddaSSatish Balay 
1727a9fe9ddaSSatish Balay #undef __FUNCT__
172875648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqDense_SeqDense"
172975648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1730a9fe9ddaSSatish Balay {
1731a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1732a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1733a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
17340805154bSBarry Smith   PetscBLASInt   m,n,k;
1735a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1736a9fe9ddaSSatish Balay 
1737a9fe9ddaSSatish Balay   PetscFunctionBegin;
1738d0f46423SBarry Smith   m = PetscBLASIntCast(A->cmap->n);
1739d0f46423SBarry Smith   n = PetscBLASIntCast(B->cmap->n);
1740d0f46423SBarry Smith   k = PetscBLASIntCast(A->rmap->n);
17412fbe02b9SBarry Smith   /*
17422fbe02b9SBarry Smith      Note the m and n arguments below are the number rows and columns of A', not A!
17432fbe02b9SBarry Smith   */
1744a9fe9ddaSSatish Balay   BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda);
1745a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1746a9fe9ddaSSatish Balay }
1747985db425SBarry Smith 
1748985db425SBarry Smith #undef __FUNCT__
1749985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense"
1750985db425SBarry Smith PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[])
1751985db425SBarry Smith {
1752985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1753985db425SBarry Smith   PetscErrorCode ierr;
1754d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1755985db425SBarry Smith   PetscScalar    *x;
1756985db425SBarry Smith   MatScalar      *aa = a->v;
1757985db425SBarry Smith 
1758985db425SBarry Smith   PetscFunctionBegin;
1759e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1760985db425SBarry Smith 
1761985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1762985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1763985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1764e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1765985db425SBarry Smith   for (i=0; i<m; i++) {
1766985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1767985db425SBarry Smith     for (j=1; j<n; j++){
1768985db425SBarry Smith       if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1769985db425SBarry Smith     }
1770985db425SBarry Smith   }
1771985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1772985db425SBarry Smith   PetscFunctionReturn(0);
1773985db425SBarry Smith }
1774985db425SBarry Smith 
1775985db425SBarry Smith #undef __FUNCT__
1776985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense"
1777985db425SBarry Smith PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[])
1778985db425SBarry Smith {
1779985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1780985db425SBarry Smith   PetscErrorCode ierr;
1781d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1782985db425SBarry Smith   PetscScalar    *x;
1783985db425SBarry Smith   PetscReal      atmp;
1784985db425SBarry Smith   MatScalar      *aa = a->v;
1785985db425SBarry Smith 
1786985db425SBarry Smith   PetscFunctionBegin;
1787e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1788985db425SBarry Smith 
1789985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1790985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1791985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1792e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1793985db425SBarry Smith   for (i=0; i<m; i++) {
17949189402eSHong Zhang     x[i] = PetscAbsScalar(aa[i]);
1795985db425SBarry Smith     for (j=1; j<n; j++){
1796985db425SBarry Smith       atmp = PetscAbsScalar(aa[i+m*j]);
1797985db425SBarry Smith       if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;}
1798985db425SBarry Smith     }
1799985db425SBarry Smith   }
1800985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1801985db425SBarry Smith   PetscFunctionReturn(0);
1802985db425SBarry Smith }
1803985db425SBarry Smith 
1804985db425SBarry Smith #undef __FUNCT__
1805985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense"
1806985db425SBarry Smith PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[])
1807985db425SBarry Smith {
1808985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1809985db425SBarry Smith   PetscErrorCode ierr;
1810d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1811985db425SBarry Smith   PetscScalar    *x;
1812985db425SBarry Smith   MatScalar      *aa = a->v;
1813985db425SBarry Smith 
1814985db425SBarry Smith   PetscFunctionBegin;
1815e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1816985db425SBarry Smith 
1817985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1818985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1819985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1820e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1821985db425SBarry Smith   for (i=0; i<m; i++) {
1822985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1823985db425SBarry Smith     for (j=1; j<n; j++){
1824985db425SBarry Smith       if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1825985db425SBarry Smith     }
1826985db425SBarry Smith   }
1827985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1828985db425SBarry Smith   PetscFunctionReturn(0);
1829985db425SBarry Smith }
1830985db425SBarry Smith 
18318d0534beSBarry Smith #undef __FUNCT__
18328d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense"
18338d0534beSBarry Smith PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col)
18348d0534beSBarry Smith {
18358d0534beSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
18368d0534beSBarry Smith   PetscErrorCode ierr;
18378d0534beSBarry Smith   PetscScalar    *x;
18388d0534beSBarry Smith 
18398d0534beSBarry Smith   PetscFunctionBegin;
1840e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
18418d0534beSBarry Smith 
18428d0534beSBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1843d0f46423SBarry Smith   ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
18448d0534beSBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
18458d0534beSBarry Smith   PetscFunctionReturn(0);
18468d0534beSBarry Smith }
18478d0534beSBarry Smith 
18480716a85fSBarry Smith 
18490716a85fSBarry Smith #undef __FUNCT__
18500716a85fSBarry Smith #define __FUNCT__ "MatGetColumnNorms_SeqDense"
18510716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms)
18520716a85fSBarry Smith {
18530716a85fSBarry Smith   PetscErrorCode ierr;
18540716a85fSBarry Smith   PetscInt       i,j,m,n;
18550716a85fSBarry Smith   PetscScalar    *a;
18560716a85fSBarry Smith 
18570716a85fSBarry Smith   PetscFunctionBegin;
18580716a85fSBarry Smith   ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr);
18590716a85fSBarry Smith   ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr);
18600716a85fSBarry Smith   ierr = MatGetArray(A,&a);CHKERRQ(ierr);
18610716a85fSBarry Smith   if (type == NORM_2) {
18620716a85fSBarry Smith     for (i=0; i<n; i++ ){
18630716a85fSBarry Smith       for (j=0; j<m; j++) {
18640716a85fSBarry Smith 	norms[i] += PetscAbsScalar(a[j]*a[j]);
18650716a85fSBarry Smith       }
18660716a85fSBarry Smith       a += m;
18670716a85fSBarry Smith     }
18680716a85fSBarry Smith   } else if (type == NORM_1) {
18690716a85fSBarry Smith     for (i=0; i<n; i++ ){
18700716a85fSBarry Smith       for (j=0; j<m; j++) {
18710716a85fSBarry Smith 	norms[i] += PetscAbsScalar(a[j]);
18720716a85fSBarry Smith       }
18730716a85fSBarry Smith       a += m;
18740716a85fSBarry Smith     }
18750716a85fSBarry Smith   } else if (type == NORM_INFINITY) {
18760716a85fSBarry Smith     for (i=0; i<n; i++ ){
18770716a85fSBarry Smith       for (j=0; j<m; j++) {
18780716a85fSBarry Smith 	norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]);
18790716a85fSBarry Smith       }
18800716a85fSBarry Smith       a += m;
18810716a85fSBarry Smith     }
18820716a85fSBarry Smith   } else SETERRQ(((PetscObject)A)->comm,PETSC_ERR_ARG_WRONG,"Unknown NormType");
18830716a85fSBarry Smith   if (type == NORM_2) {
18848f1a2a5eSBarry Smith     for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]);
18850716a85fSBarry Smith   }
18860716a85fSBarry Smith   PetscFunctionReturn(0);
18870716a85fSBarry Smith }
18880716a85fSBarry Smith 
1889289bc588SBarry Smith /* -------------------------------------------------------------------*/
1890a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = {MatSetValues_SeqDense,
1891905e6a2fSBarry Smith        MatGetRow_SeqDense,
1892905e6a2fSBarry Smith        MatRestoreRow_SeqDense,
1893905e6a2fSBarry Smith        MatMult_SeqDense,
189497304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense,
18957c922b88SBarry Smith        MatMultTranspose_SeqDense,
18967c922b88SBarry Smith        MatMultTransposeAdd_SeqDense,
1897db4efbfdSBarry Smith        0,
1898db4efbfdSBarry Smith        0,
1899db4efbfdSBarry Smith        0,
1900db4efbfdSBarry Smith /*10*/ 0,
1901905e6a2fSBarry Smith        MatLUFactor_SeqDense,
1902905e6a2fSBarry Smith        MatCholeskyFactor_SeqDense,
190341f059aeSBarry Smith        MatSOR_SeqDense,
1904ec8511deSBarry Smith        MatTranspose_SeqDense,
190597304618SKris Buschelman /*15*/ MatGetInfo_SeqDense,
1906905e6a2fSBarry Smith        MatEqual_SeqDense,
1907905e6a2fSBarry Smith        MatGetDiagonal_SeqDense,
1908905e6a2fSBarry Smith        MatDiagonalScale_SeqDense,
1909905e6a2fSBarry Smith        MatNorm_SeqDense,
1910c0aa2d19SHong Zhang /*20*/ MatAssemblyBegin_SeqDense,
1911c0aa2d19SHong Zhang        MatAssemblyEnd_SeqDense,
1912905e6a2fSBarry Smith        MatSetOption_SeqDense,
1913905e6a2fSBarry Smith        MatZeroEntries_SeqDense,
1914d519adbfSMatthew Knepley /*24*/ MatZeroRows_SeqDense,
1915db4efbfdSBarry Smith        0,
1916db4efbfdSBarry Smith        0,
1917db4efbfdSBarry Smith        0,
1918db4efbfdSBarry Smith        0,
19194994cf47SJed Brown /*29*/ MatSetUp_SeqDense,
1920273d9f13SBarry Smith        0,
1921905e6a2fSBarry Smith        0,
1922905e6a2fSBarry Smith        MatGetArray_SeqDense,
1923905e6a2fSBarry Smith        MatRestoreArray_SeqDense,
1924d519adbfSMatthew Knepley /*34*/ MatDuplicate_SeqDense,
1925a5ae1ecdSBarry Smith        0,
1926a5ae1ecdSBarry Smith        0,
1927a5ae1ecdSBarry Smith        0,
1928a5ae1ecdSBarry Smith        0,
1929d519adbfSMatthew Knepley /*39*/ MatAXPY_SeqDense,
1930a5ae1ecdSBarry Smith        MatGetSubMatrices_SeqDense,
1931a5ae1ecdSBarry Smith        0,
19324b0e389bSBarry Smith        MatGetValues_SeqDense,
1933a5ae1ecdSBarry Smith        MatCopy_SeqDense,
1934d519adbfSMatthew Knepley /*44*/ MatGetRowMax_SeqDense,
1935a5ae1ecdSBarry Smith        MatScale_SeqDense,
1936a5ae1ecdSBarry Smith        0,
1937a5ae1ecdSBarry Smith        0,
1938a5ae1ecdSBarry Smith        0,
1939f73d5cc4SBarry Smith /*49*/ 0,
1940a5ae1ecdSBarry Smith        0,
1941a5ae1ecdSBarry Smith        0,
1942a5ae1ecdSBarry Smith        0,
1943a5ae1ecdSBarry Smith        0,
1944d519adbfSMatthew Knepley /*54*/ 0,
1945a5ae1ecdSBarry Smith        0,
1946a5ae1ecdSBarry Smith        0,
1947a5ae1ecdSBarry Smith        0,
1948a5ae1ecdSBarry Smith        0,
1949d519adbfSMatthew Knepley /*59*/ 0,
1950e03a110bSBarry Smith        MatDestroy_SeqDense,
1951e03a110bSBarry Smith        MatView_SeqDense,
1952357abbc8SBarry Smith        0,
195397304618SKris Buschelman        0,
1954d519adbfSMatthew Knepley /*64*/ 0,
195597304618SKris Buschelman        0,
195697304618SKris Buschelman        0,
195797304618SKris Buschelman        0,
195897304618SKris Buschelman        0,
1959d519adbfSMatthew Knepley /*69*/ MatGetRowMaxAbs_SeqDense,
196097304618SKris Buschelman        0,
196197304618SKris Buschelman        0,
196297304618SKris Buschelman        0,
196397304618SKris Buschelman        0,
1964d519adbfSMatthew Knepley /*74*/ 0,
196597304618SKris Buschelman        0,
196697304618SKris Buschelman        0,
196797304618SKris Buschelman        0,
196897304618SKris Buschelman        0,
1969d519adbfSMatthew Knepley /*79*/ 0,
197097304618SKris Buschelman        0,
197197304618SKris Buschelman        0,
197297304618SKris Buschelman        0,
19735bba2384SShri Abhyankar /*83*/ MatLoad_SeqDense,
1974865e5f61SKris Buschelman        0,
19751cbb95d3SBarry Smith        MatIsHermitian_SeqDense,
1976865e5f61SKris Buschelman        0,
1977865e5f61SKris Buschelman        0,
1978865e5f61SKris Buschelman        0,
1979d519adbfSMatthew Knepley /*89*/ MatMatMult_SeqDense_SeqDense,
1980a9fe9ddaSSatish Balay        MatMatMultSymbolic_SeqDense_SeqDense,
1981a9fe9ddaSSatish Balay        MatMatMultNumeric_SeqDense_SeqDense,
1982865e5f61SKris Buschelman        0,
1983865e5f61SKris Buschelman        0,
1984d519adbfSMatthew Knepley /*94*/ 0,
19855df89d91SHong Zhang        0,
19865df89d91SHong Zhang        0,
19875df89d91SHong Zhang        0,
1988284134d9SBarry Smith        0,
1989d519adbfSMatthew Knepley /*99*/ 0,
1990284134d9SBarry Smith        0,
1991284134d9SBarry Smith        0,
1992ba337c44SJed Brown        MatConjugate_SeqDense,
1993f73d5cc4SBarry Smith        0,
1994ba337c44SJed Brown /*104*/0,
1995ba337c44SJed Brown        MatRealPart_SeqDense,
1996ba337c44SJed Brown        MatImaginaryPart_SeqDense,
1997985db425SBarry Smith        0,
1998985db425SBarry Smith        0,
199985e2c93fSHong Zhang /*109*/MatMatSolve_SeqDense,
2000985db425SBarry Smith        0,
20018d0534beSBarry Smith        MatGetRowMin_SeqDense,
2002aabbc4fbSShri Abhyankar        MatGetColumnVector_SeqDense,
2003aabbc4fbSShri Abhyankar        0,
2004aabbc4fbSShri Abhyankar /*114*/0,
2005aabbc4fbSShri Abhyankar        0,
2006aabbc4fbSShri Abhyankar        0,
2007aabbc4fbSShri Abhyankar        0,
2008aabbc4fbSShri Abhyankar        0,
2009aabbc4fbSShri Abhyankar /*119*/0,
2010aabbc4fbSShri Abhyankar        0,
2011aabbc4fbSShri Abhyankar        0,
20120716a85fSBarry Smith        0,
20130716a85fSBarry Smith        0,
20140716a85fSBarry Smith /*124*/0,
20155df89d91SHong Zhang        MatGetColumnNorms_SeqDense,
20165df89d91SHong Zhang        0,
20175df89d91SHong Zhang        0,
20185df89d91SHong Zhang        0,
20195df89d91SHong Zhang /*129*/0,
202075648e8dSHong Zhang        MatTransposeMatMult_SeqDense_SeqDense,
202175648e8dSHong Zhang        MatTransposeMatMultSymbolic_SeqDense_SeqDense,
202275648e8dSHong Zhang        MatTransposeMatMultNumeric_SeqDense_SeqDense,
2023985db425SBarry Smith };
202490ace30eSBarry Smith 
20254a2ae208SSatish Balay #undef __FUNCT__
20264a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense"
20274b828684SBarry Smith /*@C
2028fafbff53SBarry Smith    MatCreateSeqDense - Creates a sequential dense matrix that
2029d65003e9SLois Curfman McInnes    is stored in column major order (the usual Fortran 77 manner). Many
2030d65003e9SLois Curfman McInnes    of the matrix operations use the BLAS and LAPACK routines.
2031289bc588SBarry Smith 
2032db81eaa0SLois Curfman McInnes    Collective on MPI_Comm
2033db81eaa0SLois Curfman McInnes 
203420563c6bSBarry Smith    Input Parameters:
2035db81eaa0SLois Curfman McInnes +  comm - MPI communicator, set to PETSC_COMM_SELF
20360c775827SLois Curfman McInnes .  m - number of rows
203718f449edSLois Curfman McInnes .  n - number of columns
2038c0235b3cSMatthew Knepley -  data - optional location of matrix data in column major order.  Set data=PETSC_NULL for PETSc
2039dfc5480cSLois Curfman McInnes    to control all matrix memory allocation.
204020563c6bSBarry Smith 
204120563c6bSBarry Smith    Output Parameter:
204244cd7ae7SLois Curfman McInnes .  A - the matrix
204320563c6bSBarry Smith 
2044b259b22eSLois Curfman McInnes    Notes:
204518f449edSLois Curfman McInnes    The data input variable is intended primarily for Fortran programmers
204618f449edSLois Curfman McInnes    who wish to allocate their own matrix memory space.  Most users should
2047b4fd4287SBarry Smith    set data=PETSC_NULL.
204818f449edSLois Curfman McInnes 
2049027ccd11SLois Curfman McInnes    Level: intermediate
2050027ccd11SLois Curfman McInnes 
2051dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS
2052d65003e9SLois Curfman McInnes 
205369b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues()
205420563c6bSBarry Smith @*/
20557087cfbeSBarry Smith PetscErrorCode  MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A)
2056289bc588SBarry Smith {
2057dfbe8321SBarry Smith   PetscErrorCode ierr;
20583b2fbd54SBarry Smith 
20593a40ed3dSBarry Smith   PetscFunctionBegin;
2060f69a0ea3SMatthew Knepley   ierr = MatCreate(comm,A);CHKERRQ(ierr);
2061f69a0ea3SMatthew Knepley   ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr);
2062273d9f13SBarry Smith   ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr);
2063273d9f13SBarry Smith   ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr);
2064273d9f13SBarry Smith   PetscFunctionReturn(0);
2065273d9f13SBarry Smith }
2066273d9f13SBarry Smith 
20674a2ae208SSatish Balay #undef __FUNCT__
2068afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation"
2069273d9f13SBarry Smith /*@C
2070273d9f13SBarry Smith    MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements
2071273d9f13SBarry Smith 
2072273d9f13SBarry Smith    Collective on MPI_Comm
2073273d9f13SBarry Smith 
2074273d9f13SBarry Smith    Input Parameters:
2075273d9f13SBarry Smith +  A - the matrix
2076273d9f13SBarry Smith -  data - the array (or PETSC_NULL)
2077273d9f13SBarry Smith 
2078273d9f13SBarry Smith    Notes:
2079273d9f13SBarry Smith    The data input variable is intended primarily for Fortran programmers
2080273d9f13SBarry Smith    who wish to allocate their own matrix memory space.  Most users should
2081284134d9SBarry Smith    need not call this routine.
2082273d9f13SBarry Smith 
2083273d9f13SBarry Smith    Level: intermediate
2084273d9f13SBarry Smith 
2085273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS
2086273d9f13SBarry Smith 
208769b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA()
2088867c911aSBarry Smith 
2089273d9f13SBarry Smith @*/
20907087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation(Mat B,PetscScalar data[])
2091273d9f13SBarry Smith {
20924ac538c5SBarry Smith   PetscErrorCode ierr;
2093a23d5eceSKris Buschelman 
2094a23d5eceSKris Buschelman   PetscFunctionBegin;
20954ac538c5SBarry Smith   ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr);
2096a23d5eceSKris Buschelman   PetscFunctionReturn(0);
2097a23d5eceSKris Buschelman }
2098a23d5eceSKris Buschelman 
2099a23d5eceSKris Buschelman EXTERN_C_BEGIN
2100a23d5eceSKris Buschelman #undef __FUNCT__
2101afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense"
21027087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data)
2103a23d5eceSKris Buschelman {
2104273d9f13SBarry Smith   Mat_SeqDense   *b;
2105dfbe8321SBarry Smith   PetscErrorCode ierr;
2106273d9f13SBarry Smith 
2107273d9f13SBarry Smith   PetscFunctionBegin;
2108273d9f13SBarry Smith   B->preallocated = PETSC_TRUE;
2109a868139aSShri Abhyankar 
211034ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr);
211134ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr);
211234ef9618SShri Abhyankar 
2113273d9f13SBarry Smith   b       = (Mat_SeqDense*)B->data;
211486d161a7SShri Abhyankar   b->Mmax = B->rmap->n;
211586d161a7SShri Abhyankar   b->Nmax = B->cmap->n;
211686d161a7SShri Abhyankar   if(b->lda <= 0 || b->changelda) b->lda = B->rmap->n;
211786d161a7SShri Abhyankar 
21189e8f95c4SLisandro Dalcin   if (!data) { /* petsc-allocated storage */
21199e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
21205afd5e0cSBarry Smith     ierr = PetscMalloc(b->lda*b->Nmax*sizeof(PetscScalar),&b->v);CHKERRQ(ierr);
2121284134d9SBarry Smith     ierr = PetscMemzero(b->v,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
2122284134d9SBarry Smith     ierr = PetscLogObjectMemory(B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
21239e8f95c4SLisandro Dalcin     b->user_alloc = PETSC_FALSE;
2124273d9f13SBarry Smith   } else { /* user-allocated storage */
21259e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2126273d9f13SBarry Smith     b->v          = data;
2127273d9f13SBarry Smith     b->user_alloc = PETSC_TRUE;
2128273d9f13SBarry Smith   }
21290450473dSBarry Smith   B->assembled = PETSC_TRUE;
2130273d9f13SBarry Smith   PetscFunctionReturn(0);
2131273d9f13SBarry Smith }
2132a23d5eceSKris Buschelman EXTERN_C_END
2133273d9f13SBarry Smith 
21341b807ce4Svictorle #undef __FUNCT__
21351b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA"
21361b807ce4Svictorle /*@C
21371b807ce4Svictorle   MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array
21381b807ce4Svictorle 
21391b807ce4Svictorle   Input parameter:
21401b807ce4Svictorle + A - the matrix
21411b807ce4Svictorle - lda - the leading dimension
21421b807ce4Svictorle 
21431b807ce4Svictorle   Notes:
2144867c911aSBarry Smith   This routine is to be used in conjunction with MatSeqDenseSetPreallocation();
21451b807ce4Svictorle   it asserts that the preallocation has a leading dimension (the LDA parameter
21461b807ce4Svictorle   of Blas and Lapack fame) larger than M, the first dimension of the matrix.
21471b807ce4Svictorle 
21481b807ce4Svictorle   Level: intermediate
21491b807ce4Svictorle 
21501b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS
21511b807ce4Svictorle 
2152284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize()
2153867c911aSBarry Smith 
21541b807ce4Svictorle @*/
21557087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetLDA(Mat B,PetscInt lda)
21561b807ce4Svictorle {
21571b807ce4Svictorle   Mat_SeqDense *b = (Mat_SeqDense*)B->data;
215821a2c019SBarry Smith 
21591b807ce4Svictorle   PetscFunctionBegin;
2160e32f2f54SBarry 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);
21611b807ce4Svictorle   b->lda       = lda;
216221a2c019SBarry Smith   b->changelda = PETSC_FALSE;
216321a2c019SBarry Smith   b->Mmax      = PetscMax(b->Mmax,lda);
21641b807ce4Svictorle   PetscFunctionReturn(0);
21651b807ce4Svictorle }
21661b807ce4Svictorle 
21670bad9183SKris Buschelman /*MC
2168fafad747SKris Buschelman    MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices.
21690bad9183SKris Buschelman 
21700bad9183SKris Buschelman    Options Database Keys:
21710bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions()
21720bad9183SKris Buschelman 
21730bad9183SKris Buschelman   Level: beginner
21740bad9183SKris Buschelman 
217589665df3SBarry Smith .seealso: MatCreateSeqDense()
217689665df3SBarry Smith 
21770bad9183SKris Buschelman M*/
21780bad9183SKris Buschelman 
2179273d9f13SBarry Smith EXTERN_C_BEGIN
21804a2ae208SSatish Balay #undef __FUNCT__
21814a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense"
21827087cfbeSBarry Smith PetscErrorCode  MatCreate_SeqDense(Mat B)
2183273d9f13SBarry Smith {
2184273d9f13SBarry Smith   Mat_SeqDense   *b;
2185dfbe8321SBarry Smith   PetscErrorCode ierr;
21867c334f02SBarry Smith   PetscMPIInt    size;
2187273d9f13SBarry Smith 
2188273d9f13SBarry Smith   PetscFunctionBegin;
21897adad957SLisandro Dalcin   ierr = MPI_Comm_size(((PetscObject)B)->comm,&size);CHKERRQ(ierr);
2190e32f2f54SBarry Smith   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1");
219155659b69SBarry Smith 
219238f2d2fdSLisandro Dalcin   ierr            = PetscNewLog(B,Mat_SeqDense,&b);CHKERRQ(ierr);
2193549d3d68SSatish Balay   ierr            = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr);
219444cd7ae7SLois Curfman McInnes   B->data         = (void*)b;
219518f449edSLois Curfman McInnes 
219644cd7ae7SLois Curfman McInnes   b->pivots       = 0;
2197273d9f13SBarry Smith   b->roworiented  = PETSC_TRUE;
2198273d9f13SBarry Smith   b->v            = 0;
219921a2c019SBarry Smith   b->changelda    = PETSC_FALSE;
22004e220ebcSLois Curfman McInnes 
2201b24902e0SBarry Smith 
22026a63e612SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatConvert_seqdense_seqaij_C","MatConvert_SeqDense_SeqAIJ",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr);
2203ec1065edSBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatGetFactor_petsc_C",
2204b24902e0SBarry Smith                                      "MatGetFactor_seqdense_petsc",
2205b24902e0SBarry Smith                                       MatGetFactor_seqdense_petsc);CHKERRQ(ierr);
2206a23d5eceSKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatSeqDenseSetPreallocation_C",
2207a23d5eceSKris Buschelman                                     "MatSeqDenseSetPreallocation_SeqDense",
2208a23d5eceSKris Buschelman                                      MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr);
22092356f84bSDmitry Karpeev 
22104ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMult_seqaij_seqdense_C",
22114ae313f4SHong Zhang                                      "MatMatMult_SeqAIJ_SeqDense",
22124ae313f4SHong Zhang                                       MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
22132356f84bSDmitry Karpeev 
2214c0c8ee5eSDmitry Karpeev 
22154ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",
22164ae313f4SHong Zhang                                      "MatMatMultSymbolic_SeqAIJ_SeqDense",
22174ae313f4SHong Zhang                                       MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
22184ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",
22194ae313f4SHong Zhang                                      "MatMatMultNumeric_SeqAIJ_SeqDense",
22204ae313f4SHong Zhang                                       MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
222117667f90SBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr);
22223a40ed3dSBarry Smith   PetscFunctionReturn(0);
2223289bc588SBarry Smith }
2224273d9f13SBarry Smith EXTERN_C_END
2225