xref: /petsc/src/mat/impls/dense/seq/dense.c (revision 5d0c19d75c660d4fec594a5399ec8d8ba29c54a8)
1be1d678aSKris Buschelman #define PETSCMAT_DLL
2be1d678aSKris Buschelman 
367e560aaSBarry Smith /*
467e560aaSBarry Smith      Defines the basic matrix operations for sequential dense.
567e560aaSBarry Smith */
6289bc588SBarry Smith 
770f55243SBarry Smith #include "src/mat/impls/dense/seq/dense.h"
8b4c862e0SSatish Balay #include "petscblaslapack.h"
9289bc588SBarry Smith 
104a2ae208SSatish Balay #undef __FUNCT__
114a2ae208SSatish Balay #define __FUNCT__ "MatAXPY_SeqDense"
12f4df32b1SMatthew Knepley PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str)
131987afe7SBarry Smith {
141987afe7SBarry Smith   Mat_SeqDense   *x = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data;
15f4df32b1SMatthew Knepley   PetscScalar    oalpha = alpha;
1613f74950SBarry Smith   PetscInt       j;
170805154bSBarry Smith   PetscBLASInt   N,m,ldax,lday,one = 1;
18efee365bSSatish Balay   PetscErrorCode ierr;
193a40ed3dSBarry Smith 
203a40ed3dSBarry Smith   PetscFunctionBegin;
21d0f46423SBarry Smith   N    = PetscBLASIntCast(X->rmap->n*X->cmap->n);
22d0f46423SBarry Smith   m    = PetscBLASIntCast(X->rmap->n);
230805154bSBarry Smith   ldax = PetscBLASIntCast(x->lda);
240805154bSBarry Smith   lday = PetscBLASIntCast(y->lda);
25a5ce6ee0Svictorle   if (ldax>m || lday>m) {
26d0f46423SBarry Smith     for (j=0; j<X->cmap->n; j++) {
27f4df32b1SMatthew Knepley       BLASaxpy_(&m,&oalpha,x->v+j*ldax,&one,y->v+j*lday,&one);
28a5ce6ee0Svictorle     }
29a5ce6ee0Svictorle   } else {
30f4df32b1SMatthew Knepley     BLASaxpy_(&N,&oalpha,x->v,&one,y->v,&one);
31a5ce6ee0Svictorle   }
32efee365bSSatish Balay   ierr = PetscLogFlops(2*N-1);CHKERRQ(ierr);
333a40ed3dSBarry Smith   PetscFunctionReturn(0);
341987afe7SBarry Smith }
351987afe7SBarry Smith 
364a2ae208SSatish Balay #undef __FUNCT__
374a2ae208SSatish Balay #define __FUNCT__ "MatGetInfo_SeqDense"
38dfbe8321SBarry Smith PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info)
39289bc588SBarry Smith {
40d0f46423SBarry Smith   PetscInt     N = A->rmap->n*A->cmap->n;
413a40ed3dSBarry Smith 
423a40ed3dSBarry Smith   PetscFunctionBegin;
43d0f46423SBarry Smith   info->rows_global       = (double)A->rmap->n;
44d0f46423SBarry Smith   info->columns_global    = (double)A->cmap->n;
45d0f46423SBarry Smith   info->rows_local        = (double)A->rmap->n;
46d0f46423SBarry Smith   info->columns_local     = (double)A->cmap->n;
474e220ebcSLois Curfman McInnes   info->block_size        = 1.0;
484e220ebcSLois Curfman McInnes   info->nz_allocated      = (double)N;
496de62eeeSBarry Smith   info->nz_used           = (double)N;
506de62eeeSBarry Smith   info->nz_unneeded       = (double)0;
514e220ebcSLois Curfman McInnes   info->assemblies        = (double)A->num_ass;
524e220ebcSLois Curfman McInnes   info->mallocs           = 0;
537adad957SLisandro Dalcin   info->memory            = ((PetscObject)A)->mem;
544e220ebcSLois Curfman McInnes   info->fill_ratio_given  = 0;
554e220ebcSLois Curfman McInnes   info->fill_ratio_needed = 0;
564e220ebcSLois Curfman McInnes   info->factor_mallocs    = 0;
573a40ed3dSBarry Smith   PetscFunctionReturn(0);
58289bc588SBarry Smith }
59289bc588SBarry Smith 
604a2ae208SSatish Balay #undef __FUNCT__
614a2ae208SSatish Balay #define __FUNCT__ "MatScale_SeqDense"
62f4df32b1SMatthew Knepley PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha)
6380cd9d93SLois Curfman McInnes {
64273d9f13SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
65f4df32b1SMatthew Knepley   PetscScalar    oalpha = alpha;
66efee365bSSatish Balay   PetscErrorCode ierr;
670805154bSBarry Smith   PetscBLASInt   one = 1,j,nz,lda = PetscBLASIntCast(a->lda);
6880cd9d93SLois Curfman McInnes 
693a40ed3dSBarry Smith   PetscFunctionBegin;
70d0f46423SBarry Smith   if (lda>A->rmap->n) {
71d0f46423SBarry Smith     nz = PetscBLASIntCast(A->rmap->n);
72d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
73f4df32b1SMatthew Knepley       BLASscal_(&nz,&oalpha,a->v+j*lda,&one);
74a5ce6ee0Svictorle     }
75a5ce6ee0Svictorle   } else {
76d0f46423SBarry Smith     nz = PetscBLASIntCast(A->rmap->n*A->cmap->n);
77f4df32b1SMatthew Knepley     BLASscal_(&nz,&oalpha,a->v,&one);
78a5ce6ee0Svictorle   }
79efee365bSSatish Balay   ierr = PetscLogFlops(nz);CHKERRQ(ierr);
803a40ed3dSBarry Smith   PetscFunctionReturn(0);
8180cd9d93SLois Curfman McInnes }
8280cd9d93SLois Curfman McInnes 
831cbb95d3SBarry Smith #undef __FUNCT__
841cbb95d3SBarry Smith #define __FUNCT__ "MatIsHermitian_SeqDense"
851cbb95d3SBarry Smith PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscTruth *fl)
861cbb95d3SBarry Smith {
871cbb95d3SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
88d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,N;
891cbb95d3SBarry Smith   PetscScalar    *v = a->v;
901cbb95d3SBarry Smith 
911cbb95d3SBarry Smith   PetscFunctionBegin;
921cbb95d3SBarry Smith   *fl = PETSC_FALSE;
93d0f46423SBarry Smith   if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0);
941cbb95d3SBarry Smith   N = a->lda;
951cbb95d3SBarry Smith 
961cbb95d3SBarry Smith   for (i=0; i<m; i++) {
971cbb95d3SBarry Smith     for (j=i+1; j<m; j++) {
981cbb95d3SBarry Smith       if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) PetscFunctionReturn(0);
991cbb95d3SBarry Smith     }
1001cbb95d3SBarry Smith   }
1011cbb95d3SBarry Smith   *fl = PETSC_TRUE;
1021cbb95d3SBarry Smith   PetscFunctionReturn(0);
1031cbb95d3SBarry Smith }
1041cbb95d3SBarry Smith 
105b24902e0SBarry Smith #undef __FUNCT__
106b24902e0SBarry Smith #define __FUNCT__ "MatDuplicateNoCreate_SeqDense"
107719d5645SBarry Smith PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat newi,Mat A,MatDuplicateOption cpvalues)
108b24902e0SBarry Smith {
109b24902e0SBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data,*l;
110b24902e0SBarry Smith   PetscErrorCode ierr;
111b24902e0SBarry Smith   PetscInt       lda = (PetscInt)mat->lda,j,m;
112b24902e0SBarry Smith 
113b24902e0SBarry Smith   PetscFunctionBegin;
114719d5645SBarry Smith   ierr = MatSeqDenseSetPreallocation(newi,PETSC_NULL);CHKERRQ(ierr);
115b24902e0SBarry Smith   if (cpvalues == MAT_COPY_VALUES) {
116b24902e0SBarry Smith     l = (Mat_SeqDense*)newi->data;
117d0f46423SBarry Smith     if (lda>A->rmap->n) {
118d0f46423SBarry Smith       m = A->rmap->n;
119d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
120b24902e0SBarry Smith 	ierr = PetscMemcpy(l->v+j*m,mat->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
121b24902e0SBarry Smith       }
122b24902e0SBarry Smith     } else {
123d0f46423SBarry Smith       ierr = PetscMemcpy(l->v,mat->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
124b24902e0SBarry Smith     }
125b24902e0SBarry Smith   }
126b24902e0SBarry Smith   newi->assembled = PETSC_TRUE;
127b24902e0SBarry Smith   PetscFunctionReturn(0);
128b24902e0SBarry Smith }
129b24902e0SBarry Smith 
1304a2ae208SSatish Balay #undef __FUNCT__
1314a2ae208SSatish Balay #define __FUNCT__ "MatDuplicate_SeqDense"
132dfbe8321SBarry Smith PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat)
13302cad45dSBarry Smith {
1346849ba73SBarry Smith   PetscErrorCode ierr;
13502cad45dSBarry Smith 
1363a40ed3dSBarry Smith   PetscFunctionBegin;
1375c9eb25fSBarry Smith   ierr = MatCreate(((PetscObject)A)->comm,newmat);CHKERRQ(ierr);
138d0f46423SBarry Smith   ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
1395c9eb25fSBarry Smith   ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
140719d5645SBarry Smith   ierr = MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues);CHKERRQ(ierr);
141b24902e0SBarry Smith   PetscFunctionReturn(0);
142b24902e0SBarry Smith }
143b24902e0SBarry Smith 
1446ee01492SSatish Balay 
145719d5645SBarry Smith extern PetscErrorCode MatLUFactor_SeqDense(Mat,IS,IS,MatFactorInfo*);
146719d5645SBarry Smith 
1474a2ae208SSatish Balay #undef __FUNCT__
1484a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorNumeric_SeqDense"
149719d5645SBarry Smith PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,MatFactorInfo *info_dummy)
150289bc588SBarry Smith {
151719d5645SBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data,*l = (Mat_SeqDense*)fact->data;
1524482741eSBarry Smith   MatFactorInfo  info;
153a093e273SMatthew Knepley   PetscInt       lda1 = mat->lda, lda2 = l->lda;
154a093e273SMatthew Knepley   PetscInt       m = A->rmap->n, n = A->cmap->n, j;
155a093e273SMatthew Knepley   PetscErrorCode ierr;
1563a40ed3dSBarry Smith 
1573a40ed3dSBarry Smith   PetscFunctionBegin;
15802cad45dSBarry Smith   /* copy the numerical values */
1591b807ce4Svictorle   if (lda1>m || lda2>m ) {
1601b807ce4Svictorle     for (j=0; j<n; j++) {
1611b807ce4Svictorle       ierr = PetscMemcpy(l->v+j*lda2,mat->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr);
1621b807ce4Svictorle     }
1631b807ce4Svictorle   } else {
164a093e273SMatthew Knepley     ierr = PetscMemcpy(l->v,mat->v,m*n*sizeof(PetscScalar));CHKERRQ(ierr);
1651b807ce4Svictorle   }
166719d5645SBarry Smith   ierr = MatLUFactor_SeqDense(fact,0,0,&info);CHKERRQ(ierr);
1673a40ed3dSBarry Smith   PetscFunctionReturn(0);
168289bc588SBarry Smith }
1696ee01492SSatish Balay 
1700b4b3355SBarry Smith #undef __FUNCT__
1714a2ae208SSatish Balay #define __FUNCT__ "MatSolve_SeqDense"
172dfbe8321SBarry Smith PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy)
173289bc588SBarry Smith {
174c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
1756849ba73SBarry Smith   PetscErrorCode ierr;
17687828ca2SBarry Smith   PetscScalar    *x,*y;
177d0f46423SBarry Smith   PetscBLASInt   one = 1,info,m = PetscBLASIntCast(A->rmap->n);
17867e560aaSBarry Smith 
1793a40ed3dSBarry Smith   PetscFunctionBegin;
1801ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
1811ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
182d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1835c9eb25fSBarry Smith   if (A->factor == MAT_FACTOR_LU) {
184ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
18580444007SBarry Smith     SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
186ae7cfcebSSatish Balay #else
18771044d3cSBarry Smith     LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info);
1884ce68768SBarry Smith     if (info) SETERRQ(PETSC_ERR_LIB,"GETRS - Bad solve");
189ae7cfcebSSatish Balay #endif
1905c9eb25fSBarry Smith   } else if (A->factor == MAT_FACTOR_CHOLESKY){
191ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
19280444007SBarry Smith     SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
193ae7cfcebSSatish Balay #else
19471044d3cSBarry Smith     LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info);
1954ce68768SBarry Smith     if (info) SETERRQ(PETSC_ERR_LIB,"POTRS Bad solve");
196ae7cfcebSSatish Balay #endif
197289bc588SBarry Smith   }
19829bbc08cSBarry Smith   else SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
1991ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
2001ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
201d0f46423SBarry Smith   ierr = PetscLogFlops(2*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
2023a40ed3dSBarry Smith   PetscFunctionReturn(0);
203289bc588SBarry Smith }
2046ee01492SSatish Balay 
2054a2ae208SSatish Balay #undef __FUNCT__
2064a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense"
207dfbe8321SBarry Smith PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy)
208da3a660dSBarry Smith {
209c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
210dfbe8321SBarry Smith   PetscErrorCode ierr;
21187828ca2SBarry Smith   PetscScalar    *x,*y;
212d0f46423SBarry Smith   PetscBLASInt   one = 1,info,m = PetscBLASIntCast(A->rmap->n);
21367e560aaSBarry Smith 
2143a40ed3dSBarry Smith   PetscFunctionBegin;
2151ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
2161ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
217d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
218752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
219da3a660dSBarry Smith   if (mat->pivots) {
220ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
22180444007SBarry Smith     SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
222ae7cfcebSSatish Balay #else
22371044d3cSBarry Smith     LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info);
2244ce68768SBarry Smith     if (info) SETERRQ(PETSC_ERR_LIB,"POTRS - Bad solve");
225ae7cfcebSSatish Balay #endif
2267a97a34bSBarry Smith   } else {
227ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
22880444007SBarry Smith     SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
229ae7cfcebSSatish Balay #else
23071044d3cSBarry Smith     LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info);
2314ce68768SBarry Smith     if (info) SETERRQ(PETSC_ERR_LIB,"POTRS - Bad solve");
232ae7cfcebSSatish Balay #endif
233da3a660dSBarry Smith   }
2341ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
2351ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
236d0f46423SBarry Smith   ierr = PetscLogFlops(2*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
2373a40ed3dSBarry Smith   PetscFunctionReturn(0);
238da3a660dSBarry Smith }
2396ee01492SSatish Balay 
2404a2ae208SSatish Balay #undef __FUNCT__
2414a2ae208SSatish Balay #define __FUNCT__ "MatSolveAdd_SeqDense"
242dfbe8321SBarry Smith PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
243da3a660dSBarry Smith {
244c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
245dfbe8321SBarry Smith   PetscErrorCode ierr;
24687828ca2SBarry Smith   PetscScalar    *x,*y,sone = 1.0;
247da3a660dSBarry Smith   Vec            tmp = 0;
248d0f46423SBarry Smith   PetscBLASInt   one = 1,info,m = PetscBLASIntCast(A->rmap->n);
24967e560aaSBarry Smith 
2503a40ed3dSBarry Smith   PetscFunctionBegin;
2511ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
2521ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
253d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
254da3a660dSBarry Smith   if (yy == zz) {
25578b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
25652e6d16bSBarry Smith     ierr = PetscLogObjectParent(A,tmp);CHKERRQ(ierr);
25778b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
258da3a660dSBarry Smith   }
259d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
260752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
261da3a660dSBarry Smith   if (mat->pivots) {
262ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
26380444007SBarry Smith     SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
264ae7cfcebSSatish Balay #else
26571044d3cSBarry Smith     LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info);
2662ffef20aSBarry Smith     if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve");
267ae7cfcebSSatish Balay #endif
268a8c6a408SBarry Smith   } else {
269ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
27080444007SBarry Smith     SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
271ae7cfcebSSatish Balay #else
27271044d3cSBarry Smith     LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info);
2732ffef20aSBarry Smith     if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve");
274ae7cfcebSSatish Balay #endif
275da3a660dSBarry Smith   }
2762dcb1b2aSMatthew Knepley   if (tmp) {ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); ierr = VecDestroy(tmp);CHKERRQ(ierr);}
2772dcb1b2aSMatthew Knepley   else     {ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);}
2781ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
2791ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
280d0f46423SBarry Smith   ierr = PetscLogFlops(2*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
2813a40ed3dSBarry Smith   PetscFunctionReturn(0);
282da3a660dSBarry Smith }
28367e560aaSBarry Smith 
2844a2ae208SSatish Balay #undef __FUNCT__
2854a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense"
286dfbe8321SBarry Smith PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
287da3a660dSBarry Smith {
288c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
2896849ba73SBarry Smith   PetscErrorCode ierr;
29087828ca2SBarry Smith   PetscScalar    *x,*y,sone = 1.0;
291da3a660dSBarry Smith   Vec            tmp;
292d0f46423SBarry Smith   PetscBLASInt   one = 1,info,m = PetscBLASIntCast(A->rmap->n);
29367e560aaSBarry Smith 
2943a40ed3dSBarry Smith   PetscFunctionBegin;
295d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
2961ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
2971ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
298da3a660dSBarry Smith   if (yy == zz) {
29978b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
30052e6d16bSBarry Smith     ierr = PetscLogObjectParent(A,tmp);CHKERRQ(ierr);
30178b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
302da3a660dSBarry Smith   }
303d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
304752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
305da3a660dSBarry Smith   if (mat->pivots) {
306ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
30780444007SBarry Smith     SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
308ae7cfcebSSatish Balay #else
30971044d3cSBarry Smith     LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info);
3102ffef20aSBarry Smith     if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve");
311ae7cfcebSSatish Balay #endif
3123a40ed3dSBarry Smith   } else {
313ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
31480444007SBarry Smith     SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
315ae7cfcebSSatish Balay #else
31671044d3cSBarry Smith     LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info);
3172ffef20aSBarry Smith     if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve");
318ae7cfcebSSatish Balay #endif
319da3a660dSBarry Smith   }
32090f02eecSBarry Smith   if (tmp) {
3212dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr);
32290f02eecSBarry Smith     ierr = VecDestroy(tmp);CHKERRQ(ierr);
3233a40ed3dSBarry Smith   } else {
3242dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);
32590f02eecSBarry Smith   }
3261ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
3271ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
328d0f46423SBarry Smith   ierr = PetscLogFlops(2*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
3293a40ed3dSBarry Smith   PetscFunctionReturn(0);
330da3a660dSBarry Smith }
331db4efbfdSBarry Smith 
332db4efbfdSBarry Smith /* ---------------------------------------------------------------*/
333db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots,
334db4efbfdSBarry Smith    rather than put it in the Mat->row slot.*/
335db4efbfdSBarry Smith #undef __FUNCT__
336db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactor_SeqDense"
337db4efbfdSBarry Smith PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,MatFactorInfo *minfo)
338db4efbfdSBarry Smith {
339db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF)
340db4efbfdSBarry Smith   PetscFunctionBegin;
341db4efbfdSBarry Smith   SETERRQ(PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable.");
342db4efbfdSBarry Smith #else
343db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
344db4efbfdSBarry Smith   PetscErrorCode ierr;
345db4efbfdSBarry Smith   PetscBLASInt   n,m,info;
346db4efbfdSBarry Smith 
347db4efbfdSBarry Smith   PetscFunctionBegin;
348db4efbfdSBarry Smith   n = PetscBLASIntCast(A->cmap->n);
349db4efbfdSBarry Smith   m = PetscBLASIntCast(A->rmap->n);
350db4efbfdSBarry Smith   if (!mat->pivots) {
351db4efbfdSBarry Smith     ierr = PetscMalloc((A->rmap->n+1)*sizeof(PetscBLASInt),&mat->pivots);CHKERRQ(ierr);
352db4efbfdSBarry Smith     ierr = PetscLogObjectMemory(A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr);
353db4efbfdSBarry Smith   }
354db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
355db4efbfdSBarry Smith   LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info);
356db4efbfdSBarry Smith   if (info<0) SETERRQ(PETSC_ERR_LIB,"Bad argument to LU factorization");
357db4efbfdSBarry Smith   if (info>0) SETERRQ(PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization");
358db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
359db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
360db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
361db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
362db4efbfdSBarry Smith   A->factor = MAT_FACTOR_LU;
363db4efbfdSBarry Smith 
364db4efbfdSBarry Smith   ierr = PetscLogFlops((2*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr);
365db4efbfdSBarry Smith #endif
366db4efbfdSBarry Smith   PetscFunctionReturn(0);
367db4efbfdSBarry Smith }
368db4efbfdSBarry Smith 
369db4efbfdSBarry Smith #undef __FUNCT__
370db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactor_SeqDense"
371db4efbfdSBarry Smith PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,MatFactorInfo *factinfo)
372db4efbfdSBarry Smith {
373db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF)
374db4efbfdSBarry Smith   PetscFunctionBegin;
375db4efbfdSBarry Smith   SETERRQ(PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable.");
376db4efbfdSBarry Smith #else
377db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
378db4efbfdSBarry Smith   PetscErrorCode ierr;
379db4efbfdSBarry Smith   PetscBLASInt   info,n = PetscBLASIntCast(A->cmap->n);
380db4efbfdSBarry Smith 
381db4efbfdSBarry Smith   PetscFunctionBegin;
382db4efbfdSBarry Smith   ierr = PetscFree(mat->pivots);CHKERRQ(ierr);
383db4efbfdSBarry Smith   mat->pivots = 0;
384db4efbfdSBarry Smith 
385db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
386db4efbfdSBarry Smith   LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info);
387db4efbfdSBarry Smith   if (info) SETERRQ1(PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1);
388db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
389db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
390db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
391db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
392db4efbfdSBarry Smith   A->factor = MAT_FACTOR_CHOLESKY;
393db4efbfdSBarry Smith   ierr = PetscLogFlops((A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr);
394db4efbfdSBarry Smith #endif
395db4efbfdSBarry Smith   PetscFunctionReturn(0);
396db4efbfdSBarry Smith }
397db4efbfdSBarry Smith 
398db4efbfdSBarry Smith 
399db4efbfdSBarry Smith #undef __FUNCT__
400db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense"
401719d5645SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,MatFactorInfo *info_dummy)
402db4efbfdSBarry Smith {
403db4efbfdSBarry Smith   PetscErrorCode ierr;
404db4efbfdSBarry Smith   MatFactorInfo  info;
405db4efbfdSBarry Smith 
406db4efbfdSBarry Smith   PetscFunctionBegin;
407db4efbfdSBarry Smith   info.fill = 1.0;
408719d5645SBarry Smith   ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr);
409db4efbfdSBarry Smith   PetscFunctionReturn(0);
410db4efbfdSBarry Smith }
411db4efbfdSBarry Smith 
412db4efbfdSBarry Smith #undef __FUNCT__
413db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense"
414719d5645SBarry Smith PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,MatFactorInfo *info)
415db4efbfdSBarry Smith {
416a093e273SMatthew Knepley   PetscErrorCode ierr;
417a093e273SMatthew Knepley 
418db4efbfdSBarry Smith   PetscFunctionBegin;
419719d5645SBarry Smith   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
420719d5645SBarry Smith   fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense;
421db4efbfdSBarry Smith   PetscFunctionReturn(0);
422db4efbfdSBarry Smith }
423db4efbfdSBarry Smith 
424db4efbfdSBarry Smith #undef __FUNCT__
425db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactorSymbolic_SeqDense"
426719d5645SBarry Smith PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,MatFactorInfo *info)
427db4efbfdSBarry Smith {
428a093e273SMatthew Knepley   PetscErrorCode ierr;
429a093e273SMatthew Knepley 
430db4efbfdSBarry Smith   PetscFunctionBegin;
431719d5645SBarry Smith   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_DO_NOT_COPY_VALUES);CHKERRQ(ierr);
432719d5645SBarry Smith   fact->ops->lufactornumeric   = MatLUFactorNumeric_SeqDense;
433db4efbfdSBarry Smith   PetscFunctionReturn(0);
434db4efbfdSBarry Smith }
435db4efbfdSBarry Smith 
436db4efbfdSBarry Smith #undef __FUNCT__
437db4efbfdSBarry Smith #define __FUNCT__ "MatGetFactor_seqdense_petsc"
438db4efbfdSBarry Smith PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact)
439db4efbfdSBarry Smith {
440db4efbfdSBarry Smith   PetscErrorCode ierr;
441db4efbfdSBarry Smith 
442db4efbfdSBarry Smith   PetscFunctionBegin;
443db4efbfdSBarry Smith   ierr = MatCreate(((PetscObject)A)->comm,fact);CHKERRQ(ierr);
444db4efbfdSBarry Smith   ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
445db4efbfdSBarry Smith   ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr);
446db4efbfdSBarry Smith   if (ftype == MAT_FACTOR_LU){
447db4efbfdSBarry Smith     (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense;
448db4efbfdSBarry Smith   } else {
449db4efbfdSBarry Smith     (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense;
450db4efbfdSBarry Smith   }
451db4efbfdSBarry Smith   (*fact)->factor = ftype;
452db4efbfdSBarry Smith   PetscFunctionReturn(0);
453db4efbfdSBarry Smith }
454db4efbfdSBarry Smith 
455289bc588SBarry Smith /* ------------------------------------------------------------------*/
4564a2ae208SSatish Balay #undef __FUNCT__
4574a2ae208SSatish Balay #define __FUNCT__ "MatRelax_SeqDense"
45813f74950SBarry Smith PetscErrorCode MatRelax_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx)
459289bc588SBarry Smith {
460c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
46187828ca2SBarry Smith   PetscScalar    *x,*b,*v = mat->v,zero = 0.0,xt;
462dfbe8321SBarry Smith   PetscErrorCode ierr;
463d0f46423SBarry Smith   PetscInt       m = A->rmap->n,i;
464aa482453SBarry Smith #if !defined(PETSC_USE_COMPLEX)
4650805154bSBarry Smith   PetscBLASInt   o = 1,bm = PetscBLASIntCast(m);
466bc1b551cSSatish Balay #endif
467289bc588SBarry Smith 
4683a40ed3dSBarry Smith   PetscFunctionBegin;
469289bc588SBarry Smith   if (flag & SOR_ZERO_INITIAL_GUESS) {
47071044d3cSBarry Smith     /* this is a hack fix, should have another version without the second BLASdot */
4712dcb1b2aSMatthew Knepley     ierr = VecSet(xx,zero);CHKERRQ(ierr);
472289bc588SBarry Smith   }
4731ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
4741ebc52fbSHong Zhang   ierr = VecGetArray(bb,&b);CHKERRQ(ierr);
475b965ef7fSBarry Smith   its  = its*lits;
47677431f27SBarry Smith   if (its <= 0) SETERRQ2(PETSC_ERR_ARG_WRONG,"Relaxation requires global its %D and local its %D both positive",its,lits);
477289bc588SBarry Smith   while (its--) {
478fccaa45eSBarry Smith     if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP){
479289bc588SBarry Smith       for (i=0; i<m; i++) {
480aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
481f1747703SBarry Smith         /* cannot use BLAS dot for complex because compiler/linker is
482f1747703SBarry Smith            not happy about returning a double complex */
48313f74950SBarry Smith         PetscInt    _i;
48487828ca2SBarry Smith         PetscScalar sum = b[i];
485f1747703SBarry Smith         for (_i=0; _i<m; _i++) {
4863f6de6efSSatish Balay           sum -= PetscConj(v[i+_i*m])*x[_i];
487f1747703SBarry Smith         }
488f1747703SBarry Smith         xt = sum;
489f1747703SBarry Smith #else
49071044d3cSBarry Smith         xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o);
491f1747703SBarry Smith #endif
49255a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
493289bc588SBarry Smith       }
494289bc588SBarry Smith     }
495fccaa45eSBarry Smith     if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP){
496289bc588SBarry Smith       for (i=m-1; i>=0; i--) {
497aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
498f1747703SBarry Smith         /* cannot use BLAS dot for complex because compiler/linker is
499f1747703SBarry Smith            not happy about returning a double complex */
50013f74950SBarry Smith         PetscInt    _i;
50187828ca2SBarry Smith         PetscScalar sum = b[i];
502f1747703SBarry Smith         for (_i=0; _i<m; _i++) {
5033f6de6efSSatish Balay           sum -= PetscConj(v[i+_i*m])*x[_i];
504f1747703SBarry Smith         }
505f1747703SBarry Smith         xt = sum;
506f1747703SBarry Smith #else
50771044d3cSBarry Smith         xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o);
508f1747703SBarry Smith #endif
50955a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
510289bc588SBarry Smith       }
511289bc588SBarry Smith     }
512289bc588SBarry Smith   }
5131ebc52fbSHong Zhang   ierr = VecRestoreArray(bb,&b);CHKERRQ(ierr);
5141ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
5153a40ed3dSBarry Smith   PetscFunctionReturn(0);
516289bc588SBarry Smith }
517289bc588SBarry Smith 
518289bc588SBarry Smith /* -----------------------------------------------------------------*/
5194a2ae208SSatish Balay #undef __FUNCT__
5204a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense"
521dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy)
522289bc588SBarry Smith {
523c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
52487828ca2SBarry Smith   PetscScalar    *v = mat->v,*x,*y;
525dfbe8321SBarry Smith   PetscErrorCode ierr;
5260805154bSBarry Smith   PetscBLASInt   m, n,_One=1;
527ea709b57SSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
5283a40ed3dSBarry Smith 
5293a40ed3dSBarry Smith   PetscFunctionBegin;
530d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
531d0f46423SBarry Smith   n = PetscBLASIntCast(A->cmap->n);
532d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
5331ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
5341ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
53571044d3cSBarry Smith   BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One);
5361ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
5371ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
538d0f46423SBarry Smith   ierr = PetscLogFlops(2*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
5393a40ed3dSBarry Smith   PetscFunctionReturn(0);
540289bc588SBarry Smith }
5416ee01492SSatish Balay 
5424a2ae208SSatish Balay #undef __FUNCT__
5434a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense"
544dfbe8321SBarry Smith PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy)
545289bc588SBarry Smith {
546c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
54787828ca2SBarry Smith   PetscScalar    *v = mat->v,*x,*y,_DOne=1.0,_DZero=0.0;
548dfbe8321SBarry Smith   PetscErrorCode ierr;
5490805154bSBarry Smith   PetscBLASInt   m, n, _One=1;
5503a40ed3dSBarry Smith 
5513a40ed3dSBarry Smith   PetscFunctionBegin;
552d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
553d0f46423SBarry Smith   n = PetscBLASIntCast(A->cmap->n);
554d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
5551ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
5561ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
55771044d3cSBarry Smith   BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One);
5581ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
5591ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
560d0f46423SBarry Smith   ierr = PetscLogFlops(2*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr);
5613a40ed3dSBarry Smith   PetscFunctionReturn(0);
562289bc588SBarry Smith }
5636ee01492SSatish Balay 
5644a2ae208SSatish Balay #undef __FUNCT__
5654a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense"
566dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
567289bc588SBarry Smith {
568c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
56987828ca2SBarry Smith   PetscScalar    *v = mat->v,*x,*y,_DOne=1.0;
570dfbe8321SBarry Smith   PetscErrorCode ierr;
5710805154bSBarry Smith   PetscBLASInt   m, n, _One=1;
5723a40ed3dSBarry Smith 
5733a40ed3dSBarry Smith   PetscFunctionBegin;
574d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
575d0f46423SBarry Smith   n = PetscBLASIntCast(A->cmap->n);
576d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
577600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
5781ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
5791ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
58071044d3cSBarry Smith   BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One);
5811ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
5821ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
583d0f46423SBarry Smith   ierr = PetscLogFlops(2*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
5843a40ed3dSBarry Smith   PetscFunctionReturn(0);
585289bc588SBarry Smith }
5866ee01492SSatish Balay 
5874a2ae208SSatish Balay #undef __FUNCT__
5884a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense"
589dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
590289bc588SBarry Smith {
591c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
59287828ca2SBarry Smith   PetscScalar    *v = mat->v,*x,*y;
593dfbe8321SBarry Smith   PetscErrorCode ierr;
5940805154bSBarry Smith   PetscBLASInt   m, n, _One=1;
59587828ca2SBarry Smith   PetscScalar    _DOne=1.0;
5963a40ed3dSBarry Smith 
5973a40ed3dSBarry Smith   PetscFunctionBegin;
598d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
599d0f46423SBarry Smith   n = PetscBLASIntCast(A->cmap->n);
600d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
601600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
6021ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
6031ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
60471044d3cSBarry Smith   BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One);
6051ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6061ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
607d0f46423SBarry Smith   ierr = PetscLogFlops(2*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
6083a40ed3dSBarry Smith   PetscFunctionReturn(0);
609289bc588SBarry Smith }
610289bc588SBarry Smith 
611289bc588SBarry Smith /* -----------------------------------------------------------------*/
6124a2ae208SSatish Balay #undef __FUNCT__
6134a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense"
61413f74950SBarry Smith PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
615289bc588SBarry Smith {
616c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
61787828ca2SBarry Smith   PetscScalar    *v;
6186849ba73SBarry Smith   PetscErrorCode ierr;
61913f74950SBarry Smith   PetscInt       i;
62067e560aaSBarry Smith 
6213a40ed3dSBarry Smith   PetscFunctionBegin;
622d0f46423SBarry Smith   *ncols = A->cmap->n;
623289bc588SBarry Smith   if (cols) {
624d0f46423SBarry Smith     ierr = PetscMalloc((A->cmap->n+1)*sizeof(PetscInt),cols);CHKERRQ(ierr);
625d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) (*cols)[i] = i;
626289bc588SBarry Smith   }
627289bc588SBarry Smith   if (vals) {
628d0f46423SBarry Smith     ierr = PetscMalloc((A->cmap->n+1)*sizeof(PetscScalar),vals);CHKERRQ(ierr);
629289bc588SBarry Smith     v    = mat->v + row;
630d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;}
631289bc588SBarry Smith   }
6323a40ed3dSBarry Smith   PetscFunctionReturn(0);
633289bc588SBarry Smith }
6346ee01492SSatish Balay 
6354a2ae208SSatish Balay #undef __FUNCT__
6364a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense"
63713f74950SBarry Smith PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
638289bc588SBarry Smith {
639dfbe8321SBarry Smith   PetscErrorCode ierr;
640606d414cSSatish Balay   PetscFunctionBegin;
641606d414cSSatish Balay   if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);}
642606d414cSSatish Balay   if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); }
6433a40ed3dSBarry Smith   PetscFunctionReturn(0);
644289bc588SBarry Smith }
645289bc588SBarry Smith /* ----------------------------------------------------------------*/
6464a2ae208SSatish Balay #undef __FUNCT__
6474a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense"
64813f74950SBarry Smith PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv)
649289bc588SBarry Smith {
650c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
65113f74950SBarry Smith   PetscInt     i,j,idx=0;
652d6dfbf8fSBarry Smith 
6533a40ed3dSBarry Smith   PetscFunctionBegin;
654289bc588SBarry Smith   if (!mat->roworiented) {
655dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
656289bc588SBarry Smith       for (j=0; j<n; j++) {
657cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
6582515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
659d0f46423SBarry Smith         if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1);
66058804f6dSBarry Smith #endif
661289bc588SBarry Smith         for (i=0; i<m; i++) {
662cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
6632515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
664d0f46423SBarry Smith           if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
66558804f6dSBarry Smith #endif
666cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
667289bc588SBarry Smith         }
668289bc588SBarry Smith       }
6693a40ed3dSBarry Smith     } else {
670289bc588SBarry Smith       for (j=0; j<n; j++) {
671cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
6722515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
673d0f46423SBarry Smith         if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1);
67458804f6dSBarry Smith #endif
675289bc588SBarry Smith         for (i=0; i<m; i++) {
676cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
6772515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
678d0f46423SBarry Smith           if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
67958804f6dSBarry Smith #endif
680cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
681289bc588SBarry Smith         }
682289bc588SBarry Smith       }
683289bc588SBarry Smith     }
6843a40ed3dSBarry Smith   } else {
685dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
686e8d4e0b9SBarry Smith       for (i=0; i<m; i++) {
687cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
6882515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
689d0f46423SBarry Smith         if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
69058804f6dSBarry Smith #endif
691e8d4e0b9SBarry Smith         for (j=0; j<n; j++) {
692cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
6932515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
694d0f46423SBarry Smith           if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1);
69558804f6dSBarry Smith #endif
696cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
697e8d4e0b9SBarry Smith         }
698e8d4e0b9SBarry Smith       }
6993a40ed3dSBarry Smith     } else {
700289bc588SBarry Smith       for (i=0; i<m; i++) {
701cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
7022515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
703d0f46423SBarry Smith         if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
70458804f6dSBarry Smith #endif
705289bc588SBarry Smith         for (j=0; j<n; j++) {
706cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
7072515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
708d0f46423SBarry Smith           if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1);
70958804f6dSBarry Smith #endif
710cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
711289bc588SBarry Smith         }
712289bc588SBarry Smith       }
713289bc588SBarry Smith     }
714e8d4e0b9SBarry Smith   }
7153a40ed3dSBarry Smith   PetscFunctionReturn(0);
716289bc588SBarry Smith }
717e8d4e0b9SBarry Smith 
7184a2ae208SSatish Balay #undef __FUNCT__
7194a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense"
72013f74950SBarry Smith PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[])
721ae80bb75SLois Curfman McInnes {
722ae80bb75SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
72313f74950SBarry Smith   PetscInt     i,j;
724ae80bb75SLois Curfman McInnes 
7253a40ed3dSBarry Smith   PetscFunctionBegin;
726ae80bb75SLois Curfman McInnes   /* row-oriented output */
727ae80bb75SLois Curfman McInnes   for (i=0; i<m; i++) {
72897e567efSBarry Smith     if (indexm[i] < 0) {v += n;continue;}
729d0f46423SBarry Smith     if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row %D requested larger than number rows %D",indexm[i],A->rmap->n);
730ae80bb75SLois Curfman McInnes     for (j=0; j<n; j++) {
7316f31f424SBarry Smith       if (indexn[j] < 0) {v++; continue;}
732d0f46423SBarry Smith       if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column %D requested larger than number columns %D",indexn[j],A->cmap->n);
73397e567efSBarry Smith       *v++ = mat->v[indexn[j]*mat->lda + indexm[i]];
734ae80bb75SLois Curfman McInnes     }
735ae80bb75SLois Curfman McInnes   }
7363a40ed3dSBarry Smith   PetscFunctionReturn(0);
737ae80bb75SLois Curfman McInnes }
738ae80bb75SLois Curfman McInnes 
739289bc588SBarry Smith /* -----------------------------------------------------------------*/
740289bc588SBarry Smith 
741e090d566SSatish Balay #include "petscsys.h"
74288e32edaSLois Curfman McInnes 
7434a2ae208SSatish Balay #undef __FUNCT__
7444a2ae208SSatish Balay #define __FUNCT__ "MatLoad_SeqDense"
745a313700dSBarry Smith PetscErrorCode MatLoad_SeqDense(PetscViewer viewer, const MatType type,Mat *A)
74688e32edaSLois Curfman McInnes {
74788e32edaSLois Curfman McInnes   Mat_SeqDense   *a;
74888e32edaSLois Curfman McInnes   Mat            B;
7496849ba73SBarry Smith   PetscErrorCode ierr;
75013f74950SBarry Smith   PetscInt       *scols,i,j,nz,header[4];
75113f74950SBarry Smith   int            fd;
75213f74950SBarry Smith   PetscMPIInt    size;
75313f74950SBarry Smith   PetscInt       *rowlengths = 0,M,N,*cols;
75487828ca2SBarry Smith   PetscScalar    *vals,*svals,*v,*w;
75519bcc07fSBarry Smith   MPI_Comm       comm = ((PetscObject)viewer)->comm;
75688e32edaSLois Curfman McInnes 
7573a40ed3dSBarry Smith   PetscFunctionBegin;
758d132466eSBarry Smith   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
75929bbc08cSBarry Smith   if (size > 1) SETERRQ(PETSC_ERR_ARG_WRONG,"view must have one processor");
760b0a32e0cSBarry Smith   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
7610752156aSBarry Smith   ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr);
762552e946dSBarry Smith   if (header[0] != MAT_FILE_COOKIE) SETERRQ(PETSC_ERR_FILE_UNEXPECTED,"Not matrix object");
76388e32edaSLois Curfman McInnes   M = header[1]; N = header[2]; nz = header[3];
76488e32edaSLois Curfman McInnes 
76590ace30eSBarry Smith   if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */
766f69a0ea3SMatthew Knepley     ierr = MatCreate(comm,A);CHKERRQ(ierr);
767f69a0ea3SMatthew Knepley     ierr = MatSetSizes(*A,M,N,M,N);CHKERRQ(ierr);
768be5d1d56SKris Buschelman     ierr = MatSetType(*A,type);CHKERRQ(ierr);
7695c5985e7SKris Buschelman     ierr = MatSeqDenseSetPreallocation(*A,PETSC_NULL);CHKERRQ(ierr);
77090ace30eSBarry Smith     B    = *A;
77190ace30eSBarry Smith     a    = (Mat_SeqDense*)B->data;
7724a41a4d3SSatish Balay     v    = a->v;
7734a41a4d3SSatish Balay     /* Allocate some temp space to read in the values and then flip them
7744a41a4d3SSatish Balay        from row major to column major */
775b72907f3SBarry Smith     ierr = PetscMalloc((M*N > 0 ? M*N : 1)*sizeof(PetscScalar),&w);CHKERRQ(ierr);
77690ace30eSBarry Smith     /* read in nonzero values */
7774a41a4d3SSatish Balay     ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr);
7784a41a4d3SSatish Balay     /* now flip the values and store them in the matrix*/
7794a41a4d3SSatish Balay     for (j=0; j<N; j++) {
7804a41a4d3SSatish Balay       for (i=0; i<M; i++) {
7814a41a4d3SSatish Balay         *v++ =w[i*N+j];
7824a41a4d3SSatish Balay       }
7834a41a4d3SSatish Balay     }
784606d414cSSatish Balay     ierr = PetscFree(w);CHKERRQ(ierr);
7856d4a8577SBarry Smith     ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
7866d4a8577SBarry Smith     ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
78790ace30eSBarry Smith   } else {
78888e32edaSLois Curfman McInnes     /* read row lengths */
78913f74950SBarry Smith     ierr = PetscMalloc((M+1)*sizeof(PetscInt),&rowlengths);CHKERRQ(ierr);
7900752156aSBarry Smith     ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr);
79188e32edaSLois Curfman McInnes 
79288e32edaSLois Curfman McInnes     /* create our matrix */
793f69a0ea3SMatthew Knepley     ierr = MatCreate(comm,A);CHKERRQ(ierr);
794f69a0ea3SMatthew Knepley     ierr = MatSetSizes(*A,M,N,M,N);CHKERRQ(ierr);
795be5d1d56SKris Buschelman     ierr = MatSetType(*A,type);CHKERRQ(ierr);
7965c5985e7SKris Buschelman     ierr = MatSeqDenseSetPreallocation(*A,PETSC_NULL);CHKERRQ(ierr);
79788e32edaSLois Curfman McInnes     B = *A;
79888e32edaSLois Curfman McInnes     a = (Mat_SeqDense*)B->data;
79988e32edaSLois Curfman McInnes     v = a->v;
80088e32edaSLois Curfman McInnes 
80188e32edaSLois Curfman McInnes     /* read column indices and nonzeros */
80213f74950SBarry Smith     ierr = PetscMalloc((nz+1)*sizeof(PetscInt),&scols);CHKERRQ(ierr);
803b0a32e0cSBarry Smith     cols = scols;
8040752156aSBarry Smith     ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr);
80587828ca2SBarry Smith     ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&svals);CHKERRQ(ierr);
806b0a32e0cSBarry Smith     vals = svals;
8070752156aSBarry Smith     ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr);
80888e32edaSLois Curfman McInnes 
80988e32edaSLois Curfman McInnes     /* insert into matrix */
81088e32edaSLois Curfman McInnes     for (i=0; i<M; i++) {
81188e32edaSLois Curfman McInnes       for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j];
81288e32edaSLois Curfman McInnes       svals += rowlengths[i]; scols += rowlengths[i];
81388e32edaSLois Curfman McInnes     }
814606d414cSSatish Balay     ierr = PetscFree(vals);CHKERRQ(ierr);
815606d414cSSatish Balay     ierr = PetscFree(cols);CHKERRQ(ierr);
816606d414cSSatish Balay     ierr = PetscFree(rowlengths);CHKERRQ(ierr);
81788e32edaSLois Curfman McInnes 
8186d4a8577SBarry Smith     ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
8196d4a8577SBarry Smith     ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
82090ace30eSBarry Smith   }
8213a40ed3dSBarry Smith   PetscFunctionReturn(0);
82288e32edaSLois Curfman McInnes }
82388e32edaSLois Curfman McInnes 
824e090d566SSatish Balay #include "petscsys.h"
825932b0c3eSLois Curfman McInnes 
8264a2ae208SSatish Balay #undef __FUNCT__
8274a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII"
8286849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer)
829289bc588SBarry Smith {
830932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
831dfbe8321SBarry Smith   PetscErrorCode    ierr;
83213f74950SBarry Smith   PetscInt          i,j;
8332dcb1b2aSMatthew Knepley   const char        *name;
83487828ca2SBarry Smith   PetscScalar       *v;
835f3ef73ceSBarry Smith   PetscViewerFormat format;
8365f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX)
8375f481a85SSatish Balay   PetscTruth        allreal = PETSC_TRUE;
8385f481a85SSatish Balay #endif
839932b0c3eSLois Curfman McInnes 
8403a40ed3dSBarry Smith   PetscFunctionBegin;
841435da068SBarry Smith   ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr);
842b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
843456192e2SBarry Smith   if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
8443a40ed3dSBarry Smith     PetscFunctionReturn(0);  /* do nothing for now */
845fb9695e5SSatish Balay   } else if (format == PETSC_VIEWER_ASCII_COMMON) {
846b0a32e0cSBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_NO);CHKERRQ(ierr);
847d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
84844cd7ae7SLois Curfman McInnes       v = a->v + i;
84977431f27SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr);
850d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
851aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
852329f5518SBarry Smith         if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) {
853a83599f4SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %G + %G i) ",j,PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr);
854329f5518SBarry Smith         } else if (PetscRealPart(*v)) {
855a83599f4SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,PetscRealPart(*v));CHKERRQ(ierr);
8566831982aSBarry Smith         }
85780cd9d93SLois Curfman McInnes #else
8586831982aSBarry Smith         if (*v) {
859a83599f4SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,*v);CHKERRQ(ierr);
8606831982aSBarry Smith         }
86180cd9d93SLois Curfman McInnes #endif
8621b807ce4Svictorle         v += a->lda;
86380cd9d93SLois Curfman McInnes       }
864b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
86580cd9d93SLois Curfman McInnes     }
866b0a32e0cSBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_YES);CHKERRQ(ierr);
8673a40ed3dSBarry Smith   } else {
868b0a32e0cSBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_NO);CHKERRQ(ierr);
869aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
87047989497SBarry Smith     /* determine if matrix has all real values */
87147989497SBarry Smith     v = a->v;
872d0f46423SBarry Smith     for (i=0; i<A->rmap->n*A->cmap->n; i++) {
873ffac6cdbSBarry Smith 	if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break ;}
87447989497SBarry Smith     }
87547989497SBarry Smith #endif
876fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
8773a7fca6bSBarry Smith       ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr);
878d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr);
879d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
880fb9695e5SSatish Balay       ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr);
881ffac6cdbSBarry Smith     }
882ffac6cdbSBarry Smith 
883d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
884932b0c3eSLois Curfman McInnes       v = a->v + i;
885d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
886aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
88747989497SBarry Smith         if (allreal) {
888f32d5d43SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",PetscRealPart(*v));CHKERRQ(ierr);
88947989497SBarry Smith         } else {
890f32d5d43SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16e i ",PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr);
89147989497SBarry Smith         }
892289bc588SBarry Smith #else
893f32d5d43SBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",*v);CHKERRQ(ierr);
894289bc588SBarry Smith #endif
8951b807ce4Svictorle 	v += a->lda;
896289bc588SBarry Smith       }
897b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
898289bc588SBarry Smith     }
899fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
900b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr);
901ffac6cdbSBarry Smith     }
902b0a32e0cSBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_YES);CHKERRQ(ierr);
903da3a660dSBarry Smith   }
904b0a32e0cSBarry Smith   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
9053a40ed3dSBarry Smith   PetscFunctionReturn(0);
906289bc588SBarry Smith }
907289bc588SBarry Smith 
9084a2ae208SSatish Balay #undef __FUNCT__
9094a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary"
9106849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer)
911932b0c3eSLois Curfman McInnes {
912932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
9136849ba73SBarry Smith   PetscErrorCode    ierr;
91413f74950SBarry Smith   int               fd;
915d0f46423SBarry Smith   PetscInt          ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n;
91687828ca2SBarry Smith   PetscScalar       *v,*anonz,*vals;
917f3ef73ceSBarry Smith   PetscViewerFormat format;
918932b0c3eSLois Curfman McInnes 
9193a40ed3dSBarry Smith   PetscFunctionBegin;
920b0a32e0cSBarry Smith   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
92190ace30eSBarry Smith 
922b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
923fb9695e5SSatish Balay   if (format == PETSC_VIEWER_BINARY_NATIVE) {
92490ace30eSBarry Smith     /* store the matrix as a dense matrix */
92513f74950SBarry Smith     ierr = PetscMalloc(4*sizeof(PetscInt),&col_lens);CHKERRQ(ierr);
926552e946dSBarry Smith     col_lens[0] = MAT_FILE_COOKIE;
92790ace30eSBarry Smith     col_lens[1] = m;
92890ace30eSBarry Smith     col_lens[2] = n;
92990ace30eSBarry Smith     col_lens[3] = MATRIX_BINARY_FORMAT_DENSE;
9306f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
931606d414cSSatish Balay     ierr = PetscFree(col_lens);CHKERRQ(ierr);
93290ace30eSBarry Smith 
93390ace30eSBarry Smith     /* write out matrix, by rows */
93487828ca2SBarry Smith     ierr = PetscMalloc((m*n+1)*sizeof(PetscScalar),&vals);CHKERRQ(ierr);
93590ace30eSBarry Smith     v    = a->v;
93690ace30eSBarry Smith     for (j=0; j<n; j++) {
937578230a0SSatish Balay       for (i=0; i<m; i++) {
938578230a0SSatish Balay         vals[j + i*n] = *v++;
93990ace30eSBarry Smith       }
94090ace30eSBarry Smith     }
9416f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
942606d414cSSatish Balay     ierr = PetscFree(vals);CHKERRQ(ierr);
94390ace30eSBarry Smith   } else {
94413f74950SBarry Smith     ierr = PetscMalloc((4+nz)*sizeof(PetscInt),&col_lens);CHKERRQ(ierr);
945552e946dSBarry Smith     col_lens[0] = MAT_FILE_COOKIE;
946932b0c3eSLois Curfman McInnes     col_lens[1] = m;
947932b0c3eSLois Curfman McInnes     col_lens[2] = n;
948932b0c3eSLois Curfman McInnes     col_lens[3] = nz;
949932b0c3eSLois Curfman McInnes 
950932b0c3eSLois Curfman McInnes     /* store lengths of each row and write (including header) to file */
951932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) col_lens[4+i] = n;
9526f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
953932b0c3eSLois Curfman McInnes 
954932b0c3eSLois Curfman McInnes     /* Possibly should write in smaller increments, not whole matrix at once? */
955932b0c3eSLois Curfman McInnes     /* store column indices (zero start index) */
956932b0c3eSLois Curfman McInnes     ict = 0;
957932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
958932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) col_lens[ict++] = j;
959932b0c3eSLois Curfman McInnes     }
9606f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
961606d414cSSatish Balay     ierr = PetscFree(col_lens);CHKERRQ(ierr);
962932b0c3eSLois Curfman McInnes 
963932b0c3eSLois Curfman McInnes     /* store nonzero values */
96487828ca2SBarry Smith     ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&anonz);CHKERRQ(ierr);
965932b0c3eSLois Curfman McInnes     ict  = 0;
966932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
967932b0c3eSLois Curfman McInnes       v = a->v + i;
968932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) {
9691b807ce4Svictorle         anonz[ict++] = *v; v += a->lda;
970932b0c3eSLois Curfman McInnes       }
971932b0c3eSLois Curfman McInnes     }
9726f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
973606d414cSSatish Balay     ierr = PetscFree(anonz);CHKERRQ(ierr);
97490ace30eSBarry Smith   }
9753a40ed3dSBarry Smith   PetscFunctionReturn(0);
976932b0c3eSLois Curfman McInnes }
977932b0c3eSLois Curfman McInnes 
9784a2ae208SSatish Balay #undef __FUNCT__
9794a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom"
980dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa)
981f1af5d2fSBarry Smith {
982f1af5d2fSBarry Smith   Mat               A = (Mat) Aa;
983f1af5d2fSBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
9846849ba73SBarry Smith   PetscErrorCode    ierr;
985d0f46423SBarry Smith   PetscInt          m = A->rmap->n,n = A->cmap->n,color,i,j;
98687828ca2SBarry Smith   PetscScalar       *v = a->v;
987b0a32e0cSBarry Smith   PetscViewer       viewer;
988b0a32e0cSBarry Smith   PetscDraw         popup;
989329f5518SBarry Smith   PetscReal         xl,yl,xr,yr,x_l,x_r,y_l,y_r,scale,maxv = 0.0;
990f3ef73ceSBarry Smith   PetscViewerFormat format;
991f1af5d2fSBarry Smith 
992f1af5d2fSBarry Smith   PetscFunctionBegin;
993f1af5d2fSBarry Smith 
994f1af5d2fSBarry Smith   ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr);
995b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
996b0a32e0cSBarry Smith   ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr);
997f1af5d2fSBarry Smith 
998f1af5d2fSBarry Smith   /* Loop over matrix elements drawing boxes */
999fb9695e5SSatish Balay   if (format != PETSC_VIEWER_DRAW_CONTOUR) {
1000f1af5d2fSBarry Smith     /* Blue for negative and Red for positive */
1001b0a32e0cSBarry Smith     color = PETSC_DRAW_BLUE;
1002f1af5d2fSBarry Smith     for(j = 0; j < n; j++) {
1003f1af5d2fSBarry Smith       x_l = j;
1004f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1005f1af5d2fSBarry Smith       for(i = 0; i < m; i++) {
1006f1af5d2fSBarry Smith         y_l = m - i - 1.0;
1007f1af5d2fSBarry Smith         y_r = y_l + 1.0;
1008f1af5d2fSBarry Smith #if defined(PETSC_USE_COMPLEX)
1009329f5518SBarry Smith         if (PetscRealPart(v[j*m+i]) >  0.) {
1010b0a32e0cSBarry Smith           color = PETSC_DRAW_RED;
1011329f5518SBarry Smith         } else if (PetscRealPart(v[j*m+i]) <  0.) {
1012b0a32e0cSBarry Smith           color = PETSC_DRAW_BLUE;
1013f1af5d2fSBarry Smith         } else {
1014f1af5d2fSBarry Smith           continue;
1015f1af5d2fSBarry Smith         }
1016f1af5d2fSBarry Smith #else
1017f1af5d2fSBarry Smith         if (v[j*m+i] >  0.) {
1018b0a32e0cSBarry Smith           color = PETSC_DRAW_RED;
1019f1af5d2fSBarry Smith         } else if (v[j*m+i] <  0.) {
1020b0a32e0cSBarry Smith           color = PETSC_DRAW_BLUE;
1021f1af5d2fSBarry Smith         } else {
1022f1af5d2fSBarry Smith           continue;
1023f1af5d2fSBarry Smith         }
1024f1af5d2fSBarry Smith #endif
1025b0a32e0cSBarry Smith         ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1026f1af5d2fSBarry Smith       }
1027f1af5d2fSBarry Smith     }
1028f1af5d2fSBarry Smith   } else {
1029f1af5d2fSBarry Smith     /* use contour shading to indicate magnitude of values */
1030f1af5d2fSBarry Smith     /* first determine max of all nonzero values */
1031f1af5d2fSBarry Smith     for(i = 0; i < m*n; i++) {
1032f1af5d2fSBarry Smith       if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]);
1033f1af5d2fSBarry Smith     }
1034b0a32e0cSBarry Smith     scale = (245.0 - PETSC_DRAW_BASIC_COLORS)/maxv;
1035b0a32e0cSBarry Smith     ierr  = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr);
1036b0a32e0cSBarry Smith     if (popup) {ierr  = PetscDrawScalePopup(popup,0.0,maxv);CHKERRQ(ierr);}
1037f1af5d2fSBarry Smith     for(j = 0; j < n; j++) {
1038f1af5d2fSBarry Smith       x_l = j;
1039f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1040f1af5d2fSBarry Smith       for(i = 0; i < m; i++) {
1041f1af5d2fSBarry Smith         y_l   = m - i - 1.0;
1042f1af5d2fSBarry Smith         y_r   = y_l + 1.0;
1043b0a32e0cSBarry Smith         color = PETSC_DRAW_BASIC_COLORS + (int)(scale*PetscAbsScalar(v[j*m+i]));
1044b0a32e0cSBarry Smith         ierr  = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1045f1af5d2fSBarry Smith       }
1046f1af5d2fSBarry Smith     }
1047f1af5d2fSBarry Smith   }
1048f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1049f1af5d2fSBarry Smith }
1050f1af5d2fSBarry Smith 
10514a2ae208SSatish Balay #undef __FUNCT__
10524a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw"
1053dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer)
1054f1af5d2fSBarry Smith {
1055b0a32e0cSBarry Smith   PetscDraw      draw;
1056f1af5d2fSBarry Smith   PetscTruth     isnull;
1057329f5518SBarry Smith   PetscReal      xr,yr,xl,yl,h,w;
1058dfbe8321SBarry Smith   PetscErrorCode ierr;
1059f1af5d2fSBarry Smith 
1060f1af5d2fSBarry Smith   PetscFunctionBegin;
1061b0a32e0cSBarry Smith   ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
1062b0a32e0cSBarry Smith   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
1063abc0a331SBarry Smith   if (isnull) PetscFunctionReturn(0);
1064f1af5d2fSBarry Smith 
1065f1af5d2fSBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr);
1066d0f46423SBarry Smith   xr  = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0;
1067f1af5d2fSBarry Smith   xr += w;    yr += h;  xl = -w;     yl = -h;
1068b0a32e0cSBarry Smith   ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr);
1069b0a32e0cSBarry Smith   ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr);
1070f1af5d2fSBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",PETSC_NULL);CHKERRQ(ierr);
1071f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1072f1af5d2fSBarry Smith }
1073f1af5d2fSBarry Smith 
10744a2ae208SSatish Balay #undef __FUNCT__
10754a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense"
1076dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer)
1077932b0c3eSLois Curfman McInnes {
1078dfbe8321SBarry Smith   PetscErrorCode ierr;
10796805f65bSBarry Smith   PetscTruth     iascii,isbinary,isdraw;
1080932b0c3eSLois Curfman McInnes 
10813a40ed3dSBarry Smith   PetscFunctionBegin;
108232077d6dSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr);
1083fb9695e5SSatish Balay   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_BINARY,&isbinary);CHKERRQ(ierr);
1084fb9695e5SSatish Balay   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_DRAW,&isdraw);CHKERRQ(ierr);
10850f5bd95cSBarry Smith 
1086c45a1595SBarry Smith   if (iascii) {
1087c45a1595SBarry Smith     ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr);
10880f5bd95cSBarry Smith   } else if (isbinary) {
10893a40ed3dSBarry Smith     ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr);
1090f1af5d2fSBarry Smith   } else if (isdraw) {
1091f1af5d2fSBarry Smith     ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr);
10925cd90555SBarry Smith   } else {
1093958c9bccSBarry Smith     SETERRQ1(PETSC_ERR_SUP,"Viewer type %s not supported by dense matrix",((PetscObject)viewer)->type_name);
1094932b0c3eSLois Curfman McInnes   }
10953a40ed3dSBarry Smith   PetscFunctionReturn(0);
1096932b0c3eSLois Curfman McInnes }
1097289bc588SBarry Smith 
10984a2ae208SSatish Balay #undef __FUNCT__
10994a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense"
1100dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqDense(Mat mat)
1101289bc588SBarry Smith {
1102ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)mat->data;
1103dfbe8321SBarry Smith   PetscErrorCode ierr;
110490f02eecSBarry Smith 
11053a40ed3dSBarry Smith   PetscFunctionBegin;
1106aa482453SBarry Smith #if defined(PETSC_USE_LOG)
1107d0f46423SBarry Smith   PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n);
1108a5a9c739SBarry Smith #endif
110905b42c5fSBarry Smith   ierr = PetscFree(l->pivots);CHKERRQ(ierr);
11106857c123SSatish Balay   if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);}
1111606d414cSSatish Balay   ierr = PetscFree(l);CHKERRQ(ierr);
1112dbd8c25aSHong Zhang 
1113dbd8c25aSHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr);
1114901853e0SKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatSeqDenseSetPreallocation_C","",PETSC_NULL);CHKERRQ(ierr);
11154ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMult_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr);
11164ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr);
11174ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr);
11183a40ed3dSBarry Smith   PetscFunctionReturn(0);
1119289bc588SBarry Smith }
1120289bc588SBarry Smith 
11214a2ae208SSatish Balay #undef __FUNCT__
11224a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense"
1123fc4dec0aSBarry Smith PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout)
1124289bc588SBarry Smith {
1125c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
11266849ba73SBarry Smith   PetscErrorCode ierr;
112713f74950SBarry Smith   PetscInt       k,j,m,n,M;
112887828ca2SBarry Smith   PetscScalar    *v,tmp;
112948b35521SBarry Smith 
11303a40ed3dSBarry Smith   PetscFunctionBegin;
1131d0f46423SBarry Smith   v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n;
1132e9695a30SBarry Smith   if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */
1133a5ce6ee0Svictorle     if (m != n) {
1134634064b4SBarry Smith       SETERRQ(PETSC_ERR_SUP,"Can not transpose non-square matrix in place");
1135d64ed03dSBarry Smith     } else {
1136d3e5ee88SLois Curfman McInnes       for (j=0; j<m; j++) {
1137289bc588SBarry Smith         for (k=0; k<j; k++) {
11381b807ce4Svictorle           tmp = v[j + k*M];
11391b807ce4Svictorle           v[j + k*M] = v[k + j*M];
11401b807ce4Svictorle           v[k + j*M] = tmp;
1141289bc588SBarry Smith         }
1142289bc588SBarry Smith       }
1143d64ed03dSBarry Smith     }
11443a40ed3dSBarry Smith   } else { /* out-of-place transpose */
1145d3e5ee88SLois Curfman McInnes     Mat          tmat;
1146ec8511deSBarry Smith     Mat_SeqDense *tmatd;
114787828ca2SBarry Smith     PetscScalar  *v2;
1148ea709b57SSatish Balay 
1149fc4dec0aSBarry Smith     if (reuse == MAT_INITIAL_MATRIX) {
11507adad957SLisandro Dalcin       ierr  = MatCreate(((PetscObject)A)->comm,&tmat);CHKERRQ(ierr);
1151d0f46423SBarry Smith       ierr  = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr);
11527adad957SLisandro Dalcin       ierr  = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
11535c5985e7SKris Buschelman       ierr  = MatSeqDenseSetPreallocation(tmat,PETSC_NULL);CHKERRQ(ierr);
1154fc4dec0aSBarry Smith     } else {
1155fc4dec0aSBarry Smith       tmat = *matout;
1156fc4dec0aSBarry Smith     }
1157ec8511deSBarry Smith     tmatd = (Mat_SeqDense*)tmat->data;
11580de55854SLois Curfman McInnes     v = mat->v; v2 = tmatd->v;
1159d3e5ee88SLois Curfman McInnes     for (j=0; j<n; j++) {
11601b807ce4Svictorle       for (k=0; k<m; k++) v2[j + k*n] = v[k + j*M];
1161d3e5ee88SLois Curfman McInnes     }
11626d4a8577SBarry Smith     ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
11636d4a8577SBarry Smith     ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1164d3e5ee88SLois Curfman McInnes     *matout = tmat;
116548b35521SBarry Smith   }
11663a40ed3dSBarry Smith   PetscFunctionReturn(0);
1167289bc588SBarry Smith }
1168289bc588SBarry Smith 
11694a2ae208SSatish Balay #undef __FUNCT__
11704a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense"
1171dfbe8321SBarry Smith PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscTruth *flg)
1172289bc588SBarry Smith {
1173c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data;
1174c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data;
117513f74950SBarry Smith   PetscInt     i,j;
117687828ca2SBarry Smith   PetscScalar  *v1 = mat1->v,*v2 = mat2->v;
11779ea5d5aeSSatish Balay 
11783a40ed3dSBarry Smith   PetscFunctionBegin;
1179d0f46423SBarry Smith   if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1180d0f46423SBarry Smith   if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1181d0f46423SBarry Smith   for (i=0; i<A1->rmap->n; i++) {
11821b807ce4Svictorle     v1 = mat1->v+i; v2 = mat2->v+i;
1183d0f46423SBarry Smith     for (j=0; j<A1->cmap->n; j++) {
11843a40ed3dSBarry Smith       if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
11851b807ce4Svictorle       v1 += mat1->lda; v2 += mat2->lda;
11861b807ce4Svictorle     }
1187289bc588SBarry Smith   }
118877c4ece6SBarry Smith   *flg = PETSC_TRUE;
11893a40ed3dSBarry Smith   PetscFunctionReturn(0);
1190289bc588SBarry Smith }
1191289bc588SBarry Smith 
11924a2ae208SSatish Balay #undef __FUNCT__
11934a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense"
1194dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v)
1195289bc588SBarry Smith {
1196c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
1197dfbe8321SBarry Smith   PetscErrorCode ierr;
119813f74950SBarry Smith   PetscInt       i,n,len;
119987828ca2SBarry Smith   PetscScalar    *x,zero = 0.0;
120044cd7ae7SLois Curfman McInnes 
12013a40ed3dSBarry Smith   PetscFunctionBegin;
12022dcb1b2aSMatthew Knepley   ierr = VecSet(v,zero);CHKERRQ(ierr);
12037a97a34bSBarry Smith   ierr = VecGetSize(v,&n);CHKERRQ(ierr);
12041ebc52fbSHong Zhang   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1205d0f46423SBarry Smith   len = PetscMin(A->rmap->n,A->cmap->n);
1206d0f46423SBarry Smith   if (n != A->rmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec");
120744cd7ae7SLois Curfman McInnes   for (i=0; i<len; i++) {
12081b807ce4Svictorle     x[i] = mat->v[i*mat->lda + i];
1209289bc588SBarry Smith   }
12101ebc52fbSHong Zhang   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
12113a40ed3dSBarry Smith   PetscFunctionReturn(0);
1212289bc588SBarry Smith }
1213289bc588SBarry Smith 
12144a2ae208SSatish Balay #undef __FUNCT__
12154a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense"
1216dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr)
1217289bc588SBarry Smith {
1218c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
121987828ca2SBarry Smith   PetscScalar    *l,*r,x,*v;
1220dfbe8321SBarry Smith   PetscErrorCode ierr;
1221d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n;
122255659b69SBarry Smith 
12233a40ed3dSBarry Smith   PetscFunctionBegin;
122428988994SBarry Smith   if (ll) {
12257a97a34bSBarry Smith     ierr = VecGetSize(ll,&m);CHKERRQ(ierr);
12261ebc52fbSHong Zhang     ierr = VecGetArray(ll,&l);CHKERRQ(ierr);
1227d0f46423SBarry Smith     if (m != A->rmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size");
1228da3a660dSBarry Smith     for (i=0; i<m; i++) {
1229da3a660dSBarry Smith       x = l[i];
1230da3a660dSBarry Smith       v = mat->v + i;
1231da3a660dSBarry Smith       for (j=0; j<n; j++) { (*v) *= x; v+= m;}
1232da3a660dSBarry Smith     }
12331ebc52fbSHong Zhang     ierr = VecRestoreArray(ll,&l);CHKERRQ(ierr);
1234efee365bSSatish Balay     ierr = PetscLogFlops(n*m);CHKERRQ(ierr);
1235da3a660dSBarry Smith   }
123628988994SBarry Smith   if (rr) {
12377a97a34bSBarry Smith     ierr = VecGetSize(rr,&n);CHKERRQ(ierr);
12381ebc52fbSHong Zhang     ierr = VecGetArray(rr,&r);CHKERRQ(ierr);
1239d0f46423SBarry Smith     if (n != A->cmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size");
1240da3a660dSBarry Smith     for (i=0; i<n; i++) {
1241da3a660dSBarry Smith       x = r[i];
1242da3a660dSBarry Smith       v = mat->v + i*m;
1243da3a660dSBarry Smith       for (j=0; j<m; j++) { (*v++) *= x;}
1244da3a660dSBarry Smith     }
12451ebc52fbSHong Zhang     ierr = VecRestoreArray(rr,&r);CHKERRQ(ierr);
1246efee365bSSatish Balay     ierr = PetscLogFlops(n*m);CHKERRQ(ierr);
1247da3a660dSBarry Smith   }
12483a40ed3dSBarry Smith   PetscFunctionReturn(0);
1249289bc588SBarry Smith }
1250289bc588SBarry Smith 
12514a2ae208SSatish Balay #undef __FUNCT__
12524a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense"
1253dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm)
1254289bc588SBarry Smith {
1255c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
125687828ca2SBarry Smith   PetscScalar  *v = mat->v;
1257329f5518SBarry Smith   PetscReal    sum = 0.0;
1258d0f46423SBarry Smith   PetscInt     lda=mat->lda,m=A->rmap->n,i,j;
1259efee365bSSatish Balay   PetscErrorCode ierr;
126055659b69SBarry Smith 
12613a40ed3dSBarry Smith   PetscFunctionBegin;
1262289bc588SBarry Smith   if (type == NORM_FROBENIUS) {
1263a5ce6ee0Svictorle     if (lda>m) {
1264d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1265a5ce6ee0Svictorle 	v = mat->v+j*lda;
1266a5ce6ee0Svictorle 	for (i=0; i<m; i++) {
1267a5ce6ee0Svictorle #if defined(PETSC_USE_COMPLEX)
1268a5ce6ee0Svictorle 	  sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1269a5ce6ee0Svictorle #else
1270a5ce6ee0Svictorle 	  sum += (*v)*(*v); v++;
1271a5ce6ee0Svictorle #endif
1272a5ce6ee0Svictorle 	}
1273a5ce6ee0Svictorle       }
1274a5ce6ee0Svictorle     } else {
1275d0f46423SBarry Smith       for (i=0; i<A->cmap->n*A->rmap->n; i++) {
1276aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
1277329f5518SBarry Smith 	sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1278289bc588SBarry Smith #else
1279289bc588SBarry Smith 	sum += (*v)*(*v); v++;
1280289bc588SBarry Smith #endif
1281289bc588SBarry Smith       }
1282a5ce6ee0Svictorle     }
1283064f8208SBarry Smith     *nrm = sqrt(sum);
1284d0f46423SBarry Smith     ierr = PetscLogFlops(2*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
12853a40ed3dSBarry Smith   } else if (type == NORM_1) {
1286064f8208SBarry Smith     *nrm = 0.0;
1287d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
12881b807ce4Svictorle       v = mat->v + j*mat->lda;
1289289bc588SBarry Smith       sum = 0.0;
1290d0f46423SBarry Smith       for (i=0; i<A->rmap->n; i++) {
129133a8263dSBarry Smith         sum += PetscAbsScalar(*v);  v++;
1292289bc588SBarry Smith       }
1293064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1294289bc588SBarry Smith     }
1295d0f46423SBarry Smith     ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr);
12963a40ed3dSBarry Smith   } else if (type == NORM_INFINITY) {
1297064f8208SBarry Smith     *nrm = 0.0;
1298d0f46423SBarry Smith     for (j=0; j<A->rmap->n; j++) {
1299289bc588SBarry Smith       v = mat->v + j;
1300289bc588SBarry Smith       sum = 0.0;
1301d0f46423SBarry Smith       for (i=0; i<A->cmap->n; i++) {
13021b807ce4Svictorle         sum += PetscAbsScalar(*v); v += mat->lda;
1303289bc588SBarry Smith       }
1304064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1305289bc588SBarry Smith     }
1306d0f46423SBarry Smith     ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr);
13073a40ed3dSBarry Smith   } else {
130829bbc08cSBarry Smith     SETERRQ(PETSC_ERR_SUP,"No two norm");
1309289bc588SBarry Smith   }
13103a40ed3dSBarry Smith   PetscFunctionReturn(0);
1311289bc588SBarry Smith }
1312289bc588SBarry Smith 
13134a2ae208SSatish Balay #undef __FUNCT__
13144a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense"
13154e0d8c25SBarry Smith PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscTruth flg)
1316289bc588SBarry Smith {
1317c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *aij = (Mat_SeqDense*)A->data;
131863ba0a88SBarry Smith   PetscErrorCode ierr;
131967e560aaSBarry Smith 
13203a40ed3dSBarry Smith   PetscFunctionBegin;
1321b5a2b587SKris Buschelman   switch (op) {
1322b5a2b587SKris Buschelman   case MAT_ROW_ORIENTED:
13234e0d8c25SBarry Smith     aij->roworiented = flg;
1324b5a2b587SKris Buschelman     break;
1325512a5fc5SBarry Smith   case MAT_NEW_NONZERO_LOCATIONS:
1326b5a2b587SKris Buschelman   case MAT_NEW_NONZERO_LOCATION_ERR:
13273971808eSMatthew Knepley   case MAT_NEW_NONZERO_ALLOCATION_ERR:
13284e0d8c25SBarry Smith   case MAT_NEW_DIAGONALS:
1329b5a2b587SKris Buschelman   case MAT_IGNORE_OFF_PROC_ENTRIES:
1330b5a2b587SKris Buschelman   case MAT_USE_HASH_TABLE:
133177e54ba9SKris Buschelman   case MAT_SYMMETRIC:
133277e54ba9SKris Buschelman   case MAT_STRUCTURALLY_SYMMETRIC:
13339a4540c5SBarry Smith   case MAT_HERMITIAN:
13349a4540c5SBarry Smith   case MAT_SYMMETRY_ETERNAL:
1335600fe468SBarry Smith   case MAT_IGNORE_LOWER_TRIANGULAR:
1336290bbb0aSBarry Smith     ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr);
133777e54ba9SKris Buschelman     break;
1338b5a2b587SKris Buschelman   default:
1339600fe468SBarry Smith     SETERRQ1(PETSC_ERR_SUP,"unknown option %s",MatOptions[op]);
13403a40ed3dSBarry Smith   }
13413a40ed3dSBarry Smith   PetscFunctionReturn(0);
1342289bc588SBarry Smith }
1343289bc588SBarry Smith 
13444a2ae208SSatish Balay #undef __FUNCT__
13454a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense"
1346dfbe8321SBarry Smith PetscErrorCode MatZeroEntries_SeqDense(Mat A)
13476f0a148fSBarry Smith {
1348ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)A->data;
13496849ba73SBarry Smith   PetscErrorCode ierr;
1350d0f46423SBarry Smith   PetscInt       lda=l->lda,m=A->rmap->n,j;
13513a40ed3dSBarry Smith 
13523a40ed3dSBarry Smith   PetscFunctionBegin;
1353a5ce6ee0Svictorle   if (lda>m) {
1354d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1355a5ce6ee0Svictorle       ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
1356a5ce6ee0Svictorle     }
1357a5ce6ee0Svictorle   } else {
1358d0f46423SBarry Smith     ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1359a5ce6ee0Svictorle   }
13603a40ed3dSBarry Smith   PetscFunctionReturn(0);
13616f0a148fSBarry Smith }
13626f0a148fSBarry Smith 
13634a2ae208SSatish Balay #undef __FUNCT__
13644a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense"
1365f4df32b1SMatthew Knepley PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag)
13666f0a148fSBarry Smith {
1367ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)A->data;
1368d0f46423SBarry Smith   PetscInt       n = A->cmap->n,i,j;
136987828ca2SBarry Smith   PetscScalar    *slot;
137055659b69SBarry Smith 
13713a40ed3dSBarry Smith   PetscFunctionBegin;
13726f0a148fSBarry Smith   for (i=0; i<N; i++) {
13736f0a148fSBarry Smith     slot = l->v + rows[i];
13746f0a148fSBarry Smith     for (j=0; j<n; j++) { *slot = 0.0; slot += n;}
13756f0a148fSBarry Smith   }
1376f4df32b1SMatthew Knepley   if (diag != 0.0) {
13776f0a148fSBarry Smith     for (i=0; i<N; i++) {
13786f0a148fSBarry Smith       slot = l->v + (n+1)*rows[i];
1379f4df32b1SMatthew Knepley       *slot = diag;
13806f0a148fSBarry Smith     }
13816f0a148fSBarry Smith   }
13823a40ed3dSBarry Smith   PetscFunctionReturn(0);
13836f0a148fSBarry Smith }
1384557bce09SLois Curfman McInnes 
13854a2ae208SSatish Balay #undef __FUNCT__
13864a2ae208SSatish Balay #define __FUNCT__ "MatGetArray_SeqDense"
1387dfbe8321SBarry Smith PetscErrorCode MatGetArray_SeqDense(Mat A,PetscScalar *array[])
138864e87e97SBarry Smith {
1389c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
13903a40ed3dSBarry Smith 
13913a40ed3dSBarry Smith   PetscFunctionBegin;
1392d0f46423SBarry Smith   if (mat->lda != A->rmap->n) SETERRQ(PETSC_ERR_SUP,"Cannot get array for Dense matrices with LDA different from number of rows");
139364e87e97SBarry Smith   *array = mat->v;
13943a40ed3dSBarry Smith   PetscFunctionReturn(0);
139564e87e97SBarry Smith }
13960754003eSLois Curfman McInnes 
13974a2ae208SSatish Balay #undef __FUNCT__
13984a2ae208SSatish Balay #define __FUNCT__ "MatRestoreArray_SeqDense"
1399dfbe8321SBarry Smith PetscErrorCode MatRestoreArray_SeqDense(Mat A,PetscScalar *array[])
1400ff14e315SSatish Balay {
14013a40ed3dSBarry Smith   PetscFunctionBegin;
140209b544d4SBarry Smith   *array = 0; /* user cannot accidently use the array later */
14033a40ed3dSBarry Smith   PetscFunctionReturn(0);
1404ff14e315SSatish Balay }
14050754003eSLois Curfman McInnes 
14064a2ae208SSatish Balay #undef __FUNCT__
14074a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense"
140813f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B)
14090754003eSLois Curfman McInnes {
1410c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
14116849ba73SBarry Smith   PetscErrorCode ierr;
1412*5d0c19d7SBarry Smith   PetscInt       i,j,nrows,ncols;
1413*5d0c19d7SBarry Smith   const PetscInt *irow,*icol;
141487828ca2SBarry Smith   PetscScalar    *av,*bv,*v = mat->v;
14150754003eSLois Curfman McInnes   Mat            newmat;
14160754003eSLois Curfman McInnes 
14173a40ed3dSBarry Smith   PetscFunctionBegin;
141878b31e54SBarry Smith   ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr);
141978b31e54SBarry Smith   ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr);
1420e03a110bSBarry Smith   ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr);
1421e03a110bSBarry Smith   ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr);
14220754003eSLois Curfman McInnes 
1423182d2002SSatish Balay   /* Check submatrixcall */
1424182d2002SSatish Balay   if (scall == MAT_REUSE_MATRIX) {
142513f74950SBarry Smith     PetscInt n_cols,n_rows;
1426182d2002SSatish Balay     ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr);
142721a2c019SBarry Smith     if (n_rows != nrows || n_cols != ncols) {
142821a2c019SBarry Smith       /* resize the result result matrix to match number of requested rows/columns */
142921a2c019SBarry Smith       ierr = MatSetSizes(*B,nrows,nrows,nrows,nrows);CHKERRQ(ierr);
143021a2c019SBarry Smith     }
1431182d2002SSatish Balay     newmat = *B;
1432182d2002SSatish Balay   } else {
14330754003eSLois Curfman McInnes     /* Create and fill new matrix */
14347adad957SLisandro Dalcin     ierr = MatCreate(((PetscObject)A)->comm,&newmat);CHKERRQ(ierr);
1435f69a0ea3SMatthew Knepley     ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
14367adad957SLisandro Dalcin     ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
14375c5985e7SKris Buschelman     ierr = MatSeqDenseSetPreallocation(newmat,PETSC_NULL);CHKERRQ(ierr);
1438182d2002SSatish Balay   }
1439182d2002SSatish Balay 
1440182d2002SSatish Balay   /* Now extract the data pointers and do the copy,column at a time */
1441182d2002SSatish Balay   bv = ((Mat_SeqDense*)newmat->data)->v;
1442182d2002SSatish Balay 
1443182d2002SSatish Balay   for (i=0; i<ncols; i++) {
14446de62eeeSBarry Smith     av = v + mat->lda*icol[i];
1445182d2002SSatish Balay     for (j=0; j<nrows; j++) {
1446182d2002SSatish Balay       *bv++ = av[irow[j]];
14470754003eSLois Curfman McInnes     }
14480754003eSLois Curfman McInnes   }
1449182d2002SSatish Balay 
1450182d2002SSatish Balay   /* Assemble the matrices so that the correct flags are set */
14516d4a8577SBarry Smith   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
14526d4a8577SBarry Smith   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
14530754003eSLois Curfman McInnes 
14540754003eSLois Curfman McInnes   /* Free work space */
145578b31e54SBarry Smith   ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr);
145678b31e54SBarry Smith   ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr);
1457182d2002SSatish Balay   *B = newmat;
14583a40ed3dSBarry Smith   PetscFunctionReturn(0);
14590754003eSLois Curfman McInnes }
14600754003eSLois Curfman McInnes 
14614a2ae208SSatish Balay #undef __FUNCT__
14624a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense"
146313f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[])
1464905e6a2fSBarry Smith {
14656849ba73SBarry Smith   PetscErrorCode ierr;
146613f74950SBarry Smith   PetscInt       i;
1467905e6a2fSBarry Smith 
14683a40ed3dSBarry Smith   PetscFunctionBegin;
1469905e6a2fSBarry Smith   if (scall == MAT_INITIAL_MATRIX) {
1470b0a32e0cSBarry Smith     ierr = PetscMalloc((n+1)*sizeof(Mat),B);CHKERRQ(ierr);
1471905e6a2fSBarry Smith   }
1472905e6a2fSBarry Smith 
1473905e6a2fSBarry Smith   for (i=0; i<n; i++) {
14746a6a5d1dSBarry Smith     ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr);
1475905e6a2fSBarry Smith   }
14763a40ed3dSBarry Smith   PetscFunctionReturn(0);
1477905e6a2fSBarry Smith }
1478905e6a2fSBarry Smith 
14794a2ae208SSatish Balay #undef __FUNCT__
1480c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense"
1481c0aa2d19SHong Zhang PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode)
1482c0aa2d19SHong Zhang {
1483c0aa2d19SHong Zhang   PetscFunctionBegin;
1484c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1485c0aa2d19SHong Zhang }
1486c0aa2d19SHong Zhang 
1487c0aa2d19SHong Zhang #undef __FUNCT__
1488c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense"
1489c0aa2d19SHong Zhang PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode)
1490c0aa2d19SHong Zhang {
1491c0aa2d19SHong Zhang   PetscFunctionBegin;
1492c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1493c0aa2d19SHong Zhang }
1494c0aa2d19SHong Zhang 
1495c0aa2d19SHong Zhang #undef __FUNCT__
14964a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense"
1497dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str)
14984b0e389bSBarry Smith {
14994b0e389bSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense *)B->data;
15006849ba73SBarry Smith   PetscErrorCode ierr;
1501d0f46423SBarry Smith   PetscInt       lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j;
15023a40ed3dSBarry Smith 
15033a40ed3dSBarry Smith   PetscFunctionBegin;
150433f4a19fSKris Buschelman   /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */
150533f4a19fSKris Buschelman   if (A->ops->copy != B->ops->copy) {
1506cb5b572fSBarry Smith     ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr);
15073a40ed3dSBarry Smith     PetscFunctionReturn(0);
15083a40ed3dSBarry Smith   }
1509d0f46423SBarry Smith   if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"size(B) != size(A)");
1510a5ce6ee0Svictorle   if (lda1>m || lda2>m) {
15110dbb7854Svictorle     for (j=0; j<n; j++) {
1512a5ce6ee0Svictorle       ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr);
1513a5ce6ee0Svictorle     }
1514a5ce6ee0Svictorle   } else {
1515d0f46423SBarry Smith     ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1516a5ce6ee0Svictorle   }
1517273d9f13SBarry Smith   PetscFunctionReturn(0);
1518273d9f13SBarry Smith }
1519273d9f13SBarry Smith 
15204a2ae208SSatish Balay #undef __FUNCT__
15214a2ae208SSatish Balay #define __FUNCT__ "MatSetUpPreallocation_SeqDense"
1522dfbe8321SBarry Smith PetscErrorCode MatSetUpPreallocation_SeqDense(Mat A)
1523273d9f13SBarry Smith {
1524dfbe8321SBarry Smith   PetscErrorCode ierr;
1525273d9f13SBarry Smith 
1526273d9f13SBarry Smith   PetscFunctionBegin;
1527273d9f13SBarry Smith   ierr =  MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr);
15283a40ed3dSBarry Smith   PetscFunctionReturn(0);
15294b0e389bSBarry Smith }
15304b0e389bSBarry Smith 
1531284134d9SBarry Smith #undef __FUNCT__
1532284134d9SBarry Smith #define __FUNCT__ "MatSetSizes_SeqDense"
1533284134d9SBarry Smith PetscErrorCode MatSetSizes_SeqDense(Mat A,PetscInt m,PetscInt n,PetscInt M,PetscInt N)
1534284134d9SBarry Smith {
1535284134d9SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
153621a2c019SBarry Smith   PetscErrorCode ierr;
1537284134d9SBarry Smith   PetscFunctionBegin;
153821a2c019SBarry Smith   /* this will not be called before lda, Mmax,  and Nmax have been set */
1539284134d9SBarry Smith   m = PetscMax(m,M);
1540284134d9SBarry Smith   n = PetscMax(n,N);
154121a2c019SBarry Smith   if (m > a->Mmax) SETERRQ2(PETSC_ERR_SUP,"Cannot yet resize number rows of dense matrix larger then its initial size %d, requested %d",a->lda,(int)m);
1542284134d9SBarry Smith   if (n > a->Nmax) SETERRQ2(PETSC_ERR_SUP,"Cannot yet resize number columns of dense matrix larger then its initial size %d, requested %d",a->Nmax,(int)n);
1543d0f46423SBarry Smith   A->rmap->n = A->rmap->n = m;
1544d0f46423SBarry Smith   A->cmap->n = A->cmap->N = n;
154521a2c019SBarry Smith   if (a->changelda) a->lda = m;
154621a2c019SBarry Smith   ierr = PetscMemzero(a->v,m*n*sizeof(PetscScalar));CHKERRQ(ierr);
1547284134d9SBarry Smith   PetscFunctionReturn(0);
1548284134d9SBarry Smith }
1549170fe5c8SBarry Smith 
1550284134d9SBarry Smith 
1551a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/
1552a9fe9ddaSSatish Balay #undef __FUNCT__
1553a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense"
1554a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1555a9fe9ddaSSatish Balay {
1556a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1557a9fe9ddaSSatish Balay 
1558a9fe9ddaSSatish Balay   PetscFunctionBegin;
1559a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX){
1560a9fe9ddaSSatish Balay     ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
1561a9fe9ddaSSatish Balay   }
1562a9fe9ddaSSatish Balay   ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
1563a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1564a9fe9ddaSSatish Balay }
1565a9fe9ddaSSatish Balay 
1566a9fe9ddaSSatish Balay #undef __FUNCT__
1567a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense"
1568a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1569a9fe9ddaSSatish Balay {
1570ee16a9a1SHong Zhang   PetscErrorCode ierr;
1571d0f46423SBarry Smith   PetscInt       m=A->rmap->n,n=B->cmap->n;
1572ee16a9a1SHong Zhang   Mat            Cmat;
1573a9fe9ddaSSatish Balay 
1574ee16a9a1SHong Zhang   PetscFunctionBegin;
1575d0f46423SBarry Smith   if (A->cmap->n != B->rmap->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"A->cmap->n %d != B->rmap->n %d\n",A->cmap->n,B->rmap->n);
1576ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1577ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1578ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
1579ee16a9a1SHong Zhang   ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr);
1580ee16a9a1SHong Zhang   Cmat->assembled = PETSC_TRUE;
1581ee16a9a1SHong Zhang   *C = Cmat;
1582ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1583ee16a9a1SHong Zhang }
1584a9fe9ddaSSatish Balay 
158598a3b096SSatish Balay #undef __FUNCT__
1586a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense"
1587a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1588a9fe9ddaSSatish Balay {
1589a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1590a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1591a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
15920805154bSBarry Smith   PetscBLASInt   m,n,k;
1593a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1594a9fe9ddaSSatish Balay 
1595a9fe9ddaSSatish Balay   PetscFunctionBegin;
1596d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
1597d0f46423SBarry Smith   n = PetscBLASIntCast(B->cmap->n);
1598d0f46423SBarry Smith   k = PetscBLASIntCast(A->cmap->n);
1599a9fe9ddaSSatish Balay   BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda);
1600a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1601a9fe9ddaSSatish Balay }
1602a9fe9ddaSSatish Balay 
1603a9fe9ddaSSatish Balay #undef __FUNCT__
1604a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultTranspose_SeqDense_SeqDense"
1605a9fe9ddaSSatish Balay PetscErrorCode MatMatMultTranspose_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1606a9fe9ddaSSatish Balay {
1607a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1608a9fe9ddaSSatish Balay 
1609a9fe9ddaSSatish Balay   PetscFunctionBegin;
1610a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX){
1611a9fe9ddaSSatish Balay     ierr = MatMatMultTransposeSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
1612a9fe9ddaSSatish Balay   }
1613a9fe9ddaSSatish Balay   ierr = MatMatMultTransposeNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
1614a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1615a9fe9ddaSSatish Balay }
1616a9fe9ddaSSatish Balay 
1617a9fe9ddaSSatish Balay #undef __FUNCT__
1618a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultTransposeSymbolic_SeqDense_SeqDense"
1619a9fe9ddaSSatish Balay PetscErrorCode MatMatMultTransposeSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1620a9fe9ddaSSatish Balay {
1621ee16a9a1SHong Zhang   PetscErrorCode ierr;
1622d0f46423SBarry Smith   PetscInt       m=A->cmap->n,n=B->cmap->n;
1623ee16a9a1SHong Zhang   Mat            Cmat;
1624a9fe9ddaSSatish Balay 
1625ee16a9a1SHong Zhang   PetscFunctionBegin;
1626d0f46423SBarry Smith   if (A->rmap->n != B->rmap->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"A->rmap->n %d != B->rmap->n %d\n",A->rmap->n,B->rmap->n);
1627ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1628ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1629ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
1630ee16a9a1SHong Zhang   ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr);
1631ee16a9a1SHong Zhang   Cmat->assembled = PETSC_TRUE;
1632ee16a9a1SHong Zhang   *C = Cmat;
1633ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1634ee16a9a1SHong Zhang }
1635a9fe9ddaSSatish Balay 
1636a9fe9ddaSSatish Balay #undef __FUNCT__
1637a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultTransposeNumeric_SeqDense_SeqDense"
1638a9fe9ddaSSatish Balay PetscErrorCode MatMatMultTransposeNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1639a9fe9ddaSSatish Balay {
1640a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1641a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1642a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
16430805154bSBarry Smith   PetscBLASInt   m,n,k;
1644a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1645a9fe9ddaSSatish Balay 
1646a9fe9ddaSSatish Balay   PetscFunctionBegin;
1647d0f46423SBarry Smith   m = PetscBLASIntCast(A->cmap->n);
1648d0f46423SBarry Smith   n = PetscBLASIntCast(B->cmap->n);
1649d0f46423SBarry Smith   k = PetscBLASIntCast(A->rmap->n);
16502fbe02b9SBarry Smith   /*
16512fbe02b9SBarry Smith      Note the m and n arguments below are the number rows and columns of A', not A!
16522fbe02b9SBarry Smith   */
1653a9fe9ddaSSatish Balay   BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda);
1654a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1655a9fe9ddaSSatish Balay }
1656985db425SBarry Smith 
1657985db425SBarry Smith #undef __FUNCT__
1658985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense"
1659985db425SBarry Smith PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[])
1660985db425SBarry Smith {
1661985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1662985db425SBarry Smith   PetscErrorCode ierr;
1663d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1664985db425SBarry Smith   PetscScalar    *x;
1665985db425SBarry Smith   MatScalar      *aa = a->v;
1666985db425SBarry Smith 
1667985db425SBarry Smith   PetscFunctionBegin;
1668985db425SBarry Smith   if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1669985db425SBarry Smith 
1670985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1671985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1672985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1673d0f46423SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1674985db425SBarry Smith   for (i=0; i<m; i++) {
1675985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1676985db425SBarry Smith     for (j=1; j<n; j++){
1677985db425SBarry Smith       if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1678985db425SBarry Smith     }
1679985db425SBarry Smith   }
1680985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1681985db425SBarry Smith   PetscFunctionReturn(0);
1682985db425SBarry Smith }
1683985db425SBarry Smith 
1684985db425SBarry Smith #undef __FUNCT__
1685985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense"
1686985db425SBarry Smith PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[])
1687985db425SBarry Smith {
1688985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1689985db425SBarry Smith   PetscErrorCode ierr;
1690d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1691985db425SBarry Smith   PetscScalar    *x;
1692985db425SBarry Smith   PetscReal      atmp;
1693985db425SBarry Smith   MatScalar      *aa = a->v;
1694985db425SBarry Smith 
1695985db425SBarry Smith   PetscFunctionBegin;
1696985db425SBarry Smith   if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1697985db425SBarry Smith 
1698985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1699985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1700985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1701d0f46423SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1702985db425SBarry Smith   for (i=0; i<m; i++) {
17039189402eSHong Zhang     x[i] = PetscAbsScalar(aa[i]);
1704985db425SBarry Smith     for (j=1; j<n; j++){
1705985db425SBarry Smith       atmp = PetscAbsScalar(aa[i+m*j]);
1706985db425SBarry Smith       if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;}
1707985db425SBarry Smith     }
1708985db425SBarry Smith   }
1709985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1710985db425SBarry Smith   PetscFunctionReturn(0);
1711985db425SBarry Smith }
1712985db425SBarry Smith 
1713985db425SBarry Smith #undef __FUNCT__
1714985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense"
1715985db425SBarry Smith PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[])
1716985db425SBarry Smith {
1717985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1718985db425SBarry Smith   PetscErrorCode ierr;
1719d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1720985db425SBarry Smith   PetscScalar    *x;
1721985db425SBarry Smith   MatScalar      *aa = a->v;
1722985db425SBarry Smith 
1723985db425SBarry Smith   PetscFunctionBegin;
1724985db425SBarry Smith   if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1725985db425SBarry Smith 
1726985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1727985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1728985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1729d0f46423SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1730985db425SBarry Smith   for (i=0; i<m; i++) {
1731985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1732985db425SBarry Smith     for (j=1; j<n; j++){
1733985db425SBarry Smith       if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1734985db425SBarry Smith     }
1735985db425SBarry Smith   }
1736985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1737985db425SBarry Smith   PetscFunctionReturn(0);
1738985db425SBarry Smith }
1739985db425SBarry Smith 
17408d0534beSBarry Smith #undef __FUNCT__
17418d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense"
17428d0534beSBarry Smith PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col)
17438d0534beSBarry Smith {
17448d0534beSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
17458d0534beSBarry Smith   PetscErrorCode ierr;
17468d0534beSBarry Smith   PetscScalar    *x;
17478d0534beSBarry Smith 
17488d0534beSBarry Smith   PetscFunctionBegin;
17498d0534beSBarry Smith   if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
17508d0534beSBarry Smith 
17518d0534beSBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1752d0f46423SBarry Smith   ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
17538d0534beSBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
17548d0534beSBarry Smith   PetscFunctionReturn(0);
17558d0534beSBarry Smith }
17568d0534beSBarry Smith 
1757289bc588SBarry Smith /* -------------------------------------------------------------------*/
1758a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = {MatSetValues_SeqDense,
1759905e6a2fSBarry Smith        MatGetRow_SeqDense,
1760905e6a2fSBarry Smith        MatRestoreRow_SeqDense,
1761905e6a2fSBarry Smith        MatMult_SeqDense,
176297304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense,
17637c922b88SBarry Smith        MatMultTranspose_SeqDense,
17647c922b88SBarry Smith        MatMultTransposeAdd_SeqDense,
1765db4efbfdSBarry Smith        0,
1766db4efbfdSBarry Smith        0,
1767db4efbfdSBarry Smith        0,
1768db4efbfdSBarry Smith /*10*/ 0,
1769905e6a2fSBarry Smith        MatLUFactor_SeqDense,
1770905e6a2fSBarry Smith        MatCholeskyFactor_SeqDense,
1771ec8511deSBarry Smith        MatRelax_SeqDense,
1772ec8511deSBarry Smith        MatTranspose_SeqDense,
177397304618SKris Buschelman /*15*/ MatGetInfo_SeqDense,
1774905e6a2fSBarry Smith        MatEqual_SeqDense,
1775905e6a2fSBarry Smith        MatGetDiagonal_SeqDense,
1776905e6a2fSBarry Smith        MatDiagonalScale_SeqDense,
1777905e6a2fSBarry Smith        MatNorm_SeqDense,
1778c0aa2d19SHong Zhang /*20*/ MatAssemblyBegin_SeqDense,
1779c0aa2d19SHong Zhang        MatAssemblyEnd_SeqDense,
1780905e6a2fSBarry Smith        0,
1781905e6a2fSBarry Smith        MatSetOption_SeqDense,
1782905e6a2fSBarry Smith        MatZeroEntries_SeqDense,
178397304618SKris Buschelman /*25*/ MatZeroRows_SeqDense,
1784db4efbfdSBarry Smith        0,
1785db4efbfdSBarry Smith        0,
1786db4efbfdSBarry Smith        0,
1787db4efbfdSBarry Smith        0,
178897304618SKris Buschelman /*30*/ MatSetUpPreallocation_SeqDense,
1789273d9f13SBarry Smith        0,
1790905e6a2fSBarry Smith        0,
1791905e6a2fSBarry Smith        MatGetArray_SeqDense,
1792905e6a2fSBarry Smith        MatRestoreArray_SeqDense,
179397304618SKris Buschelman /*35*/ MatDuplicate_SeqDense,
1794a5ae1ecdSBarry Smith        0,
1795a5ae1ecdSBarry Smith        0,
1796a5ae1ecdSBarry Smith        0,
1797a5ae1ecdSBarry Smith        0,
179897304618SKris Buschelman /*40*/ MatAXPY_SeqDense,
1799a5ae1ecdSBarry Smith        MatGetSubMatrices_SeqDense,
1800a5ae1ecdSBarry Smith        0,
18014b0e389bSBarry Smith        MatGetValues_SeqDense,
1802a5ae1ecdSBarry Smith        MatCopy_SeqDense,
1803985db425SBarry Smith /*45*/ MatGetRowMax_SeqDense,
1804a5ae1ecdSBarry Smith        MatScale_SeqDense,
1805a5ae1ecdSBarry Smith        0,
1806a5ae1ecdSBarry Smith        0,
1807a5ae1ecdSBarry Smith        0,
1808521d7252SBarry Smith /*50*/ 0,
1809a5ae1ecdSBarry Smith        0,
1810a5ae1ecdSBarry Smith        0,
1811a5ae1ecdSBarry Smith        0,
1812a5ae1ecdSBarry Smith        0,
181397304618SKris Buschelman /*55*/ 0,
1814a5ae1ecdSBarry Smith        0,
1815a5ae1ecdSBarry Smith        0,
1816a5ae1ecdSBarry Smith        0,
1817a5ae1ecdSBarry Smith        0,
181897304618SKris Buschelman /*60*/ 0,
1819e03a110bSBarry Smith        MatDestroy_SeqDense,
1820e03a110bSBarry Smith        MatView_SeqDense,
1821357abbc8SBarry Smith        0,
182297304618SKris Buschelman        0,
182397304618SKris Buschelman /*65*/ 0,
182497304618SKris Buschelman        0,
182597304618SKris Buschelman        0,
182697304618SKris Buschelman        0,
182797304618SKris Buschelman        0,
1828985db425SBarry Smith /*70*/ MatGetRowMaxAbs_SeqDense,
182997304618SKris Buschelman        0,
183097304618SKris Buschelman        0,
183197304618SKris Buschelman        0,
183297304618SKris Buschelman        0,
183397304618SKris Buschelman /*75*/ 0,
183497304618SKris Buschelman        0,
183597304618SKris Buschelman        0,
183697304618SKris Buschelman        0,
183797304618SKris Buschelman        0,
183897304618SKris Buschelman /*80*/ 0,
183997304618SKris Buschelman        0,
184097304618SKris Buschelman        0,
184197304618SKris Buschelman        0,
1842865e5f61SKris Buschelman /*84*/ MatLoad_SeqDense,
1843865e5f61SKris Buschelman        0,
18441cbb95d3SBarry Smith        MatIsHermitian_SeqDense,
1845865e5f61SKris Buschelman        0,
1846865e5f61SKris Buschelman        0,
1847865e5f61SKris Buschelman        0,
1848a9fe9ddaSSatish Balay /*90*/ MatMatMult_SeqDense_SeqDense,
1849a9fe9ddaSSatish Balay        MatMatMultSymbolic_SeqDense_SeqDense,
1850a9fe9ddaSSatish Balay        MatMatMultNumeric_SeqDense_SeqDense,
1851865e5f61SKris Buschelman        0,
1852865e5f61SKris Buschelman        0,
1853865e5f61SKris Buschelman /*95*/ 0,
1854a9fe9ddaSSatish Balay        MatMatMultTranspose_SeqDense_SeqDense,
1855a9fe9ddaSSatish Balay        MatMatMultTransposeSymbolic_SeqDense_SeqDense,
1856a9fe9ddaSSatish Balay        MatMatMultTransposeNumeric_SeqDense_SeqDense,
1857284134d9SBarry Smith        0,
1858284134d9SBarry Smith /*100*/0,
1859284134d9SBarry Smith        0,
1860284134d9SBarry Smith        0,
1861284134d9SBarry Smith        0,
1862985db425SBarry Smith        MatSetSizes_SeqDense,
1863985db425SBarry Smith        0,
1864985db425SBarry Smith        0,
1865985db425SBarry Smith        0,
1866985db425SBarry Smith        0,
1867985db425SBarry Smith        0,
1868985db425SBarry Smith /*110*/0,
1869985db425SBarry Smith        0,
18708d0534beSBarry Smith        MatGetRowMin_SeqDense,
18718d0534beSBarry Smith        MatGetColumnVector_SeqDense
1872985db425SBarry Smith };
187390ace30eSBarry Smith 
18744a2ae208SSatish Balay #undef __FUNCT__
18754a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense"
18764b828684SBarry Smith /*@C
1877fafbff53SBarry Smith    MatCreateSeqDense - Creates a sequential dense matrix that
1878d65003e9SLois Curfman McInnes    is stored in column major order (the usual Fortran 77 manner). Many
1879d65003e9SLois Curfman McInnes    of the matrix operations use the BLAS and LAPACK routines.
1880289bc588SBarry Smith 
1881db81eaa0SLois Curfman McInnes    Collective on MPI_Comm
1882db81eaa0SLois Curfman McInnes 
188320563c6bSBarry Smith    Input Parameters:
1884db81eaa0SLois Curfman McInnes +  comm - MPI communicator, set to PETSC_COMM_SELF
18850c775827SLois Curfman McInnes .  m - number of rows
188618f449edSLois Curfman McInnes .  n - number of columns
1887db81eaa0SLois Curfman McInnes -  data - optional location of matrix data.  Set data=PETSC_NULL for PETSc
1888dfc5480cSLois Curfman McInnes    to control all matrix memory allocation.
188920563c6bSBarry Smith 
189020563c6bSBarry Smith    Output Parameter:
189144cd7ae7SLois Curfman McInnes .  A - the matrix
189220563c6bSBarry Smith 
1893b259b22eSLois Curfman McInnes    Notes:
189418f449edSLois Curfman McInnes    The data input variable is intended primarily for Fortran programmers
189518f449edSLois Curfman McInnes    who wish to allocate their own matrix memory space.  Most users should
1896b4fd4287SBarry Smith    set data=PETSC_NULL.
189718f449edSLois Curfman McInnes 
1898027ccd11SLois Curfman McInnes    Level: intermediate
1899027ccd11SLois Curfman McInnes 
1900dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS
1901d65003e9SLois Curfman McInnes 
1902db81eaa0SLois Curfman McInnes .seealso: MatCreate(), MatCreateMPIDense(), MatSetValues()
190320563c6bSBarry Smith @*/
1904be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A)
1905289bc588SBarry Smith {
1906dfbe8321SBarry Smith   PetscErrorCode ierr;
19073b2fbd54SBarry Smith 
19083a40ed3dSBarry Smith   PetscFunctionBegin;
1909f69a0ea3SMatthew Knepley   ierr = MatCreate(comm,A);CHKERRQ(ierr);
1910f69a0ea3SMatthew Knepley   ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr);
1911273d9f13SBarry Smith   ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr);
1912273d9f13SBarry Smith   ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr);
1913273d9f13SBarry Smith   PetscFunctionReturn(0);
1914273d9f13SBarry Smith }
1915273d9f13SBarry Smith 
19164a2ae208SSatish Balay #undef __FUNCT__
1917afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation"
1918273d9f13SBarry Smith /*@C
1919273d9f13SBarry Smith    MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements
1920273d9f13SBarry Smith 
1921273d9f13SBarry Smith    Collective on MPI_Comm
1922273d9f13SBarry Smith 
1923273d9f13SBarry Smith    Input Parameters:
1924273d9f13SBarry Smith +  A - the matrix
1925273d9f13SBarry Smith -  data - the array (or PETSC_NULL)
1926273d9f13SBarry Smith 
1927273d9f13SBarry Smith    Notes:
1928273d9f13SBarry Smith    The data input variable is intended primarily for Fortran programmers
1929273d9f13SBarry Smith    who wish to allocate their own matrix memory space.  Most users should
1930284134d9SBarry Smith    need not call this routine.
1931273d9f13SBarry Smith 
1932273d9f13SBarry Smith    Level: intermediate
1933273d9f13SBarry Smith 
1934273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS
1935273d9f13SBarry Smith 
1936273d9f13SBarry Smith .seealso: MatCreate(), MatCreateMPIDense(), MatSetValues()
1937273d9f13SBarry Smith @*/
1938be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatSeqDenseSetPreallocation(Mat B,PetscScalar data[])
1939273d9f13SBarry Smith {
1940dfbe8321SBarry Smith   PetscErrorCode ierr,(*f)(Mat,PetscScalar[]);
1941a23d5eceSKris Buschelman 
1942a23d5eceSKris Buschelman   PetscFunctionBegin;
1943a23d5eceSKris Buschelman   ierr = PetscObjectQueryFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",(void (**)(void))&f);CHKERRQ(ierr);
1944a23d5eceSKris Buschelman   if (f) {
1945a23d5eceSKris Buschelman     ierr = (*f)(B,data);CHKERRQ(ierr);
1946a23d5eceSKris Buschelman   }
1947a23d5eceSKris Buschelman   PetscFunctionReturn(0);
1948a23d5eceSKris Buschelman }
1949a23d5eceSKris Buschelman 
1950a23d5eceSKris Buschelman EXTERN_C_BEGIN
1951a23d5eceSKris Buschelman #undef __FUNCT__
1952afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense"
1953be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data)
1954a23d5eceSKris Buschelman {
1955273d9f13SBarry Smith   Mat_SeqDense   *b;
1956dfbe8321SBarry Smith   PetscErrorCode ierr;
1957273d9f13SBarry Smith 
1958273d9f13SBarry Smith   PetscFunctionBegin;
1959273d9f13SBarry Smith   B->preallocated = PETSC_TRUE;
1960273d9f13SBarry Smith   b               = (Mat_SeqDense*)B->data;
1961d0f46423SBarry Smith   if (b->lda <= 0) b->lda = B->rmap->n;
19629e8f95c4SLisandro Dalcin   if (!data) { /* petsc-allocated storage */
19639e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
19645afd5e0cSBarry Smith     ierr = PetscMalloc(b->lda*b->Nmax*sizeof(PetscScalar),&b->v);CHKERRQ(ierr);
1965284134d9SBarry Smith     ierr = PetscMemzero(b->v,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
1966284134d9SBarry Smith     ierr = PetscLogObjectMemory(B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
19679e8f95c4SLisandro Dalcin     b->user_alloc = PETSC_FALSE;
1968273d9f13SBarry Smith   } else { /* user-allocated storage */
19699e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
1970273d9f13SBarry Smith     b->v          = data;
1971273d9f13SBarry Smith     b->user_alloc = PETSC_TRUE;
1972273d9f13SBarry Smith   }
1973273d9f13SBarry Smith   PetscFunctionReturn(0);
1974273d9f13SBarry Smith }
1975a23d5eceSKris Buschelman EXTERN_C_END
1976273d9f13SBarry Smith 
19771b807ce4Svictorle #undef __FUNCT__
19781b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA"
19791b807ce4Svictorle /*@C
19801b807ce4Svictorle   MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array
19811b807ce4Svictorle 
19821b807ce4Svictorle   Input parameter:
19831b807ce4Svictorle + A - the matrix
19841b807ce4Svictorle - lda - the leading dimension
19851b807ce4Svictorle 
19861b807ce4Svictorle   Notes:
19871b807ce4Svictorle   This routine is to be used in conjunction with MatSeqDenseSetPreallocation;
19881b807ce4Svictorle   it asserts that the preallocation has a leading dimension (the LDA parameter
19891b807ce4Svictorle   of Blas and Lapack fame) larger than M, the first dimension of the matrix.
19901b807ce4Svictorle 
19911b807ce4Svictorle   Level: intermediate
19921b807ce4Svictorle 
19931b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS
19941b807ce4Svictorle 
1995284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize()
19961b807ce4Svictorle @*/
1997be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatSeqDenseSetLDA(Mat B,PetscInt lda)
19981b807ce4Svictorle {
19991b807ce4Svictorle   Mat_SeqDense *b = (Mat_SeqDense*)B->data;
200021a2c019SBarry Smith 
20011b807ce4Svictorle   PetscFunctionBegin;
2002d0f46423SBarry Smith   if (lda < B->rmap->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"LDA %D must be at least matrix dimension %D",lda,B->rmap->n);
20031b807ce4Svictorle   b->lda       = lda;
200421a2c019SBarry Smith   b->changelda = PETSC_FALSE;
200521a2c019SBarry Smith   b->Mmax      = PetscMax(b->Mmax,lda);
20061b807ce4Svictorle   PetscFunctionReturn(0);
20071b807ce4Svictorle }
20081b807ce4Svictorle 
20090bad9183SKris Buschelman /*MC
2010fafad747SKris Buschelman    MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices.
20110bad9183SKris Buschelman 
20120bad9183SKris Buschelman    Options Database Keys:
20130bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions()
20140bad9183SKris Buschelman 
20150bad9183SKris Buschelman   Level: beginner
20160bad9183SKris Buschelman 
201789665df3SBarry Smith .seealso: MatCreateSeqDense()
201889665df3SBarry Smith 
20190bad9183SKris Buschelman M*/
20200bad9183SKris Buschelman 
2021273d9f13SBarry Smith EXTERN_C_BEGIN
20224a2ae208SSatish Balay #undef __FUNCT__
20234a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense"
2024be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatCreate_SeqDense(Mat B)
2025273d9f13SBarry Smith {
2026273d9f13SBarry Smith   Mat_SeqDense   *b;
2027dfbe8321SBarry Smith   PetscErrorCode ierr;
20287c334f02SBarry Smith   PetscMPIInt    size;
2029273d9f13SBarry Smith 
2030273d9f13SBarry Smith   PetscFunctionBegin;
20317adad957SLisandro Dalcin   ierr = MPI_Comm_size(((PetscObject)B)->comm,&size);CHKERRQ(ierr);
203229bbc08cSBarry Smith   if (size > 1) SETERRQ(PETSC_ERR_ARG_WRONG,"Comm must be of size 1");
203355659b69SBarry Smith 
2034d0f46423SBarry Smith   B->rmap->bs = B->cmap->bs = 1;
2035d0f46423SBarry Smith   ierr = PetscMapSetUp(B->rmap);CHKERRQ(ierr);
2036d0f46423SBarry Smith   ierr = PetscMapSetUp(B->cmap);CHKERRQ(ierr);
2037273d9f13SBarry Smith 
203838f2d2fdSLisandro Dalcin   ierr            = PetscNewLog(B,Mat_SeqDense,&b);CHKERRQ(ierr);
2039549d3d68SSatish Balay   ierr            = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr);
204090f02eecSBarry Smith   B->mapping      = 0;
204144cd7ae7SLois Curfman McInnes   B->data         = (void*)b;
204218f449edSLois Curfman McInnes 
2043a5ae1ecdSBarry Smith 
204444cd7ae7SLois Curfman McInnes   b->pivots       = 0;
2045273d9f13SBarry Smith   b->roworiented  = PETSC_TRUE;
2046273d9f13SBarry Smith   b->v            = 0;
2047d0f46423SBarry Smith   b->lda          = B->rmap->n;
204821a2c019SBarry Smith   b->changelda    = PETSC_FALSE;
2049d0f46423SBarry Smith   b->Mmax         = B->rmap->n;
2050d0f46423SBarry Smith   b->Nmax         = B->cmap->n;
20514e220ebcSLois Curfman McInnes 
2052b24902e0SBarry Smith 
2053b24902e0SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatGetFactor_seqdense_petsc_C",
2054b24902e0SBarry Smith                                      "MatGetFactor_seqdense_petsc",
2055b24902e0SBarry Smith                                       MatGetFactor_seqdense_petsc);CHKERRQ(ierr);
2056a23d5eceSKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatSeqDenseSetPreallocation_C",
2057a23d5eceSKris Buschelman                                     "MatSeqDenseSetPreallocation_SeqDense",
2058a23d5eceSKris Buschelman                                      MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr);
20594ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMult_seqaij_seqdense_C",
20604ae313f4SHong Zhang                                      "MatMatMult_SeqAIJ_SeqDense",
20614ae313f4SHong Zhang                                       MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
20624ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",
20634ae313f4SHong Zhang                                      "MatMatMultSymbolic_SeqAIJ_SeqDense",
20644ae313f4SHong Zhang                                       MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
20654ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",
20664ae313f4SHong Zhang                                      "MatMatMultNumeric_SeqAIJ_SeqDense",
20674ae313f4SHong Zhang                                       MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
206817667f90SBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr);
20693a40ed3dSBarry Smith   PetscFunctionReturn(0);
2070289bc588SBarry Smith }
2071c0aa2d19SHong Zhang 
2072c0aa2d19SHong Zhang 
2073273d9f13SBarry Smith EXTERN_C_END
2074