xref: /petsc/src/mat/impls/dense/seq/dense.c (revision c6db04a5321582041def2b1e244c75985478b3ef)
1be1d678aSKris Buschelman 
267e560aaSBarry Smith /*
367e560aaSBarry Smith      Defines the basic matrix operations for sequential dense.
467e560aaSBarry Smith */
5289bc588SBarry Smith 
6*c6db04a5SJed Brown #include <../src/mat/impls/dense/seq/dense.h>
7*c6db04a5SJed Brown #include <petscblaslapack.h>
8289bc588SBarry Smith 
94a2ae208SSatish Balay #undef __FUNCT__
104a2ae208SSatish Balay #define __FUNCT__ "MatAXPY_SeqDense"
11f4df32b1SMatthew Knepley PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str)
121987afe7SBarry Smith {
131987afe7SBarry Smith   Mat_SeqDense   *x = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data;
14f4df32b1SMatthew Knepley   PetscScalar    oalpha = alpha;
1513f74950SBarry Smith   PetscInt       j;
160805154bSBarry Smith   PetscBLASInt   N,m,ldax,lday,one = 1;
17efee365bSSatish Balay   PetscErrorCode ierr;
183a40ed3dSBarry Smith 
193a40ed3dSBarry Smith   PetscFunctionBegin;
20d0f46423SBarry Smith   N    = PetscBLASIntCast(X->rmap->n*X->cmap->n);
21d0f46423SBarry Smith   m    = PetscBLASIntCast(X->rmap->n);
220805154bSBarry Smith   ldax = PetscBLASIntCast(x->lda);
230805154bSBarry Smith   lday = PetscBLASIntCast(y->lda);
24a5ce6ee0Svictorle   if (ldax>m || lday>m) {
25d0f46423SBarry Smith     for (j=0; j<X->cmap->n; j++) {
26f4df32b1SMatthew Knepley       BLASaxpy_(&m,&oalpha,x->v+j*ldax,&one,y->v+j*lday,&one);
27a5ce6ee0Svictorle     }
28a5ce6ee0Svictorle   } else {
29f4df32b1SMatthew Knepley     BLASaxpy_(&N,&oalpha,x->v,&one,y->v,&one);
30a5ce6ee0Svictorle   }
310450473dSBarry Smith   ierr = PetscLogFlops(PetscMax(2*N-1,0));CHKERRQ(ierr);
323a40ed3dSBarry Smith   PetscFunctionReturn(0);
331987afe7SBarry Smith }
341987afe7SBarry Smith 
354a2ae208SSatish Balay #undef __FUNCT__
364a2ae208SSatish Balay #define __FUNCT__ "MatGetInfo_SeqDense"
37dfbe8321SBarry Smith PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info)
38289bc588SBarry Smith {
39d0f46423SBarry Smith   PetscInt     N = A->rmap->n*A->cmap->n;
403a40ed3dSBarry Smith 
413a40ed3dSBarry Smith   PetscFunctionBegin;
424e220ebcSLois Curfman McInnes   info->block_size        = 1.0;
434e220ebcSLois Curfman McInnes   info->nz_allocated      = (double)N;
446de62eeeSBarry Smith   info->nz_used           = (double)N;
456de62eeeSBarry Smith   info->nz_unneeded       = (double)0;
464e220ebcSLois Curfman McInnes   info->assemblies        = (double)A->num_ass;
474e220ebcSLois Curfman McInnes   info->mallocs           = 0;
487adad957SLisandro Dalcin   info->memory            = ((PetscObject)A)->mem;
494e220ebcSLois Curfman McInnes   info->fill_ratio_given  = 0;
504e220ebcSLois Curfman McInnes   info->fill_ratio_needed = 0;
514e220ebcSLois Curfman McInnes   info->factor_mallocs    = 0;
523a40ed3dSBarry Smith   PetscFunctionReturn(0);
53289bc588SBarry Smith }
54289bc588SBarry Smith 
554a2ae208SSatish Balay #undef __FUNCT__
564a2ae208SSatish Balay #define __FUNCT__ "MatScale_SeqDense"
57f4df32b1SMatthew Knepley PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha)
5880cd9d93SLois Curfman McInnes {
59273d9f13SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
60f4df32b1SMatthew Knepley   PetscScalar    oalpha = alpha;
61efee365bSSatish Balay   PetscErrorCode ierr;
620805154bSBarry Smith   PetscBLASInt   one = 1,j,nz,lda = PetscBLASIntCast(a->lda);
6380cd9d93SLois Curfman McInnes 
643a40ed3dSBarry Smith   PetscFunctionBegin;
65d0f46423SBarry Smith   if (lda>A->rmap->n) {
66d0f46423SBarry Smith     nz = PetscBLASIntCast(A->rmap->n);
67d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
68f4df32b1SMatthew Knepley       BLASscal_(&nz,&oalpha,a->v+j*lda,&one);
69a5ce6ee0Svictorle     }
70a5ce6ee0Svictorle   } else {
71d0f46423SBarry Smith     nz = PetscBLASIntCast(A->rmap->n*A->cmap->n);
72f4df32b1SMatthew Knepley     BLASscal_(&nz,&oalpha,a->v,&one);
73a5ce6ee0Svictorle   }
74efee365bSSatish Balay   ierr = PetscLogFlops(nz);CHKERRQ(ierr);
753a40ed3dSBarry Smith   PetscFunctionReturn(0);
7680cd9d93SLois Curfman McInnes }
7780cd9d93SLois Curfman McInnes 
781cbb95d3SBarry Smith #undef __FUNCT__
791cbb95d3SBarry Smith #define __FUNCT__ "MatIsHermitian_SeqDense"
80ace3abfcSBarry Smith PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscBool  *fl)
811cbb95d3SBarry Smith {
821cbb95d3SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
83d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,N;
841cbb95d3SBarry Smith   PetscScalar    *v = a->v;
851cbb95d3SBarry Smith 
861cbb95d3SBarry Smith   PetscFunctionBegin;
871cbb95d3SBarry Smith   *fl = PETSC_FALSE;
88d0f46423SBarry Smith   if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0);
891cbb95d3SBarry Smith   N = a->lda;
901cbb95d3SBarry Smith 
911cbb95d3SBarry Smith   for (i=0; i<m; i++) {
921cbb95d3SBarry Smith     for (j=i+1; j<m; j++) {
931cbb95d3SBarry Smith       if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) PetscFunctionReturn(0);
941cbb95d3SBarry Smith     }
951cbb95d3SBarry Smith   }
961cbb95d3SBarry Smith   *fl = PETSC_TRUE;
971cbb95d3SBarry Smith   PetscFunctionReturn(0);
981cbb95d3SBarry Smith }
991cbb95d3SBarry Smith 
100b24902e0SBarry Smith #undef __FUNCT__
101b24902e0SBarry Smith #define __FUNCT__ "MatDuplicateNoCreate_SeqDense"
102719d5645SBarry Smith PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat newi,Mat A,MatDuplicateOption cpvalues)
103b24902e0SBarry Smith {
104b24902e0SBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data,*l;
105b24902e0SBarry Smith   PetscErrorCode ierr;
106b24902e0SBarry Smith   PetscInt       lda = (PetscInt)mat->lda,j,m;
107b24902e0SBarry Smith 
108b24902e0SBarry Smith   PetscFunctionBegin;
109719d5645SBarry Smith   ierr = MatSeqDenseSetPreallocation(newi,PETSC_NULL);CHKERRQ(ierr);
110b24902e0SBarry Smith   if (cpvalues == MAT_COPY_VALUES) {
111b24902e0SBarry Smith     l = (Mat_SeqDense*)newi->data;
112d0f46423SBarry Smith     if (lda>A->rmap->n) {
113d0f46423SBarry Smith       m = A->rmap->n;
114d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
115b24902e0SBarry Smith 	ierr = PetscMemcpy(l->v+j*m,mat->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
116b24902e0SBarry Smith       }
117b24902e0SBarry Smith     } else {
118d0f46423SBarry Smith       ierr = PetscMemcpy(l->v,mat->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
119b24902e0SBarry Smith     }
120b24902e0SBarry Smith   }
121b24902e0SBarry Smith   newi->assembled = PETSC_TRUE;
122b24902e0SBarry Smith   PetscFunctionReturn(0);
123b24902e0SBarry Smith }
124b24902e0SBarry Smith 
1254a2ae208SSatish Balay #undef __FUNCT__
1264a2ae208SSatish Balay #define __FUNCT__ "MatDuplicate_SeqDense"
127dfbe8321SBarry Smith PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat)
12802cad45dSBarry Smith {
1296849ba73SBarry Smith   PetscErrorCode ierr;
13002cad45dSBarry Smith 
1313a40ed3dSBarry Smith   PetscFunctionBegin;
1325c9eb25fSBarry Smith   ierr = MatCreate(((PetscObject)A)->comm,newmat);CHKERRQ(ierr);
133d0f46423SBarry Smith   ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
1345c9eb25fSBarry Smith   ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
135719d5645SBarry Smith   ierr = MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues);CHKERRQ(ierr);
136b24902e0SBarry Smith   PetscFunctionReturn(0);
137b24902e0SBarry Smith }
138b24902e0SBarry Smith 
1396ee01492SSatish Balay 
1400481f469SBarry Smith extern PetscErrorCode MatLUFactor_SeqDense(Mat,IS,IS,const MatFactorInfo*);
141719d5645SBarry Smith 
1424a2ae208SSatish Balay #undef __FUNCT__
1434a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorNumeric_SeqDense"
1440481f469SBarry Smith PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
145289bc588SBarry Smith {
1464482741eSBarry Smith   MatFactorInfo  info;
147a093e273SMatthew Knepley   PetscErrorCode ierr;
1483a40ed3dSBarry Smith 
1493a40ed3dSBarry Smith   PetscFunctionBegin;
150c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
151719d5645SBarry Smith   ierr = MatLUFactor_SeqDense(fact,0,0,&info);CHKERRQ(ierr);
1523a40ed3dSBarry Smith   PetscFunctionReturn(0);
153289bc588SBarry Smith }
1546ee01492SSatish Balay 
1550b4b3355SBarry Smith #undef __FUNCT__
1564a2ae208SSatish Balay #define __FUNCT__ "MatSolve_SeqDense"
157dfbe8321SBarry Smith PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy)
158289bc588SBarry Smith {
159c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
1606849ba73SBarry Smith   PetscErrorCode ierr;
16187828ca2SBarry Smith   PetscScalar    *x,*y;
162d0f46423SBarry Smith   PetscBLASInt   one = 1,info,m = PetscBLASIntCast(A->rmap->n);
16367e560aaSBarry Smith 
1643a40ed3dSBarry Smith   PetscFunctionBegin;
1651ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
1661ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
167d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
168d5f3da31SBarry Smith   if (A->factortype == MAT_FACTOR_LU) {
169ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
170e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
171ae7cfcebSSatish Balay #else
17271044d3cSBarry Smith     LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info);
173e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
174ae7cfcebSSatish Balay #endif
175d5f3da31SBarry Smith   } else if (A->factortype == MAT_FACTOR_CHOLESKY){
176ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
177e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
178ae7cfcebSSatish Balay #else
17971044d3cSBarry Smith     LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info);
180e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
181ae7cfcebSSatish Balay #endif
182289bc588SBarry Smith   }
183e32f2f54SBarry Smith   else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
1841ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
1851ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
186dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
1873a40ed3dSBarry Smith   PetscFunctionReturn(0);
188289bc588SBarry Smith }
1896ee01492SSatish Balay 
1904a2ae208SSatish Balay #undef __FUNCT__
19185e2c93fSHong Zhang #define __FUNCT__ "MatMatSolve_SeqDense"
19285e2c93fSHong Zhang PetscErrorCode MatMatSolve_SeqDense(Mat A,Mat B,Mat X)
19385e2c93fSHong Zhang {
19485e2c93fSHong Zhang   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
19585e2c93fSHong Zhang   PetscErrorCode ierr;
19685e2c93fSHong Zhang   PetscScalar    *b,*x;
19785e2c93fSHong Zhang   PetscBLASInt   nrhs,info,m=PetscBLASIntCast(A->rmap->n);
19885e2c93fSHong Zhang 
19985e2c93fSHong Zhang   PetscFunctionBegin;
20085e2c93fSHong Zhang   ierr = MatGetSize(B,PETSC_NULL,&nrhs);CHKERRQ(ierr);
20185e2c93fSHong Zhang   ierr = MatGetArray(B,&b);CHKERRQ(ierr);
20285e2c93fSHong Zhang   ierr = MatGetArray(X,&x);CHKERRQ(ierr);
20385e2c93fSHong Zhang 
20485e2c93fSHong Zhang   ierr = PetscMemcpy(x,b,m*sizeof(PetscScalar));CHKERRQ(ierr);
20585e2c93fSHong Zhang 
20685e2c93fSHong Zhang   if (A->factortype == MAT_FACTOR_LU) {
20785e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_GETRS)
20885e2c93fSHong Zhang     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
20985e2c93fSHong Zhang #else
21085e2c93fSHong Zhang     LAPACKgetrs_("N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info);
21185e2c93fSHong Zhang     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
21285e2c93fSHong Zhang #endif
21385e2c93fSHong Zhang   } else if (A->factortype == MAT_FACTOR_CHOLESKY){
21485e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_POTRS)
21585e2c93fSHong Zhang     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
21685e2c93fSHong Zhang #else
21785e2c93fSHong Zhang     LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info);
21885e2c93fSHong Zhang     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
21985e2c93fSHong Zhang #endif
22085e2c93fSHong Zhang   }
22185e2c93fSHong Zhang   else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
22285e2c93fSHong Zhang 
22385e2c93fSHong Zhang   ierr = MatRestoreArray(B,&b);CHKERRQ(ierr);
22485e2c93fSHong Zhang   ierr = MatRestoreArray(X,&x);CHKERRQ(ierr);
22585e2c93fSHong Zhang   ierr = PetscLogFlops(nrhs*(2.0*m*m- m));CHKERRQ(ierr);
22685e2c93fSHong Zhang   PetscFunctionReturn(0);
22785e2c93fSHong Zhang }
22885e2c93fSHong Zhang 
22985e2c93fSHong Zhang #undef __FUNCT__
2304a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense"
231dfbe8321SBarry Smith PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy)
232da3a660dSBarry Smith {
233c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
234dfbe8321SBarry Smith   PetscErrorCode ierr;
23587828ca2SBarry Smith   PetscScalar    *x,*y;
236d0f46423SBarry Smith   PetscBLASInt   one = 1,info,m = PetscBLASIntCast(A->rmap->n);
23767e560aaSBarry Smith 
2383a40ed3dSBarry Smith   PetscFunctionBegin;
2391ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
2401ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
241d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
242752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
243da3a660dSBarry Smith   if (mat->pivots) {
244ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
245e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
246ae7cfcebSSatish Balay #else
24771044d3cSBarry Smith     LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info);
248e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve");
249ae7cfcebSSatish Balay #endif
2507a97a34bSBarry Smith   } else {
251ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
252e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
253ae7cfcebSSatish Balay #else
25471044d3cSBarry Smith     LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info);
255e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve");
256ae7cfcebSSatish Balay #endif
257da3a660dSBarry Smith   }
2581ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
2591ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
260dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
2613a40ed3dSBarry Smith   PetscFunctionReturn(0);
262da3a660dSBarry Smith }
2636ee01492SSatish Balay 
2644a2ae208SSatish Balay #undef __FUNCT__
2654a2ae208SSatish Balay #define __FUNCT__ "MatSolveAdd_SeqDense"
266dfbe8321SBarry Smith PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
267da3a660dSBarry Smith {
268c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
269dfbe8321SBarry Smith   PetscErrorCode ierr;
27087828ca2SBarry Smith   PetscScalar    *x,*y,sone = 1.0;
271da3a660dSBarry Smith   Vec            tmp = 0;
272d0f46423SBarry Smith   PetscBLASInt   one = 1,info,m = PetscBLASIntCast(A->rmap->n);
27367e560aaSBarry Smith 
2743a40ed3dSBarry Smith   PetscFunctionBegin;
2751ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
2761ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
277d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
278da3a660dSBarry Smith   if (yy == zz) {
27978b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
28052e6d16bSBarry Smith     ierr = PetscLogObjectParent(A,tmp);CHKERRQ(ierr);
28178b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
282da3a660dSBarry Smith   }
283d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
284752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
285da3a660dSBarry Smith   if (mat->pivots) {
286ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
287e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
288ae7cfcebSSatish Balay #else
28971044d3cSBarry Smith     LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info);
290e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
291ae7cfcebSSatish Balay #endif
292a8c6a408SBarry Smith   } else {
293ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
294e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
295ae7cfcebSSatish Balay #else
29671044d3cSBarry Smith     LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info);
297e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
298ae7cfcebSSatish Balay #endif
299da3a660dSBarry Smith   }
3002dcb1b2aSMatthew Knepley   if (tmp) {ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); ierr = VecDestroy(tmp);CHKERRQ(ierr);}
3012dcb1b2aSMatthew Knepley   else     {ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);}
3021ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
3031ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
304dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
3053a40ed3dSBarry Smith   PetscFunctionReturn(0);
306da3a660dSBarry Smith }
30767e560aaSBarry Smith 
3084a2ae208SSatish Balay #undef __FUNCT__
3094a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense"
310dfbe8321SBarry Smith PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
311da3a660dSBarry Smith {
312c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
3136849ba73SBarry Smith   PetscErrorCode ierr;
31487828ca2SBarry Smith   PetscScalar    *x,*y,sone = 1.0;
315da3a660dSBarry Smith   Vec            tmp;
316d0f46423SBarry Smith   PetscBLASInt   one = 1,info,m = PetscBLASIntCast(A->rmap->n);
31767e560aaSBarry Smith 
3183a40ed3dSBarry Smith   PetscFunctionBegin;
319d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
3201ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
3211ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
322da3a660dSBarry Smith   if (yy == zz) {
32378b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
32452e6d16bSBarry Smith     ierr = PetscLogObjectParent(A,tmp);CHKERRQ(ierr);
32578b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
326da3a660dSBarry Smith   }
327d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
328752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
329da3a660dSBarry Smith   if (mat->pivots) {
330ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
331e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
332ae7cfcebSSatish Balay #else
33371044d3cSBarry Smith     LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info);
334e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
335ae7cfcebSSatish Balay #endif
3363a40ed3dSBarry Smith   } else {
337ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
338e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
339ae7cfcebSSatish Balay #else
34071044d3cSBarry Smith     LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info);
341e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
342ae7cfcebSSatish Balay #endif
343da3a660dSBarry Smith   }
34490f02eecSBarry Smith   if (tmp) {
3452dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr);
34690f02eecSBarry Smith     ierr = VecDestroy(tmp);CHKERRQ(ierr);
3473a40ed3dSBarry Smith   } else {
3482dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);
34990f02eecSBarry Smith   }
3501ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
3511ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
352dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
3533a40ed3dSBarry Smith   PetscFunctionReturn(0);
354da3a660dSBarry Smith }
355db4efbfdSBarry Smith 
356db4efbfdSBarry Smith /* ---------------------------------------------------------------*/
357db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots,
358db4efbfdSBarry Smith    rather than put it in the Mat->row slot.*/
359db4efbfdSBarry Smith #undef __FUNCT__
360db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactor_SeqDense"
3610481f469SBarry Smith PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo)
362db4efbfdSBarry Smith {
363db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF)
364db4efbfdSBarry Smith   PetscFunctionBegin;
365e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable.");
366db4efbfdSBarry Smith #else
367db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
368db4efbfdSBarry Smith   PetscErrorCode ierr;
369db4efbfdSBarry Smith   PetscBLASInt   n,m,info;
370db4efbfdSBarry Smith 
371db4efbfdSBarry Smith   PetscFunctionBegin;
372db4efbfdSBarry Smith   n = PetscBLASIntCast(A->cmap->n);
373db4efbfdSBarry Smith   m = PetscBLASIntCast(A->rmap->n);
374db4efbfdSBarry Smith   if (!mat->pivots) {
375db4efbfdSBarry Smith     ierr = PetscMalloc((A->rmap->n+1)*sizeof(PetscBLASInt),&mat->pivots);CHKERRQ(ierr);
376db4efbfdSBarry Smith     ierr = PetscLogObjectMemory(A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr);
377db4efbfdSBarry Smith   }
378db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
379db4efbfdSBarry Smith   LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info);
380e32f2f54SBarry Smith   if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization");
381e32f2f54SBarry Smith   if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization");
382db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
383db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
384db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
385db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
386d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_LU;
387db4efbfdSBarry Smith 
388dc0b31edSSatish Balay   ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr);
389db4efbfdSBarry Smith #endif
390db4efbfdSBarry Smith   PetscFunctionReturn(0);
391db4efbfdSBarry Smith }
392db4efbfdSBarry Smith 
393db4efbfdSBarry Smith #undef __FUNCT__
394db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactor_SeqDense"
3950481f469SBarry Smith PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo)
396db4efbfdSBarry Smith {
397db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF)
398db4efbfdSBarry Smith   PetscFunctionBegin;
399e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable.");
400db4efbfdSBarry Smith #else
401db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
402db4efbfdSBarry Smith   PetscErrorCode ierr;
403db4efbfdSBarry Smith   PetscBLASInt   info,n = PetscBLASIntCast(A->cmap->n);
404db4efbfdSBarry Smith 
405db4efbfdSBarry Smith   PetscFunctionBegin;
406db4efbfdSBarry Smith   ierr = PetscFree(mat->pivots);CHKERRQ(ierr);
407db4efbfdSBarry Smith 
408db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
409db4efbfdSBarry Smith   LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info);
410e32f2f54SBarry Smith   if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1);
411db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
412db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
413db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
414db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
415d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_CHOLESKY;
416dc0b31edSSatish Balay   ierr = PetscLogFlops((A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr);
417db4efbfdSBarry Smith #endif
418db4efbfdSBarry Smith   PetscFunctionReturn(0);
419db4efbfdSBarry Smith }
420db4efbfdSBarry Smith 
421db4efbfdSBarry Smith 
422db4efbfdSBarry Smith #undef __FUNCT__
423db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense"
4240481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
425db4efbfdSBarry Smith {
426db4efbfdSBarry Smith   PetscErrorCode ierr;
427db4efbfdSBarry Smith   MatFactorInfo  info;
428db4efbfdSBarry Smith 
429db4efbfdSBarry Smith   PetscFunctionBegin;
430db4efbfdSBarry Smith   info.fill = 1.0;
431c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
432719d5645SBarry Smith   ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr);
433db4efbfdSBarry Smith   PetscFunctionReturn(0);
434db4efbfdSBarry Smith }
435db4efbfdSBarry Smith 
436db4efbfdSBarry Smith #undef __FUNCT__
437db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense"
4380481f469SBarry Smith PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info)
439db4efbfdSBarry Smith {
440db4efbfdSBarry Smith   PetscFunctionBegin;
441c3ef05f6SHong Zhang   fact->assembled                  = PETSC_TRUE;
442719d5645SBarry Smith   fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense;
443db4efbfdSBarry Smith   PetscFunctionReturn(0);
444db4efbfdSBarry Smith }
445db4efbfdSBarry Smith 
446db4efbfdSBarry Smith #undef __FUNCT__
447db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactorSymbolic_SeqDense"
4480481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info)
449db4efbfdSBarry Smith {
450db4efbfdSBarry Smith   PetscFunctionBegin;
451c3ef05f6SHong Zhang   fact->assembled            = PETSC_TRUE;
452719d5645SBarry Smith   fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense;
453db4efbfdSBarry Smith   PetscFunctionReturn(0);
454db4efbfdSBarry Smith }
455db4efbfdSBarry Smith 
456bb5747d9SMatthew Knepley EXTERN_C_BEGIN
457db4efbfdSBarry Smith #undef __FUNCT__
458db4efbfdSBarry Smith #define __FUNCT__ "MatGetFactor_seqdense_petsc"
459db4efbfdSBarry Smith PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact)
460db4efbfdSBarry Smith {
461db4efbfdSBarry Smith   PetscErrorCode ierr;
462db4efbfdSBarry Smith 
463db4efbfdSBarry Smith   PetscFunctionBegin;
464db4efbfdSBarry Smith   ierr = MatCreate(((PetscObject)A)->comm,fact);CHKERRQ(ierr);
465db4efbfdSBarry Smith   ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
466db4efbfdSBarry Smith   ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr);
467db4efbfdSBarry Smith   if (ftype == MAT_FACTOR_LU){
468db4efbfdSBarry Smith     (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense;
469db4efbfdSBarry Smith   } else {
470db4efbfdSBarry Smith     (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense;
471db4efbfdSBarry Smith   }
472d5f3da31SBarry Smith   (*fact)->factortype = ftype;
473db4efbfdSBarry Smith   PetscFunctionReturn(0);
474db4efbfdSBarry Smith }
475bb5747d9SMatthew Knepley EXTERN_C_END
476db4efbfdSBarry Smith 
477289bc588SBarry Smith /* ------------------------------------------------------------------*/
4784a2ae208SSatish Balay #undef __FUNCT__
47941f059aeSBarry Smith #define __FUNCT__ "MatSOR_SeqDense"
48041f059aeSBarry Smith PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx)
481289bc588SBarry Smith {
482c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
48387828ca2SBarry Smith   PetscScalar    *x,*b,*v = mat->v,zero = 0.0,xt;
484dfbe8321SBarry Smith   PetscErrorCode ierr;
485d0f46423SBarry Smith   PetscInt       m = A->rmap->n,i;
486aa482453SBarry Smith #if !defined(PETSC_USE_COMPLEX)
4870805154bSBarry Smith   PetscBLASInt   o = 1,bm = PetscBLASIntCast(m);
488bc1b551cSSatish Balay #endif
489289bc588SBarry Smith 
4903a40ed3dSBarry Smith   PetscFunctionBegin;
491289bc588SBarry Smith   if (flag & SOR_ZERO_INITIAL_GUESS) {
49271044d3cSBarry Smith     /* this is a hack fix, should have another version without the second BLASdot */
4932dcb1b2aSMatthew Knepley     ierr = VecSet(xx,zero);CHKERRQ(ierr);
494289bc588SBarry Smith   }
4951ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
4961ebc52fbSHong Zhang   ierr = VecGetArray(bb,&b);CHKERRQ(ierr);
497b965ef7fSBarry Smith   its  = its*lits;
498e32f2f54SBarry Smith   if (its <= 0) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Relaxation requires global its %D and local its %D both positive",its,lits);
499289bc588SBarry Smith   while (its--) {
500fccaa45eSBarry Smith     if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP){
501289bc588SBarry Smith       for (i=0; i<m; i++) {
502aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
503f1747703SBarry Smith         /* cannot use BLAS dot for complex because compiler/linker is
504f1747703SBarry Smith            not happy about returning a double complex */
50513f74950SBarry Smith         PetscInt    _i;
50687828ca2SBarry Smith         PetscScalar sum = b[i];
507f1747703SBarry Smith         for (_i=0; _i<m; _i++) {
5083f6de6efSSatish Balay           sum -= PetscConj(v[i+_i*m])*x[_i];
509f1747703SBarry Smith         }
510f1747703SBarry Smith         xt = sum;
511f1747703SBarry Smith #else
51271044d3cSBarry Smith         xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o);
513f1747703SBarry Smith #endif
51455a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
515289bc588SBarry Smith       }
516289bc588SBarry Smith     }
517fccaa45eSBarry Smith     if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP){
518289bc588SBarry Smith       for (i=m-1; i>=0; i--) {
519aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
520f1747703SBarry Smith         /* cannot use BLAS dot for complex because compiler/linker is
521f1747703SBarry Smith            not happy about returning a double complex */
52213f74950SBarry Smith         PetscInt    _i;
52387828ca2SBarry Smith         PetscScalar sum = b[i];
524f1747703SBarry Smith         for (_i=0; _i<m; _i++) {
5253f6de6efSSatish Balay           sum -= PetscConj(v[i+_i*m])*x[_i];
526f1747703SBarry Smith         }
527f1747703SBarry Smith         xt = sum;
528f1747703SBarry Smith #else
52971044d3cSBarry Smith         xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o);
530f1747703SBarry Smith #endif
53155a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
532289bc588SBarry Smith       }
533289bc588SBarry Smith     }
534289bc588SBarry Smith   }
5351ebc52fbSHong Zhang   ierr = VecRestoreArray(bb,&b);CHKERRQ(ierr);
5361ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
5373a40ed3dSBarry Smith   PetscFunctionReturn(0);
538289bc588SBarry Smith }
539289bc588SBarry Smith 
540289bc588SBarry Smith /* -----------------------------------------------------------------*/
5414a2ae208SSatish Balay #undef __FUNCT__
5424a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense"
543dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy)
544289bc588SBarry Smith {
545c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
54687828ca2SBarry Smith   PetscScalar    *v = mat->v,*x,*y;
547dfbe8321SBarry Smith   PetscErrorCode ierr;
5480805154bSBarry Smith   PetscBLASInt   m, n,_One=1;
549ea709b57SSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
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_("T",&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);
560dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
5613a40ed3dSBarry Smith   PetscFunctionReturn(0);
562289bc588SBarry Smith }
563800995b7SMatthew Knepley 
5644a2ae208SSatish Balay #undef __FUNCT__
5654a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense"
566dfbe8321SBarry Smith PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,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,_DZero=0.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);
5771ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
5781ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
57971044d3cSBarry Smith   BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One);
5801ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
5811ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
582dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr);
5833a40ed3dSBarry Smith   PetscFunctionReturn(0);
584289bc588SBarry Smith }
5856ee01492SSatish Balay 
5864a2ae208SSatish Balay #undef __FUNCT__
5874a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense"
588dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
589289bc588SBarry Smith {
590c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
59187828ca2SBarry Smith   PetscScalar    *v = mat->v,*x,*y,_DOne=1.0;
592dfbe8321SBarry Smith   PetscErrorCode ierr;
5930805154bSBarry Smith   PetscBLASInt   m, n, _One=1;
5943a40ed3dSBarry Smith 
5953a40ed3dSBarry Smith   PetscFunctionBegin;
596d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
597d0f46423SBarry Smith   n = PetscBLASIntCast(A->cmap->n);
598d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
599600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
6001ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
6011ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
60271044d3cSBarry Smith   BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One);
6031ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6041ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
605dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
6063a40ed3dSBarry Smith   PetscFunctionReturn(0);
607289bc588SBarry Smith }
6086ee01492SSatish Balay 
6094a2ae208SSatish Balay #undef __FUNCT__
6104a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense"
611dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
612289bc588SBarry Smith {
613c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
61487828ca2SBarry Smith   PetscScalar    *v = mat->v,*x,*y;
615dfbe8321SBarry Smith   PetscErrorCode ierr;
6160805154bSBarry Smith   PetscBLASInt   m, n, _One=1;
61787828ca2SBarry Smith   PetscScalar    _DOne=1.0;
6183a40ed3dSBarry Smith 
6193a40ed3dSBarry Smith   PetscFunctionBegin;
620d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
621d0f46423SBarry Smith   n = PetscBLASIntCast(A->cmap->n);
622d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
623600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
6241ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
6251ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
62671044d3cSBarry Smith   BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One);
6271ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6281ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
629dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
6303a40ed3dSBarry Smith   PetscFunctionReturn(0);
631289bc588SBarry Smith }
632289bc588SBarry Smith 
633289bc588SBarry Smith /* -----------------------------------------------------------------*/
6344a2ae208SSatish Balay #undef __FUNCT__
6354a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense"
63613f74950SBarry Smith PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
637289bc588SBarry Smith {
638c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
63987828ca2SBarry Smith   PetscScalar    *v;
6406849ba73SBarry Smith   PetscErrorCode ierr;
64113f74950SBarry Smith   PetscInt       i;
64267e560aaSBarry Smith 
6433a40ed3dSBarry Smith   PetscFunctionBegin;
644d0f46423SBarry Smith   *ncols = A->cmap->n;
645289bc588SBarry Smith   if (cols) {
646d0f46423SBarry Smith     ierr = PetscMalloc((A->cmap->n+1)*sizeof(PetscInt),cols);CHKERRQ(ierr);
647d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) (*cols)[i] = i;
648289bc588SBarry Smith   }
649289bc588SBarry Smith   if (vals) {
650d0f46423SBarry Smith     ierr = PetscMalloc((A->cmap->n+1)*sizeof(PetscScalar),vals);CHKERRQ(ierr);
651289bc588SBarry Smith     v    = mat->v + row;
652d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;}
653289bc588SBarry Smith   }
6543a40ed3dSBarry Smith   PetscFunctionReturn(0);
655289bc588SBarry Smith }
6566ee01492SSatish Balay 
6574a2ae208SSatish Balay #undef __FUNCT__
6584a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense"
65913f74950SBarry Smith PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
660289bc588SBarry Smith {
661dfbe8321SBarry Smith   PetscErrorCode ierr;
662606d414cSSatish Balay   PetscFunctionBegin;
663606d414cSSatish Balay   if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);}
664606d414cSSatish Balay   if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); }
6653a40ed3dSBarry Smith   PetscFunctionReturn(0);
666289bc588SBarry Smith }
667289bc588SBarry Smith /* ----------------------------------------------------------------*/
6684a2ae208SSatish Balay #undef __FUNCT__
6694a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense"
67013f74950SBarry Smith PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv)
671289bc588SBarry Smith {
672c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
67313f74950SBarry Smith   PetscInt     i,j,idx=0;
674d6dfbf8fSBarry Smith 
6753a40ed3dSBarry Smith   PetscFunctionBegin;
67671fd2e92SBarry Smith   if (v) PetscValidScalarPointer(v,6);
677289bc588SBarry Smith   if (!mat->roworiented) {
678dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
679289bc588SBarry Smith       for (j=0; j<n; j++) {
680cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
6812515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
682e32f2f54SBarry Smith         if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1);
68358804f6dSBarry Smith #endif
684289bc588SBarry Smith         for (i=0; i<m; i++) {
685cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
6862515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
687e32f2f54SBarry Smith           if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
68858804f6dSBarry Smith #endif
689cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
690289bc588SBarry Smith         }
691289bc588SBarry Smith       }
6923a40ed3dSBarry Smith     } else {
693289bc588SBarry Smith       for (j=0; j<n; j++) {
694cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
6952515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
696e32f2f54SBarry Smith         if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1);
69758804f6dSBarry Smith #endif
698289bc588SBarry Smith         for (i=0; i<m; i++) {
699cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
7002515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
701e32f2f54SBarry Smith           if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
70258804f6dSBarry Smith #endif
703cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
704289bc588SBarry Smith         }
705289bc588SBarry Smith       }
706289bc588SBarry Smith     }
7073a40ed3dSBarry Smith   } else {
708dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
709e8d4e0b9SBarry Smith       for (i=0; i<m; i++) {
710cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
7112515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
712e32f2f54SBarry Smith         if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
71358804f6dSBarry Smith #endif
714e8d4e0b9SBarry Smith         for (j=0; j<n; j++) {
715cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
7162515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
717e32f2f54SBarry Smith           if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1);
71858804f6dSBarry Smith #endif
719cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
720e8d4e0b9SBarry Smith         }
721e8d4e0b9SBarry Smith       }
7223a40ed3dSBarry Smith     } else {
723289bc588SBarry Smith       for (i=0; i<m; i++) {
724cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
7252515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
726e32f2f54SBarry Smith         if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
72758804f6dSBarry Smith #endif
728289bc588SBarry Smith         for (j=0; j<n; j++) {
729cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
7302515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
731e32f2f54SBarry Smith           if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1);
73258804f6dSBarry Smith #endif
733cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
734289bc588SBarry Smith         }
735289bc588SBarry Smith       }
736289bc588SBarry Smith     }
737e8d4e0b9SBarry Smith   }
7383a40ed3dSBarry Smith   PetscFunctionReturn(0);
739289bc588SBarry Smith }
740e8d4e0b9SBarry Smith 
7414a2ae208SSatish Balay #undef __FUNCT__
7424a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense"
74313f74950SBarry Smith PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[])
744ae80bb75SLois Curfman McInnes {
745ae80bb75SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
74613f74950SBarry Smith   PetscInt     i,j;
747ae80bb75SLois Curfman McInnes 
7483a40ed3dSBarry Smith   PetscFunctionBegin;
749ae80bb75SLois Curfman McInnes   /* row-oriented output */
750ae80bb75SLois Curfman McInnes   for (i=0; i<m; i++) {
75197e567efSBarry Smith     if (indexm[i] < 0) {v += n;continue;}
752e32f2f54SBarry Smith     if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row %D requested larger than number rows %D",indexm[i],A->rmap->n);
753ae80bb75SLois Curfman McInnes     for (j=0; j<n; j++) {
7546f31f424SBarry Smith       if (indexn[j] < 0) {v++; continue;}
755e32f2f54SBarry Smith       if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column %D requested larger than number columns %D",indexn[j],A->cmap->n);
75697e567efSBarry Smith       *v++ = mat->v[indexn[j]*mat->lda + indexm[i]];
757ae80bb75SLois Curfman McInnes     }
758ae80bb75SLois Curfman McInnes   }
7593a40ed3dSBarry Smith   PetscFunctionReturn(0);
760ae80bb75SLois Curfman McInnes }
761ae80bb75SLois Curfman McInnes 
762289bc588SBarry Smith /* -----------------------------------------------------------------*/
763289bc588SBarry Smith 
7644a2ae208SSatish Balay #undef __FUNCT__
7655bba2384SShri Abhyankar #define __FUNCT__ "MatLoad_SeqDense"
766112444f4SShri Abhyankar PetscErrorCode MatLoad_SeqDense(Mat newmat,PetscViewer viewer)
767aabbc4fbSShri Abhyankar {
768aabbc4fbSShri Abhyankar   Mat_SeqDense   *a;
769aabbc4fbSShri Abhyankar   PetscErrorCode ierr;
770aabbc4fbSShri Abhyankar   PetscInt       *scols,i,j,nz,header[4];
771aabbc4fbSShri Abhyankar   int            fd;
772aabbc4fbSShri Abhyankar   PetscMPIInt    size;
773aabbc4fbSShri Abhyankar   PetscInt       *rowlengths = 0,M,N,*cols,grows,gcols;
774aabbc4fbSShri Abhyankar   PetscScalar    *vals,*svals,*v,*w;
775aabbc4fbSShri Abhyankar   MPI_Comm       comm = ((PetscObject)viewer)->comm;
776aabbc4fbSShri Abhyankar 
777aabbc4fbSShri Abhyankar   PetscFunctionBegin;
778aabbc4fbSShri Abhyankar   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
779aabbc4fbSShri Abhyankar   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor");
780aabbc4fbSShri Abhyankar   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
781aabbc4fbSShri Abhyankar   ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr);
782aabbc4fbSShri Abhyankar   if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object");
783aabbc4fbSShri Abhyankar   M = header[1]; N = header[2]; nz = header[3];
784aabbc4fbSShri Abhyankar 
785aabbc4fbSShri Abhyankar   /* set global size if not set already*/
786aabbc4fbSShri Abhyankar   if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) {
787aabbc4fbSShri Abhyankar     ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr);
788aabbc4fbSShri Abhyankar   } else {
789aabbc4fbSShri Abhyankar     /* if sizes and type are already set, check if the vector global sizes are correct */
790aabbc4fbSShri Abhyankar     ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr);
791aabbc4fbSShri Abhyankar     if (M != grows ||  N != gcols) SETERRQ4(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED, "Matrix in file of different length (%d, %d) than the input matrix (%d, %d)",M,N,grows,gcols);
792aabbc4fbSShri Abhyankar   }
793aabbc4fbSShri Abhyankar   ierr = MatSeqDenseSetPreallocation(newmat,PETSC_NULL);CHKERRQ(ierr);
794aabbc4fbSShri Abhyankar 
795aabbc4fbSShri Abhyankar   if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */
796aabbc4fbSShri Abhyankar     a    = (Mat_SeqDense*)newmat->data;
797aabbc4fbSShri Abhyankar     v    = a->v;
798aabbc4fbSShri Abhyankar     /* Allocate some temp space to read in the values and then flip them
799aabbc4fbSShri Abhyankar        from row major to column major */
800aabbc4fbSShri Abhyankar     ierr = PetscMalloc((M*N > 0 ? M*N : 1)*sizeof(PetscScalar),&w);CHKERRQ(ierr);
801aabbc4fbSShri Abhyankar     /* read in nonzero values */
802aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr);
803aabbc4fbSShri Abhyankar     /* now flip the values and store them in the matrix*/
804aabbc4fbSShri Abhyankar     for (j=0; j<N; j++) {
805aabbc4fbSShri Abhyankar       for (i=0; i<M; i++) {
806aabbc4fbSShri Abhyankar         *v++ =w[i*N+j];
807aabbc4fbSShri Abhyankar       }
808aabbc4fbSShri Abhyankar     }
809aabbc4fbSShri Abhyankar     ierr = PetscFree(w);CHKERRQ(ierr);
810aabbc4fbSShri Abhyankar   } else {
811aabbc4fbSShri Abhyankar     /* read row lengths */
812aabbc4fbSShri Abhyankar     ierr = PetscMalloc((M+1)*sizeof(PetscInt),&rowlengths);CHKERRQ(ierr);
813aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr);
814aabbc4fbSShri Abhyankar 
815aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
816aabbc4fbSShri Abhyankar     v = a->v;
817aabbc4fbSShri Abhyankar 
818aabbc4fbSShri Abhyankar     /* read column indices and nonzeros */
819aabbc4fbSShri Abhyankar     ierr = PetscMalloc((nz+1)*sizeof(PetscInt),&scols);CHKERRQ(ierr);
820aabbc4fbSShri Abhyankar     cols = scols;
821aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr);
822aabbc4fbSShri Abhyankar     ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&svals);CHKERRQ(ierr);
823aabbc4fbSShri Abhyankar     vals = svals;
824aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr);
825aabbc4fbSShri Abhyankar 
826aabbc4fbSShri Abhyankar     /* insert into matrix */
827aabbc4fbSShri Abhyankar     for (i=0; i<M; i++) {
828aabbc4fbSShri Abhyankar       for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j];
829aabbc4fbSShri Abhyankar       svals += rowlengths[i]; scols += rowlengths[i];
830aabbc4fbSShri Abhyankar     }
831aabbc4fbSShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
832aabbc4fbSShri Abhyankar     ierr = PetscFree(cols);CHKERRQ(ierr);
833aabbc4fbSShri Abhyankar     ierr = PetscFree(rowlengths);CHKERRQ(ierr);
834aabbc4fbSShri Abhyankar   }
835aabbc4fbSShri Abhyankar   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
836aabbc4fbSShri Abhyankar   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
837aabbc4fbSShri Abhyankar 
838aabbc4fbSShri Abhyankar   PetscFunctionReturn(0);
839aabbc4fbSShri Abhyankar }
840aabbc4fbSShri Abhyankar 
841aabbc4fbSShri Abhyankar #undef __FUNCT__
8424a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII"
8436849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer)
844289bc588SBarry Smith {
845932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
846dfbe8321SBarry Smith   PetscErrorCode    ierr;
84713f74950SBarry Smith   PetscInt          i,j;
8482dcb1b2aSMatthew Knepley   const char        *name;
84987828ca2SBarry Smith   PetscScalar       *v;
850f3ef73ceSBarry Smith   PetscViewerFormat format;
8515f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX)
852ace3abfcSBarry Smith   PetscBool         allreal = PETSC_TRUE;
8535f481a85SSatish Balay #endif
854932b0c3eSLois Curfman McInnes 
8553a40ed3dSBarry Smith   PetscFunctionBegin;
856b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
857456192e2SBarry Smith   if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
8583a40ed3dSBarry Smith     PetscFunctionReturn(0);  /* do nothing for now */
859fb9695e5SSatish Balay   } else if (format == PETSC_VIEWER_ASCII_COMMON) {
860d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
8617566de4bSShri Abhyankar     ierr = PetscObjectPrintClassNamePrefixType((PetscObject)A,viewer,"Matrix Object");CHKERRQ(ierr);
862d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
86344cd7ae7SLois Curfman McInnes       v = a->v + i;
86477431f27SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr);
865d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
866aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
867329f5518SBarry Smith         if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) {
868a83599f4SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %G + %G i) ",j,PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr);
869329f5518SBarry Smith         } else if (PetscRealPart(*v)) {
870a83599f4SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,PetscRealPart(*v));CHKERRQ(ierr);
8716831982aSBarry Smith         }
87280cd9d93SLois Curfman McInnes #else
8736831982aSBarry Smith         if (*v) {
874a83599f4SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,*v);CHKERRQ(ierr);
8756831982aSBarry Smith         }
87680cd9d93SLois Curfman McInnes #endif
8771b807ce4Svictorle         v += a->lda;
87880cd9d93SLois Curfman McInnes       }
879b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
88080cd9d93SLois Curfman McInnes     }
881d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
8823a40ed3dSBarry Smith   } else {
883d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
884aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
88547989497SBarry Smith     /* determine if matrix has all real values */
88647989497SBarry Smith     v = a->v;
887d0f46423SBarry Smith     for (i=0; i<A->rmap->n*A->cmap->n; i++) {
888ffac6cdbSBarry Smith 	if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break ;}
88947989497SBarry Smith     }
89047989497SBarry Smith #endif
891fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
8923a7fca6bSBarry Smith       ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr);
893d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr);
894d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
895fb9695e5SSatish Balay       ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr);
8967566de4bSShri Abhyankar     } else {
8977566de4bSShri Abhyankar       ierr = PetscObjectPrintClassNamePrefixType((PetscObject)A,viewer,"Matrix Object");CHKERRQ(ierr);
898ffac6cdbSBarry Smith     }
899ffac6cdbSBarry Smith 
900d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
901932b0c3eSLois Curfman McInnes       v = a->v + i;
902d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
903aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
90447989497SBarry Smith         if (allreal) {
905f32d5d43SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",PetscRealPart(*v));CHKERRQ(ierr);
90647989497SBarry Smith         } else {
907f32d5d43SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16e i ",PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr);
90847989497SBarry Smith         }
909289bc588SBarry Smith #else
910f32d5d43SBarry Smith         ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",*v);CHKERRQ(ierr);
911289bc588SBarry Smith #endif
9121b807ce4Svictorle 	v += a->lda;
913289bc588SBarry Smith       }
914b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
915289bc588SBarry Smith     }
916fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
917b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr);
918ffac6cdbSBarry Smith     }
919d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
920da3a660dSBarry Smith   }
921b0a32e0cSBarry Smith   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
9223a40ed3dSBarry Smith   PetscFunctionReturn(0);
923289bc588SBarry Smith }
924289bc588SBarry Smith 
9254a2ae208SSatish Balay #undef __FUNCT__
9264a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary"
9276849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer)
928932b0c3eSLois Curfman McInnes {
929932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
9306849ba73SBarry Smith   PetscErrorCode    ierr;
93113f74950SBarry Smith   int               fd;
932d0f46423SBarry Smith   PetscInt          ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n;
933f4403165SShri Abhyankar   PetscScalar       *v,*anonz,*vals;
934f4403165SShri Abhyankar   PetscViewerFormat format;
935932b0c3eSLois Curfman McInnes 
9363a40ed3dSBarry Smith   PetscFunctionBegin;
937b0a32e0cSBarry Smith   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
93890ace30eSBarry Smith 
939f4403165SShri Abhyankar   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
940f4403165SShri Abhyankar   if (format == PETSC_VIEWER_NATIVE) {
941f4403165SShri Abhyankar     /* store the matrix as a dense matrix */
942f4403165SShri Abhyankar     ierr = PetscMalloc(4*sizeof(PetscInt),&col_lens);CHKERRQ(ierr);
943f4403165SShri Abhyankar     col_lens[0] = MAT_FILE_CLASSID;
944f4403165SShri Abhyankar     col_lens[1] = m;
945f4403165SShri Abhyankar     col_lens[2] = n;
946f4403165SShri Abhyankar     col_lens[3] = MATRIX_BINARY_FORMAT_DENSE;
947f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
948f4403165SShri Abhyankar     ierr = PetscFree(col_lens);CHKERRQ(ierr);
949f4403165SShri Abhyankar 
950f4403165SShri Abhyankar     /* write out matrix, by rows */
951f4403165SShri Abhyankar     ierr = PetscMalloc((m*n+1)*sizeof(PetscScalar),&vals);CHKERRQ(ierr);
952f4403165SShri Abhyankar     v    = a->v;
953f4403165SShri Abhyankar     for (j=0; j<n; j++) {
954f4403165SShri Abhyankar       for (i=0; i<m; i++) {
955f4403165SShri Abhyankar         vals[j + i*n] = *v++;
956f4403165SShri Abhyankar       }
957f4403165SShri Abhyankar     }
958f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
959f4403165SShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
960f4403165SShri Abhyankar   } else {
96113f74950SBarry Smith     ierr = PetscMalloc((4+nz)*sizeof(PetscInt),&col_lens);CHKERRQ(ierr);
9620700a824SBarry Smith     col_lens[0] = MAT_FILE_CLASSID;
963932b0c3eSLois Curfman McInnes     col_lens[1] = m;
964932b0c3eSLois Curfman McInnes     col_lens[2] = n;
965932b0c3eSLois Curfman McInnes     col_lens[3] = nz;
966932b0c3eSLois Curfman McInnes 
967932b0c3eSLois Curfman McInnes     /* store lengths of each row and write (including header) to file */
968932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) col_lens[4+i] = n;
9696f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
970932b0c3eSLois Curfman McInnes 
971932b0c3eSLois Curfman McInnes     /* Possibly should write in smaller increments, not whole matrix at once? */
972932b0c3eSLois Curfman McInnes     /* store column indices (zero start index) */
973932b0c3eSLois Curfman McInnes     ict = 0;
974932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
975932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) col_lens[ict++] = j;
976932b0c3eSLois Curfman McInnes     }
9776f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
978606d414cSSatish Balay     ierr = PetscFree(col_lens);CHKERRQ(ierr);
979932b0c3eSLois Curfman McInnes 
980932b0c3eSLois Curfman McInnes     /* store nonzero values */
98187828ca2SBarry Smith     ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&anonz);CHKERRQ(ierr);
982932b0c3eSLois Curfman McInnes     ict  = 0;
983932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
984932b0c3eSLois Curfman McInnes       v = a->v + i;
985932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) {
9861b807ce4Svictorle         anonz[ict++] = *v; v += a->lda;
987932b0c3eSLois Curfman McInnes       }
988932b0c3eSLois Curfman McInnes     }
9896f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
990606d414cSSatish Balay     ierr = PetscFree(anonz);CHKERRQ(ierr);
991f4403165SShri Abhyankar   }
9923a40ed3dSBarry Smith   PetscFunctionReturn(0);
993932b0c3eSLois Curfman McInnes }
994932b0c3eSLois Curfman McInnes 
9954a2ae208SSatish Balay #undef __FUNCT__
9964a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom"
997dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa)
998f1af5d2fSBarry Smith {
999f1af5d2fSBarry Smith   Mat               A = (Mat) Aa;
1000f1af5d2fSBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
10016849ba73SBarry Smith   PetscErrorCode    ierr;
1002d0f46423SBarry Smith   PetscInt          m = A->rmap->n,n = A->cmap->n,color,i,j;
100387828ca2SBarry Smith   PetscScalar       *v = a->v;
1004b0a32e0cSBarry Smith   PetscViewer       viewer;
1005b0a32e0cSBarry Smith   PetscDraw         popup;
1006329f5518SBarry Smith   PetscReal         xl,yl,xr,yr,x_l,x_r,y_l,y_r,scale,maxv = 0.0;
1007f3ef73ceSBarry Smith   PetscViewerFormat format;
1008f1af5d2fSBarry Smith 
1009f1af5d2fSBarry Smith   PetscFunctionBegin;
1010f1af5d2fSBarry Smith 
1011f1af5d2fSBarry Smith   ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr);
1012b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1013b0a32e0cSBarry Smith   ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr);
1014f1af5d2fSBarry Smith 
1015f1af5d2fSBarry Smith   /* Loop over matrix elements drawing boxes */
1016fb9695e5SSatish Balay   if (format != PETSC_VIEWER_DRAW_CONTOUR) {
1017f1af5d2fSBarry Smith     /* Blue for negative and Red for positive */
1018b0a32e0cSBarry Smith     color = PETSC_DRAW_BLUE;
1019f1af5d2fSBarry Smith     for(j = 0; j < n; j++) {
1020f1af5d2fSBarry Smith       x_l = j;
1021f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1022f1af5d2fSBarry Smith       for(i = 0; i < m; i++) {
1023f1af5d2fSBarry Smith         y_l = m - i - 1.0;
1024f1af5d2fSBarry Smith         y_r = y_l + 1.0;
1025f1af5d2fSBarry Smith #if defined(PETSC_USE_COMPLEX)
1026329f5518SBarry Smith         if (PetscRealPart(v[j*m+i]) >  0.) {
1027b0a32e0cSBarry Smith           color = PETSC_DRAW_RED;
1028329f5518SBarry Smith         } else if (PetscRealPart(v[j*m+i]) <  0.) {
1029b0a32e0cSBarry Smith           color = PETSC_DRAW_BLUE;
1030f1af5d2fSBarry Smith         } else {
1031f1af5d2fSBarry Smith           continue;
1032f1af5d2fSBarry Smith         }
1033f1af5d2fSBarry Smith #else
1034f1af5d2fSBarry Smith         if (v[j*m+i] >  0.) {
1035b0a32e0cSBarry Smith           color = PETSC_DRAW_RED;
1036f1af5d2fSBarry Smith         } else if (v[j*m+i] <  0.) {
1037b0a32e0cSBarry Smith           color = PETSC_DRAW_BLUE;
1038f1af5d2fSBarry Smith         } else {
1039f1af5d2fSBarry Smith           continue;
1040f1af5d2fSBarry Smith         }
1041f1af5d2fSBarry Smith #endif
1042b0a32e0cSBarry Smith         ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1043f1af5d2fSBarry Smith       }
1044f1af5d2fSBarry Smith     }
1045f1af5d2fSBarry Smith   } else {
1046f1af5d2fSBarry Smith     /* use contour shading to indicate magnitude of values */
1047f1af5d2fSBarry Smith     /* first determine max of all nonzero values */
1048f1af5d2fSBarry Smith     for(i = 0; i < m*n; i++) {
1049f1af5d2fSBarry Smith       if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]);
1050f1af5d2fSBarry Smith     }
1051b0a32e0cSBarry Smith     scale = (245.0 - PETSC_DRAW_BASIC_COLORS)/maxv;
1052b0a32e0cSBarry Smith     ierr  = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr);
1053b0a32e0cSBarry Smith     if (popup) {ierr  = PetscDrawScalePopup(popup,0.0,maxv);CHKERRQ(ierr);}
1054f1af5d2fSBarry Smith     for(j = 0; j < n; j++) {
1055f1af5d2fSBarry Smith       x_l = j;
1056f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1057f1af5d2fSBarry Smith       for(i = 0; i < m; i++) {
1058f1af5d2fSBarry Smith         y_l   = m - i - 1.0;
1059f1af5d2fSBarry Smith         y_r   = y_l + 1.0;
1060b0a32e0cSBarry Smith         color = PETSC_DRAW_BASIC_COLORS + (int)(scale*PetscAbsScalar(v[j*m+i]));
1061b0a32e0cSBarry Smith         ierr  = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1062f1af5d2fSBarry Smith       }
1063f1af5d2fSBarry Smith     }
1064f1af5d2fSBarry Smith   }
1065f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1066f1af5d2fSBarry Smith }
1067f1af5d2fSBarry Smith 
10684a2ae208SSatish Balay #undef __FUNCT__
10694a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw"
1070dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer)
1071f1af5d2fSBarry Smith {
1072b0a32e0cSBarry Smith   PetscDraw      draw;
1073ace3abfcSBarry Smith   PetscBool      isnull;
1074329f5518SBarry Smith   PetscReal      xr,yr,xl,yl,h,w;
1075dfbe8321SBarry Smith   PetscErrorCode ierr;
1076f1af5d2fSBarry Smith 
1077f1af5d2fSBarry Smith   PetscFunctionBegin;
1078b0a32e0cSBarry Smith   ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
1079b0a32e0cSBarry Smith   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
1080abc0a331SBarry Smith   if (isnull) PetscFunctionReturn(0);
1081f1af5d2fSBarry Smith 
1082f1af5d2fSBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr);
1083d0f46423SBarry Smith   xr  = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0;
1084f1af5d2fSBarry Smith   xr += w;    yr += h;  xl = -w;     yl = -h;
1085b0a32e0cSBarry Smith   ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr);
1086b0a32e0cSBarry Smith   ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr);
1087f1af5d2fSBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",PETSC_NULL);CHKERRQ(ierr);
1088f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1089f1af5d2fSBarry Smith }
1090f1af5d2fSBarry Smith 
10914a2ae208SSatish Balay #undef __FUNCT__
10924a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense"
1093dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer)
1094932b0c3eSLois Curfman McInnes {
1095dfbe8321SBarry Smith   PetscErrorCode ierr;
1096ace3abfcSBarry Smith   PetscBool      iascii,isbinary,isdraw;
1097932b0c3eSLois Curfman McInnes 
10983a40ed3dSBarry Smith   PetscFunctionBegin;
10992692d6eeSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
11002692d6eeSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
11012692d6eeSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
11020f5bd95cSBarry Smith 
1103c45a1595SBarry Smith   if (iascii) {
1104c45a1595SBarry Smith     ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr);
11050f5bd95cSBarry Smith   } else if (isbinary) {
11063a40ed3dSBarry Smith     ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr);
1107f1af5d2fSBarry Smith   } else if (isdraw) {
1108f1af5d2fSBarry Smith     ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr);
11095cd90555SBarry Smith   } else {
1110e32f2f54SBarry Smith     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Viewer type %s not supported by dense matrix",((PetscObject)viewer)->type_name);
1111932b0c3eSLois Curfman McInnes   }
11123a40ed3dSBarry Smith   PetscFunctionReturn(0);
1113932b0c3eSLois Curfman McInnes }
1114289bc588SBarry Smith 
11154a2ae208SSatish Balay #undef __FUNCT__
11164a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense"
1117dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqDense(Mat mat)
1118289bc588SBarry Smith {
1119ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)mat->data;
1120dfbe8321SBarry Smith   PetscErrorCode ierr;
112190f02eecSBarry Smith 
11223a40ed3dSBarry Smith   PetscFunctionBegin;
1123aa482453SBarry Smith #if defined(PETSC_USE_LOG)
1124d0f46423SBarry Smith   PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n);
1125a5a9c739SBarry Smith #endif
112605b42c5fSBarry Smith   ierr = PetscFree(l->pivots);CHKERRQ(ierr);
11276857c123SSatish Balay   if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);}
1128606d414cSSatish Balay   ierr = PetscFree(l);CHKERRQ(ierr);
1129dbd8c25aSHong Zhang 
1130dbd8c25aSHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr);
1131901853e0SKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatSeqDenseSetPreallocation_C","",PETSC_NULL);CHKERRQ(ierr);
11324ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMult_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr);
11334ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr);
11344ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr);
11353a40ed3dSBarry Smith   PetscFunctionReturn(0);
1136289bc588SBarry Smith }
1137289bc588SBarry Smith 
11384a2ae208SSatish Balay #undef __FUNCT__
11394a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense"
1140fc4dec0aSBarry Smith PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout)
1141289bc588SBarry Smith {
1142c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
11436849ba73SBarry Smith   PetscErrorCode ierr;
114413f74950SBarry Smith   PetscInt       k,j,m,n,M;
114587828ca2SBarry Smith   PetscScalar    *v,tmp;
114648b35521SBarry Smith 
11473a40ed3dSBarry Smith   PetscFunctionBegin;
1148d0f46423SBarry Smith   v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n;
1149e9695a30SBarry Smith   if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */
1150e7e72b3dSBarry Smith     if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place");
1151e7e72b3dSBarry Smith     else {
1152d3e5ee88SLois Curfman McInnes       for (j=0; j<m; j++) {
1153289bc588SBarry Smith         for (k=0; k<j; k++) {
11541b807ce4Svictorle           tmp = v[j + k*M];
11551b807ce4Svictorle           v[j + k*M] = v[k + j*M];
11561b807ce4Svictorle           v[k + j*M] = tmp;
1157289bc588SBarry Smith         }
1158289bc588SBarry Smith       }
1159d64ed03dSBarry Smith     }
11603a40ed3dSBarry Smith   } else { /* out-of-place transpose */
1161d3e5ee88SLois Curfman McInnes     Mat          tmat;
1162ec8511deSBarry Smith     Mat_SeqDense *tmatd;
116387828ca2SBarry Smith     PetscScalar  *v2;
1164ea709b57SSatish Balay 
1165fc4dec0aSBarry Smith     if (reuse == MAT_INITIAL_MATRIX) {
11667adad957SLisandro Dalcin       ierr  = MatCreate(((PetscObject)A)->comm,&tmat);CHKERRQ(ierr);
1167d0f46423SBarry Smith       ierr  = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr);
11687adad957SLisandro Dalcin       ierr  = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
11695c5985e7SKris Buschelman       ierr  = MatSeqDenseSetPreallocation(tmat,PETSC_NULL);CHKERRQ(ierr);
1170fc4dec0aSBarry Smith     } else {
1171fc4dec0aSBarry Smith       tmat = *matout;
1172fc4dec0aSBarry Smith     }
1173ec8511deSBarry Smith     tmatd = (Mat_SeqDense*)tmat->data;
11740de55854SLois Curfman McInnes     v = mat->v; v2 = tmatd->v;
1175d3e5ee88SLois Curfman McInnes     for (j=0; j<n; j++) {
11761b807ce4Svictorle       for (k=0; k<m; k++) v2[j + k*n] = v[k + j*M];
1177d3e5ee88SLois Curfman McInnes     }
11786d4a8577SBarry Smith     ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
11796d4a8577SBarry Smith     ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1180d3e5ee88SLois Curfman McInnes     *matout = tmat;
118148b35521SBarry Smith   }
11823a40ed3dSBarry Smith   PetscFunctionReturn(0);
1183289bc588SBarry Smith }
1184289bc588SBarry Smith 
11854a2ae208SSatish Balay #undef __FUNCT__
11864a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense"
1187ace3abfcSBarry Smith PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool  *flg)
1188289bc588SBarry Smith {
1189c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data;
1190c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data;
119113f74950SBarry Smith   PetscInt     i,j;
119287828ca2SBarry Smith   PetscScalar  *v1 = mat1->v,*v2 = mat2->v;
11939ea5d5aeSSatish Balay 
11943a40ed3dSBarry Smith   PetscFunctionBegin;
1195d0f46423SBarry Smith   if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1196d0f46423SBarry Smith   if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1197d0f46423SBarry Smith   for (i=0; i<A1->rmap->n; i++) {
11981b807ce4Svictorle     v1 = mat1->v+i; v2 = mat2->v+i;
1199d0f46423SBarry Smith     for (j=0; j<A1->cmap->n; j++) {
12003a40ed3dSBarry Smith       if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
12011b807ce4Svictorle       v1 += mat1->lda; v2 += mat2->lda;
12021b807ce4Svictorle     }
1203289bc588SBarry Smith   }
120477c4ece6SBarry Smith   *flg = PETSC_TRUE;
12053a40ed3dSBarry Smith   PetscFunctionReturn(0);
1206289bc588SBarry Smith }
1207289bc588SBarry Smith 
12084a2ae208SSatish Balay #undef __FUNCT__
12094a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense"
1210dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v)
1211289bc588SBarry Smith {
1212c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
1213dfbe8321SBarry Smith   PetscErrorCode ierr;
121413f74950SBarry Smith   PetscInt       i,n,len;
121587828ca2SBarry Smith   PetscScalar    *x,zero = 0.0;
121644cd7ae7SLois Curfman McInnes 
12173a40ed3dSBarry Smith   PetscFunctionBegin;
12182dcb1b2aSMatthew Knepley   ierr = VecSet(v,zero);CHKERRQ(ierr);
12197a97a34bSBarry Smith   ierr = VecGetSize(v,&n);CHKERRQ(ierr);
12201ebc52fbSHong Zhang   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1221d0f46423SBarry Smith   len = PetscMin(A->rmap->n,A->cmap->n);
1222e32f2f54SBarry Smith   if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec");
122344cd7ae7SLois Curfman McInnes   for (i=0; i<len; i++) {
12241b807ce4Svictorle     x[i] = mat->v[i*mat->lda + i];
1225289bc588SBarry Smith   }
12261ebc52fbSHong Zhang   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
12273a40ed3dSBarry Smith   PetscFunctionReturn(0);
1228289bc588SBarry Smith }
1229289bc588SBarry Smith 
12304a2ae208SSatish Balay #undef __FUNCT__
12314a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense"
1232dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr)
1233289bc588SBarry Smith {
1234c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
123587828ca2SBarry Smith   PetscScalar    *l,*r,x,*v;
1236dfbe8321SBarry Smith   PetscErrorCode ierr;
1237d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n;
123855659b69SBarry Smith 
12393a40ed3dSBarry Smith   PetscFunctionBegin;
124028988994SBarry Smith   if (ll) {
12417a97a34bSBarry Smith     ierr = VecGetSize(ll,&m);CHKERRQ(ierr);
12421ebc52fbSHong Zhang     ierr = VecGetArray(ll,&l);CHKERRQ(ierr);
1243e32f2f54SBarry Smith     if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size");
1244da3a660dSBarry Smith     for (i=0; i<m; i++) {
1245da3a660dSBarry Smith       x = l[i];
1246da3a660dSBarry Smith       v = mat->v + i;
1247da3a660dSBarry Smith       for (j=0; j<n; j++) { (*v) *= x; v+= m;}
1248da3a660dSBarry Smith     }
12491ebc52fbSHong Zhang     ierr = VecRestoreArray(ll,&l);CHKERRQ(ierr);
1250efee365bSSatish Balay     ierr = PetscLogFlops(n*m);CHKERRQ(ierr);
1251da3a660dSBarry Smith   }
125228988994SBarry Smith   if (rr) {
12537a97a34bSBarry Smith     ierr = VecGetSize(rr,&n);CHKERRQ(ierr);
12541ebc52fbSHong Zhang     ierr = VecGetArray(rr,&r);CHKERRQ(ierr);
1255e32f2f54SBarry Smith     if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size");
1256da3a660dSBarry Smith     for (i=0; i<n; i++) {
1257da3a660dSBarry Smith       x = r[i];
1258da3a660dSBarry Smith       v = mat->v + i*m;
1259da3a660dSBarry Smith       for (j=0; j<m; j++) { (*v++) *= x;}
1260da3a660dSBarry Smith     }
12611ebc52fbSHong Zhang     ierr = VecRestoreArray(rr,&r);CHKERRQ(ierr);
1262efee365bSSatish Balay     ierr = PetscLogFlops(n*m);CHKERRQ(ierr);
1263da3a660dSBarry Smith   }
12643a40ed3dSBarry Smith   PetscFunctionReturn(0);
1265289bc588SBarry Smith }
1266289bc588SBarry Smith 
12674a2ae208SSatish Balay #undef __FUNCT__
12684a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense"
1269dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm)
1270289bc588SBarry Smith {
1271c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
127287828ca2SBarry Smith   PetscScalar  *v = mat->v;
1273329f5518SBarry Smith   PetscReal    sum = 0.0;
1274d0f46423SBarry Smith   PetscInt     lda=mat->lda,m=A->rmap->n,i,j;
1275efee365bSSatish Balay   PetscErrorCode ierr;
127655659b69SBarry Smith 
12773a40ed3dSBarry Smith   PetscFunctionBegin;
1278289bc588SBarry Smith   if (type == NORM_FROBENIUS) {
1279a5ce6ee0Svictorle     if (lda>m) {
1280d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1281a5ce6ee0Svictorle 	v = mat->v+j*lda;
1282a5ce6ee0Svictorle 	for (i=0; i<m; i++) {
1283a5ce6ee0Svictorle #if defined(PETSC_USE_COMPLEX)
1284a5ce6ee0Svictorle 	  sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1285a5ce6ee0Svictorle #else
1286a5ce6ee0Svictorle 	  sum += (*v)*(*v); v++;
1287a5ce6ee0Svictorle #endif
1288a5ce6ee0Svictorle 	}
1289a5ce6ee0Svictorle       }
1290a5ce6ee0Svictorle     } else {
1291d0f46423SBarry Smith       for (i=0; i<A->cmap->n*A->rmap->n; i++) {
1292aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
1293329f5518SBarry Smith 	sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1294289bc588SBarry Smith #else
1295289bc588SBarry Smith 	sum += (*v)*(*v); v++;
1296289bc588SBarry Smith #endif
1297289bc588SBarry Smith       }
1298a5ce6ee0Svictorle     }
1299064f8208SBarry Smith     *nrm = sqrt(sum);
1300dc0b31edSSatish Balay     ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
13013a40ed3dSBarry Smith   } else if (type == NORM_1) {
1302064f8208SBarry Smith     *nrm = 0.0;
1303d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
13041b807ce4Svictorle       v = mat->v + j*mat->lda;
1305289bc588SBarry Smith       sum = 0.0;
1306d0f46423SBarry Smith       for (i=0; i<A->rmap->n; i++) {
130733a8263dSBarry Smith         sum += PetscAbsScalar(*v);  v++;
1308289bc588SBarry Smith       }
1309064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1310289bc588SBarry Smith     }
1311d0f46423SBarry Smith     ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr);
13123a40ed3dSBarry Smith   } else if (type == NORM_INFINITY) {
1313064f8208SBarry Smith     *nrm = 0.0;
1314d0f46423SBarry Smith     for (j=0; j<A->rmap->n; j++) {
1315289bc588SBarry Smith       v = mat->v + j;
1316289bc588SBarry Smith       sum = 0.0;
1317d0f46423SBarry Smith       for (i=0; i<A->cmap->n; i++) {
13181b807ce4Svictorle         sum += PetscAbsScalar(*v); v += mat->lda;
1319289bc588SBarry Smith       }
1320064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1321289bc588SBarry Smith     }
1322d0f46423SBarry Smith     ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr);
1323e7e72b3dSBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm");
13243a40ed3dSBarry Smith   PetscFunctionReturn(0);
1325289bc588SBarry Smith }
1326289bc588SBarry Smith 
13274a2ae208SSatish Balay #undef __FUNCT__
13284a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense"
1329ace3abfcSBarry Smith PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool  flg)
1330289bc588SBarry Smith {
1331c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *aij = (Mat_SeqDense*)A->data;
133263ba0a88SBarry Smith   PetscErrorCode ierr;
133367e560aaSBarry Smith 
13343a40ed3dSBarry Smith   PetscFunctionBegin;
1335b5a2b587SKris Buschelman   switch (op) {
1336b5a2b587SKris Buschelman   case MAT_ROW_ORIENTED:
13374e0d8c25SBarry Smith     aij->roworiented = flg;
1338b5a2b587SKris Buschelman     break;
1339512a5fc5SBarry Smith   case MAT_NEW_NONZERO_LOCATIONS:
1340b5a2b587SKris Buschelman   case MAT_NEW_NONZERO_LOCATION_ERR:
13413971808eSMatthew Knepley   case MAT_NEW_NONZERO_ALLOCATION_ERR:
13424e0d8c25SBarry Smith   case MAT_NEW_DIAGONALS:
1343b5a2b587SKris Buschelman   case MAT_IGNORE_OFF_PROC_ENTRIES:
1344b5a2b587SKris Buschelman   case MAT_USE_HASH_TABLE:
134577e54ba9SKris Buschelman   case MAT_SYMMETRIC:
134677e54ba9SKris Buschelman   case MAT_STRUCTURALLY_SYMMETRIC:
13479a4540c5SBarry Smith   case MAT_HERMITIAN:
13489a4540c5SBarry Smith   case MAT_SYMMETRY_ETERNAL:
1349600fe468SBarry Smith   case MAT_IGNORE_LOWER_TRIANGULAR:
1350290bbb0aSBarry Smith     ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr);
135177e54ba9SKris Buschelman     break;
1352b5a2b587SKris Buschelman   default:
1353e32f2f54SBarry Smith     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]);
13543a40ed3dSBarry Smith   }
13553a40ed3dSBarry Smith   PetscFunctionReturn(0);
1356289bc588SBarry Smith }
1357289bc588SBarry Smith 
13584a2ae208SSatish Balay #undef __FUNCT__
13594a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense"
1360dfbe8321SBarry Smith PetscErrorCode MatZeroEntries_SeqDense(Mat A)
13616f0a148fSBarry Smith {
1362ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)A->data;
13636849ba73SBarry Smith   PetscErrorCode ierr;
1364d0f46423SBarry Smith   PetscInt       lda=l->lda,m=A->rmap->n,j;
13653a40ed3dSBarry Smith 
13663a40ed3dSBarry Smith   PetscFunctionBegin;
1367a5ce6ee0Svictorle   if (lda>m) {
1368d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1369a5ce6ee0Svictorle       ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
1370a5ce6ee0Svictorle     }
1371a5ce6ee0Svictorle   } else {
1372d0f46423SBarry Smith     ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1373a5ce6ee0Svictorle   }
13743a40ed3dSBarry Smith   PetscFunctionReturn(0);
13756f0a148fSBarry Smith }
13766f0a148fSBarry Smith 
13774a2ae208SSatish Balay #undef __FUNCT__
13784a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense"
13792b40b63fSBarry Smith PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b)
13806f0a148fSBarry Smith {
138197b48c8fSBarry Smith   PetscErrorCode    ierr;
1382ec8511deSBarry Smith   Mat_SeqDense      *l = (Mat_SeqDense*)A->data;
1383d0f46423SBarry Smith   PetscInt          n = A->cmap->n,i,j;
138497b48c8fSBarry Smith   PetscScalar       *slot,*bb;
138597b48c8fSBarry Smith   const PetscScalar *xx;
138655659b69SBarry Smith 
13873a40ed3dSBarry Smith   PetscFunctionBegin;
138897b48c8fSBarry Smith   /* fix right hand side if needed */
138997b48c8fSBarry Smith   if (x && b) {
139097b48c8fSBarry Smith     ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr);
139197b48c8fSBarry Smith     ierr = VecGetArray(b,&bb);CHKERRQ(ierr);
139297b48c8fSBarry Smith     for (i=0; i<N; i++) {
139397b48c8fSBarry Smith       bb[rows[i]] = diag*xx[rows[i]];
139497b48c8fSBarry Smith     }
139597b48c8fSBarry Smith     ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr);
139697b48c8fSBarry Smith     ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr);
139797b48c8fSBarry Smith   }
139897b48c8fSBarry Smith 
13996f0a148fSBarry Smith   for (i=0; i<N; i++) {
14006f0a148fSBarry Smith     slot = l->v + rows[i];
14016f0a148fSBarry Smith     for (j=0; j<n; j++) { *slot = 0.0; slot += n;}
14026f0a148fSBarry Smith   }
1403f4df32b1SMatthew Knepley   if (diag != 0.0) {
14046f0a148fSBarry Smith     for (i=0; i<N; i++) {
14056f0a148fSBarry Smith       slot = l->v + (n+1)*rows[i];
1406f4df32b1SMatthew Knepley       *slot = diag;
14076f0a148fSBarry Smith     }
14086f0a148fSBarry Smith   }
14093a40ed3dSBarry Smith   PetscFunctionReturn(0);
14106f0a148fSBarry Smith }
1411557bce09SLois Curfman McInnes 
14124a2ae208SSatish Balay #undef __FUNCT__
14134a2ae208SSatish Balay #define __FUNCT__ "MatGetArray_SeqDense"
1414dfbe8321SBarry Smith PetscErrorCode MatGetArray_SeqDense(Mat A,PetscScalar *array[])
141564e87e97SBarry Smith {
1416c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
14173a40ed3dSBarry Smith 
14183a40ed3dSBarry Smith   PetscFunctionBegin;
1419e32f2f54SBarry Smith   if (mat->lda != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get array for Dense matrices with LDA different from number of rows");
142064e87e97SBarry Smith   *array = mat->v;
14213a40ed3dSBarry Smith   PetscFunctionReturn(0);
142264e87e97SBarry Smith }
14230754003eSLois Curfman McInnes 
14244a2ae208SSatish Balay #undef __FUNCT__
14254a2ae208SSatish Balay #define __FUNCT__ "MatRestoreArray_SeqDense"
1426dfbe8321SBarry Smith PetscErrorCode MatRestoreArray_SeqDense(Mat A,PetscScalar *array[])
1427ff14e315SSatish Balay {
14283a40ed3dSBarry Smith   PetscFunctionBegin;
142909b544d4SBarry Smith   *array = 0; /* user cannot accidently use the array later */
14303a40ed3dSBarry Smith   PetscFunctionReturn(0);
1431ff14e315SSatish Balay }
14320754003eSLois Curfman McInnes 
14334a2ae208SSatish Balay #undef __FUNCT__
14344a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense"
143513f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B)
14360754003eSLois Curfman McInnes {
1437c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
14386849ba73SBarry Smith   PetscErrorCode ierr;
14395d0c19d7SBarry Smith   PetscInt       i,j,nrows,ncols;
14405d0c19d7SBarry Smith   const PetscInt *irow,*icol;
144187828ca2SBarry Smith   PetscScalar    *av,*bv,*v = mat->v;
14420754003eSLois Curfman McInnes   Mat            newmat;
14430754003eSLois Curfman McInnes 
14443a40ed3dSBarry Smith   PetscFunctionBegin;
144578b31e54SBarry Smith   ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr);
144678b31e54SBarry Smith   ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr);
1447e03a110bSBarry Smith   ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr);
1448e03a110bSBarry Smith   ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr);
14490754003eSLois Curfman McInnes 
1450182d2002SSatish Balay   /* Check submatrixcall */
1451182d2002SSatish Balay   if (scall == MAT_REUSE_MATRIX) {
145213f74950SBarry Smith     PetscInt n_cols,n_rows;
1453182d2002SSatish Balay     ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr);
145421a2c019SBarry Smith     if (n_rows != nrows || n_cols != ncols) {
1455f746d493SDmitry Karpeev       /* resize the result matrix to match number of requested rows/columns */
1456c61587bbSBarry Smith       ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
145721a2c019SBarry Smith     }
1458182d2002SSatish Balay     newmat = *B;
1459182d2002SSatish Balay   } else {
14600754003eSLois Curfman McInnes     /* Create and fill new matrix */
14617adad957SLisandro Dalcin     ierr = MatCreate(((PetscObject)A)->comm,&newmat);CHKERRQ(ierr);
1462f69a0ea3SMatthew Knepley     ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
14637adad957SLisandro Dalcin     ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
14645c5985e7SKris Buschelman     ierr = MatSeqDenseSetPreallocation(newmat,PETSC_NULL);CHKERRQ(ierr);
1465182d2002SSatish Balay   }
1466182d2002SSatish Balay 
1467182d2002SSatish Balay   /* Now extract the data pointers and do the copy,column at a time */
1468182d2002SSatish Balay   bv = ((Mat_SeqDense*)newmat->data)->v;
1469182d2002SSatish Balay 
1470182d2002SSatish Balay   for (i=0; i<ncols; i++) {
14716de62eeeSBarry Smith     av = v + mat->lda*icol[i];
1472182d2002SSatish Balay     for (j=0; j<nrows; j++) {
1473182d2002SSatish Balay       *bv++ = av[irow[j]];
14740754003eSLois Curfman McInnes     }
14750754003eSLois Curfman McInnes   }
1476182d2002SSatish Balay 
1477182d2002SSatish Balay   /* Assemble the matrices so that the correct flags are set */
14786d4a8577SBarry Smith   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
14796d4a8577SBarry Smith   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
14800754003eSLois Curfman McInnes 
14810754003eSLois Curfman McInnes   /* Free work space */
148278b31e54SBarry Smith   ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr);
148378b31e54SBarry Smith   ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr);
1484182d2002SSatish Balay   *B = newmat;
14853a40ed3dSBarry Smith   PetscFunctionReturn(0);
14860754003eSLois Curfman McInnes }
14870754003eSLois Curfman McInnes 
14884a2ae208SSatish Balay #undef __FUNCT__
14894a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense"
149013f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[])
1491905e6a2fSBarry Smith {
14926849ba73SBarry Smith   PetscErrorCode ierr;
149313f74950SBarry Smith   PetscInt       i;
1494905e6a2fSBarry Smith 
14953a40ed3dSBarry Smith   PetscFunctionBegin;
1496905e6a2fSBarry Smith   if (scall == MAT_INITIAL_MATRIX) {
1497b0a32e0cSBarry Smith     ierr = PetscMalloc((n+1)*sizeof(Mat),B);CHKERRQ(ierr);
1498905e6a2fSBarry Smith   }
1499905e6a2fSBarry Smith 
1500905e6a2fSBarry Smith   for (i=0; i<n; i++) {
15016a6a5d1dSBarry Smith     ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr);
1502905e6a2fSBarry Smith   }
15033a40ed3dSBarry Smith   PetscFunctionReturn(0);
1504905e6a2fSBarry Smith }
1505905e6a2fSBarry Smith 
15064a2ae208SSatish Balay #undef __FUNCT__
1507c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense"
1508c0aa2d19SHong Zhang PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode)
1509c0aa2d19SHong Zhang {
1510c0aa2d19SHong Zhang   PetscFunctionBegin;
1511c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1512c0aa2d19SHong Zhang }
1513c0aa2d19SHong Zhang 
1514c0aa2d19SHong Zhang #undef __FUNCT__
1515c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense"
1516c0aa2d19SHong Zhang PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode)
1517c0aa2d19SHong Zhang {
1518c0aa2d19SHong Zhang   PetscFunctionBegin;
1519c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1520c0aa2d19SHong Zhang }
1521c0aa2d19SHong Zhang 
1522c0aa2d19SHong Zhang #undef __FUNCT__
15234a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense"
1524dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str)
15254b0e389bSBarry Smith {
15264b0e389bSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense *)B->data;
15276849ba73SBarry Smith   PetscErrorCode ierr;
1528d0f46423SBarry Smith   PetscInt       lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j;
15293a40ed3dSBarry Smith 
15303a40ed3dSBarry Smith   PetscFunctionBegin;
153133f4a19fSKris Buschelman   /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */
153233f4a19fSKris Buschelman   if (A->ops->copy != B->ops->copy) {
1533cb5b572fSBarry Smith     ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr);
15343a40ed3dSBarry Smith     PetscFunctionReturn(0);
15353a40ed3dSBarry Smith   }
1536e32f2f54SBarry Smith   if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)");
1537a5ce6ee0Svictorle   if (lda1>m || lda2>m) {
15380dbb7854Svictorle     for (j=0; j<n; j++) {
1539a5ce6ee0Svictorle       ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr);
1540a5ce6ee0Svictorle     }
1541a5ce6ee0Svictorle   } else {
1542d0f46423SBarry Smith     ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1543a5ce6ee0Svictorle   }
1544273d9f13SBarry Smith   PetscFunctionReturn(0);
1545273d9f13SBarry Smith }
1546273d9f13SBarry Smith 
15474a2ae208SSatish Balay #undef __FUNCT__
15484a2ae208SSatish Balay #define __FUNCT__ "MatSetUpPreallocation_SeqDense"
1549dfbe8321SBarry Smith PetscErrorCode MatSetUpPreallocation_SeqDense(Mat A)
1550273d9f13SBarry Smith {
1551dfbe8321SBarry Smith   PetscErrorCode ierr;
1552273d9f13SBarry Smith 
1553273d9f13SBarry Smith   PetscFunctionBegin;
1554273d9f13SBarry Smith   ierr =  MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr);
15553a40ed3dSBarry Smith   PetscFunctionReturn(0);
15564b0e389bSBarry Smith }
15574b0e389bSBarry Smith 
1558284134d9SBarry Smith #undef __FUNCT__
1559284134d9SBarry Smith #define __FUNCT__ "MatSetSizes_SeqDense"
1560284134d9SBarry Smith PetscErrorCode MatSetSizes_SeqDense(Mat A,PetscInt m,PetscInt n,PetscInt M,PetscInt N)
1561284134d9SBarry Smith {
1562284134d9SBarry Smith   PetscFunctionBegin;
156321a2c019SBarry Smith   /* this will not be called before lda, Mmax,  and Nmax have been set */
1564284134d9SBarry Smith   m = PetscMax(m,M);
1565284134d9SBarry Smith   n = PetscMax(n,N);
1566a868139aSShri Abhyankar 
156786d161a7SShri Abhyankar   /*  if (m > a->Mmax) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot yet resize number rows of dense matrix larger then its initial size %d, requested %d",a->lda,(int)m);
156886d161a7SShri Abhyankar     if (n > a->Nmax) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot yet resize number columns of dense matrix larger then its initial size %d, requested %d",a->Nmax,(int)n);
156986d161a7SShri Abhyankar   */
1570dc5cefdeSJed Brown   A->rmap->n = A->rmap->N = m;
1571d0f46423SBarry Smith   A->cmap->n = A->cmap->N = n;
1572284134d9SBarry Smith   PetscFunctionReturn(0);
1573284134d9SBarry Smith }
1574170fe5c8SBarry Smith 
1575ba337c44SJed Brown #undef __FUNCT__
1576ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense"
1577ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A)
1578ba337c44SJed Brown {
1579ba337c44SJed Brown   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1580ba337c44SJed Brown   PetscInt       i,nz = A->rmap->n*A->cmap->n;
1581ba337c44SJed Brown   PetscScalar    *aa = a->v;
1582ba337c44SJed Brown 
1583ba337c44SJed Brown   PetscFunctionBegin;
1584ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]);
1585ba337c44SJed Brown   PetscFunctionReturn(0);
1586ba337c44SJed Brown }
1587ba337c44SJed Brown 
1588ba337c44SJed Brown #undef __FUNCT__
1589ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense"
1590ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A)
1591ba337c44SJed Brown {
1592ba337c44SJed Brown   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1593ba337c44SJed Brown   PetscInt       i,nz = A->rmap->n*A->cmap->n;
1594ba337c44SJed Brown   PetscScalar    *aa = a->v;
1595ba337c44SJed Brown 
1596ba337c44SJed Brown   PetscFunctionBegin;
1597ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]);
1598ba337c44SJed Brown   PetscFunctionReturn(0);
1599ba337c44SJed Brown }
1600ba337c44SJed Brown 
1601ba337c44SJed Brown #undef __FUNCT__
1602ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense"
1603ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A)
1604ba337c44SJed Brown {
1605ba337c44SJed Brown   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1606ba337c44SJed Brown   PetscInt       i,nz = A->rmap->n*A->cmap->n;
1607ba337c44SJed Brown   PetscScalar    *aa = a->v;
1608ba337c44SJed Brown 
1609ba337c44SJed Brown   PetscFunctionBegin;
1610ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]);
1611ba337c44SJed Brown   PetscFunctionReturn(0);
1612ba337c44SJed Brown }
1613284134d9SBarry Smith 
1614a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/
1615a9fe9ddaSSatish Balay #undef __FUNCT__
1616a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense"
1617a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1618a9fe9ddaSSatish Balay {
1619a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1620a9fe9ddaSSatish Balay 
1621a9fe9ddaSSatish Balay   PetscFunctionBegin;
1622a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX){
1623a9fe9ddaSSatish Balay     ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
1624a9fe9ddaSSatish Balay   }
1625a9fe9ddaSSatish Balay   ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
1626a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1627a9fe9ddaSSatish Balay }
1628a9fe9ddaSSatish Balay 
1629a9fe9ddaSSatish Balay #undef __FUNCT__
1630a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense"
1631a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1632a9fe9ddaSSatish Balay {
1633ee16a9a1SHong Zhang   PetscErrorCode ierr;
1634d0f46423SBarry Smith   PetscInt       m=A->rmap->n,n=B->cmap->n;
1635ee16a9a1SHong Zhang   Mat            Cmat;
1636a9fe9ddaSSatish Balay 
1637ee16a9a1SHong Zhang   PetscFunctionBegin;
1638e32f2f54SBarry Smith   if (A->cmap->n != B->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"A->cmap->n %d != B->rmap->n %d\n",A->cmap->n,B->rmap->n);
1639ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1640ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1641ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
1642ee16a9a1SHong Zhang   ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr);
1643ee16a9a1SHong Zhang   Cmat->assembled = PETSC_TRUE;
1644ee16a9a1SHong Zhang   *C = Cmat;
1645ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1646ee16a9a1SHong Zhang }
1647a9fe9ddaSSatish Balay 
164898a3b096SSatish Balay #undef __FUNCT__
1649a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense"
1650a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1651a9fe9ddaSSatish Balay {
1652a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1653a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1654a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
16550805154bSBarry Smith   PetscBLASInt   m,n,k;
1656a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1657a9fe9ddaSSatish Balay 
1658a9fe9ddaSSatish Balay   PetscFunctionBegin;
1659d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
1660d0f46423SBarry Smith   n = PetscBLASIntCast(B->cmap->n);
1661d0f46423SBarry Smith   k = PetscBLASIntCast(A->cmap->n);
1662a9fe9ddaSSatish Balay   BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda);
1663a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1664a9fe9ddaSSatish Balay }
1665a9fe9ddaSSatish Balay 
1666a9fe9ddaSSatish Balay #undef __FUNCT__
1667a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultTranspose_SeqDense_SeqDense"
1668a9fe9ddaSSatish Balay PetscErrorCode MatMatMultTranspose_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1669a9fe9ddaSSatish Balay {
1670a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1671a9fe9ddaSSatish Balay 
1672a9fe9ddaSSatish Balay   PetscFunctionBegin;
1673a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX){
1674a9fe9ddaSSatish Balay     ierr = MatMatMultTransposeSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
1675a9fe9ddaSSatish Balay   }
1676a9fe9ddaSSatish Balay   ierr = MatMatMultTransposeNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
1677a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1678a9fe9ddaSSatish Balay }
1679a9fe9ddaSSatish Balay 
1680a9fe9ddaSSatish Balay #undef __FUNCT__
1681a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultTransposeSymbolic_SeqDense_SeqDense"
1682a9fe9ddaSSatish Balay PetscErrorCode MatMatMultTransposeSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1683a9fe9ddaSSatish Balay {
1684ee16a9a1SHong Zhang   PetscErrorCode ierr;
1685d0f46423SBarry Smith   PetscInt       m=A->cmap->n,n=B->cmap->n;
1686ee16a9a1SHong Zhang   Mat            Cmat;
1687a9fe9ddaSSatish Balay 
1688ee16a9a1SHong Zhang   PetscFunctionBegin;
1689e32f2f54SBarry Smith   if (A->rmap->n != B->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"A->rmap->n %d != B->rmap->n %d\n",A->rmap->n,B->rmap->n);
1690ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1691ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1692ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
1693ee16a9a1SHong Zhang   ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr);
1694ee16a9a1SHong Zhang   Cmat->assembled = PETSC_TRUE;
1695ee16a9a1SHong Zhang   *C = Cmat;
1696ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1697ee16a9a1SHong Zhang }
1698a9fe9ddaSSatish Balay 
1699a9fe9ddaSSatish Balay #undef __FUNCT__
1700a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultTransposeNumeric_SeqDense_SeqDense"
1701a9fe9ddaSSatish Balay PetscErrorCode MatMatMultTransposeNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1702a9fe9ddaSSatish Balay {
1703a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1704a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1705a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
17060805154bSBarry Smith   PetscBLASInt   m,n,k;
1707a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1708a9fe9ddaSSatish Balay 
1709a9fe9ddaSSatish Balay   PetscFunctionBegin;
1710d0f46423SBarry Smith   m = PetscBLASIntCast(A->cmap->n);
1711d0f46423SBarry Smith   n = PetscBLASIntCast(B->cmap->n);
1712d0f46423SBarry Smith   k = PetscBLASIntCast(A->rmap->n);
17132fbe02b9SBarry Smith   /*
17142fbe02b9SBarry Smith      Note the m and n arguments below are the number rows and columns of A', not A!
17152fbe02b9SBarry Smith   */
1716a9fe9ddaSSatish Balay   BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda);
1717a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1718a9fe9ddaSSatish Balay }
1719985db425SBarry Smith 
1720985db425SBarry Smith #undef __FUNCT__
1721985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense"
1722985db425SBarry Smith PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[])
1723985db425SBarry Smith {
1724985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1725985db425SBarry Smith   PetscErrorCode ierr;
1726d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1727985db425SBarry Smith   PetscScalar    *x;
1728985db425SBarry Smith   MatScalar      *aa = a->v;
1729985db425SBarry Smith 
1730985db425SBarry Smith   PetscFunctionBegin;
1731e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1732985db425SBarry Smith 
1733985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1734985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1735985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1736e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1737985db425SBarry Smith   for (i=0; i<m; i++) {
1738985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1739985db425SBarry Smith     for (j=1; j<n; j++){
1740985db425SBarry Smith       if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1741985db425SBarry Smith     }
1742985db425SBarry Smith   }
1743985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1744985db425SBarry Smith   PetscFunctionReturn(0);
1745985db425SBarry Smith }
1746985db425SBarry Smith 
1747985db425SBarry Smith #undef __FUNCT__
1748985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense"
1749985db425SBarry Smith PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[])
1750985db425SBarry Smith {
1751985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1752985db425SBarry Smith   PetscErrorCode ierr;
1753d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1754985db425SBarry Smith   PetscScalar    *x;
1755985db425SBarry Smith   PetscReal      atmp;
1756985db425SBarry Smith   MatScalar      *aa = a->v;
1757985db425SBarry Smith 
1758985db425SBarry Smith   PetscFunctionBegin;
1759e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1760985db425SBarry Smith 
1761985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1762985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1763985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1764e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1765985db425SBarry Smith   for (i=0; i<m; i++) {
17669189402eSHong Zhang     x[i] = PetscAbsScalar(aa[i]);
1767985db425SBarry Smith     for (j=1; j<n; j++){
1768985db425SBarry Smith       atmp = PetscAbsScalar(aa[i+m*j]);
1769985db425SBarry Smith       if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;}
1770985db425SBarry Smith     }
1771985db425SBarry Smith   }
1772985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1773985db425SBarry Smith   PetscFunctionReturn(0);
1774985db425SBarry Smith }
1775985db425SBarry Smith 
1776985db425SBarry Smith #undef __FUNCT__
1777985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense"
1778985db425SBarry Smith PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[])
1779985db425SBarry Smith {
1780985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1781985db425SBarry Smith   PetscErrorCode ierr;
1782d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1783985db425SBarry Smith   PetscScalar    *x;
1784985db425SBarry Smith   MatScalar      *aa = a->v;
1785985db425SBarry Smith 
1786985db425SBarry Smith   PetscFunctionBegin;
1787e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1788985db425SBarry Smith 
1789985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1790985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1791985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1792e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1793985db425SBarry Smith   for (i=0; i<m; i++) {
1794985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1795985db425SBarry Smith     for (j=1; j<n; j++){
1796985db425SBarry Smith       if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1797985db425SBarry Smith     }
1798985db425SBarry Smith   }
1799985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1800985db425SBarry Smith   PetscFunctionReturn(0);
1801985db425SBarry Smith }
1802985db425SBarry Smith 
18038d0534beSBarry Smith #undef __FUNCT__
18048d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense"
18058d0534beSBarry Smith PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col)
18068d0534beSBarry Smith {
18078d0534beSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
18088d0534beSBarry Smith   PetscErrorCode ierr;
18098d0534beSBarry Smith   PetscScalar    *x;
18108d0534beSBarry Smith 
18118d0534beSBarry Smith   PetscFunctionBegin;
1812e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
18138d0534beSBarry Smith 
18148d0534beSBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1815d0f46423SBarry Smith   ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
18168d0534beSBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
18178d0534beSBarry Smith   PetscFunctionReturn(0);
18188d0534beSBarry Smith }
18198d0534beSBarry Smith 
1820289bc588SBarry Smith /* -------------------------------------------------------------------*/
1821a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = {MatSetValues_SeqDense,
1822905e6a2fSBarry Smith        MatGetRow_SeqDense,
1823905e6a2fSBarry Smith        MatRestoreRow_SeqDense,
1824905e6a2fSBarry Smith        MatMult_SeqDense,
182597304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense,
18267c922b88SBarry Smith        MatMultTranspose_SeqDense,
18277c922b88SBarry Smith        MatMultTransposeAdd_SeqDense,
1828db4efbfdSBarry Smith        0,
1829db4efbfdSBarry Smith        0,
1830db4efbfdSBarry Smith        0,
1831db4efbfdSBarry Smith /*10*/ 0,
1832905e6a2fSBarry Smith        MatLUFactor_SeqDense,
1833905e6a2fSBarry Smith        MatCholeskyFactor_SeqDense,
183441f059aeSBarry Smith        MatSOR_SeqDense,
1835ec8511deSBarry Smith        MatTranspose_SeqDense,
183697304618SKris Buschelman /*15*/ MatGetInfo_SeqDense,
1837905e6a2fSBarry Smith        MatEqual_SeqDense,
1838905e6a2fSBarry Smith        MatGetDiagonal_SeqDense,
1839905e6a2fSBarry Smith        MatDiagonalScale_SeqDense,
1840905e6a2fSBarry Smith        MatNorm_SeqDense,
1841c0aa2d19SHong Zhang /*20*/ MatAssemblyBegin_SeqDense,
1842c0aa2d19SHong Zhang        MatAssemblyEnd_SeqDense,
1843905e6a2fSBarry Smith        MatSetOption_SeqDense,
1844905e6a2fSBarry Smith        MatZeroEntries_SeqDense,
1845d519adbfSMatthew Knepley /*24*/ MatZeroRows_SeqDense,
1846db4efbfdSBarry Smith        0,
1847db4efbfdSBarry Smith        0,
1848db4efbfdSBarry Smith        0,
1849db4efbfdSBarry Smith        0,
1850d519adbfSMatthew Knepley /*29*/ MatSetUpPreallocation_SeqDense,
1851273d9f13SBarry Smith        0,
1852905e6a2fSBarry Smith        0,
1853905e6a2fSBarry Smith        MatGetArray_SeqDense,
1854905e6a2fSBarry Smith        MatRestoreArray_SeqDense,
1855d519adbfSMatthew Knepley /*34*/ MatDuplicate_SeqDense,
1856a5ae1ecdSBarry Smith        0,
1857a5ae1ecdSBarry Smith        0,
1858a5ae1ecdSBarry Smith        0,
1859a5ae1ecdSBarry Smith        0,
1860d519adbfSMatthew Knepley /*39*/ MatAXPY_SeqDense,
1861a5ae1ecdSBarry Smith        MatGetSubMatrices_SeqDense,
1862a5ae1ecdSBarry Smith        0,
18634b0e389bSBarry Smith        MatGetValues_SeqDense,
1864a5ae1ecdSBarry Smith        MatCopy_SeqDense,
1865d519adbfSMatthew Knepley /*44*/ MatGetRowMax_SeqDense,
1866a5ae1ecdSBarry Smith        MatScale_SeqDense,
1867a5ae1ecdSBarry Smith        0,
1868a5ae1ecdSBarry Smith        0,
1869a5ae1ecdSBarry Smith        0,
1870d519adbfSMatthew Knepley /*49*/ 0,
1871a5ae1ecdSBarry Smith        0,
1872a5ae1ecdSBarry Smith        0,
1873a5ae1ecdSBarry Smith        0,
1874a5ae1ecdSBarry Smith        0,
1875d519adbfSMatthew Knepley /*54*/ 0,
1876a5ae1ecdSBarry Smith        0,
1877a5ae1ecdSBarry Smith        0,
1878a5ae1ecdSBarry Smith        0,
1879a5ae1ecdSBarry Smith        0,
1880d519adbfSMatthew Knepley /*59*/ 0,
1881e03a110bSBarry Smith        MatDestroy_SeqDense,
1882e03a110bSBarry Smith        MatView_SeqDense,
1883357abbc8SBarry Smith        0,
188497304618SKris Buschelman        0,
1885d519adbfSMatthew Knepley /*64*/ 0,
188697304618SKris Buschelman        0,
188797304618SKris Buschelman        0,
188897304618SKris Buschelman        0,
188997304618SKris Buschelman        0,
1890d519adbfSMatthew Knepley /*69*/ MatGetRowMaxAbs_SeqDense,
189197304618SKris Buschelman        0,
189297304618SKris Buschelman        0,
189397304618SKris Buschelman        0,
189497304618SKris Buschelman        0,
1895d519adbfSMatthew Knepley /*74*/ 0,
189697304618SKris Buschelman        0,
189797304618SKris Buschelman        0,
189897304618SKris Buschelman        0,
189997304618SKris Buschelman        0,
1900d519adbfSMatthew Knepley /*79*/ 0,
190197304618SKris Buschelman        0,
190297304618SKris Buschelman        0,
190397304618SKris Buschelman        0,
19045bba2384SShri Abhyankar /*83*/ MatLoad_SeqDense,
1905865e5f61SKris Buschelman        0,
19061cbb95d3SBarry Smith        MatIsHermitian_SeqDense,
1907865e5f61SKris Buschelman        0,
1908865e5f61SKris Buschelman        0,
1909865e5f61SKris Buschelman        0,
1910d519adbfSMatthew Knepley /*89*/ MatMatMult_SeqDense_SeqDense,
1911a9fe9ddaSSatish Balay        MatMatMultSymbolic_SeqDense_SeqDense,
1912a9fe9ddaSSatish Balay        MatMatMultNumeric_SeqDense_SeqDense,
1913865e5f61SKris Buschelman        0,
1914865e5f61SKris Buschelman        0,
1915d519adbfSMatthew Knepley /*94*/ 0,
1916a9fe9ddaSSatish Balay        MatMatMultTranspose_SeqDense_SeqDense,
1917a9fe9ddaSSatish Balay        MatMatMultTransposeSymbolic_SeqDense_SeqDense,
1918a9fe9ddaSSatish Balay        MatMatMultTransposeNumeric_SeqDense_SeqDense,
1919284134d9SBarry Smith        0,
1920d519adbfSMatthew Knepley /*99*/ 0,
1921284134d9SBarry Smith        0,
1922284134d9SBarry Smith        0,
1923ba337c44SJed Brown        MatConjugate_SeqDense,
1924985db425SBarry Smith        MatSetSizes_SeqDense,
1925ba337c44SJed Brown /*104*/0,
1926ba337c44SJed Brown        MatRealPart_SeqDense,
1927ba337c44SJed Brown        MatImaginaryPart_SeqDense,
1928985db425SBarry Smith        0,
1929985db425SBarry Smith        0,
193085e2c93fSHong Zhang /*109*/MatMatSolve_SeqDense,
1931985db425SBarry Smith        0,
19328d0534beSBarry Smith        MatGetRowMin_SeqDense,
1933aabbc4fbSShri Abhyankar        MatGetColumnVector_SeqDense,
1934aabbc4fbSShri Abhyankar        0,
1935aabbc4fbSShri Abhyankar /*114*/0,
1936aabbc4fbSShri Abhyankar        0,
1937aabbc4fbSShri Abhyankar        0,
1938aabbc4fbSShri Abhyankar        0,
1939aabbc4fbSShri Abhyankar        0,
1940aabbc4fbSShri Abhyankar /*119*/0,
1941aabbc4fbSShri Abhyankar        0,
1942aabbc4fbSShri Abhyankar        0,
19435bba2384SShri Abhyankar        0
1944985db425SBarry Smith };
194590ace30eSBarry Smith 
19464a2ae208SSatish Balay #undef __FUNCT__
19474a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense"
19484b828684SBarry Smith /*@C
1949fafbff53SBarry Smith    MatCreateSeqDense - Creates a sequential dense matrix that
1950d65003e9SLois Curfman McInnes    is stored in column major order (the usual Fortran 77 manner). Many
1951d65003e9SLois Curfman McInnes    of the matrix operations use the BLAS and LAPACK routines.
1952289bc588SBarry Smith 
1953db81eaa0SLois Curfman McInnes    Collective on MPI_Comm
1954db81eaa0SLois Curfman McInnes 
195520563c6bSBarry Smith    Input Parameters:
1956db81eaa0SLois Curfman McInnes +  comm - MPI communicator, set to PETSC_COMM_SELF
19570c775827SLois Curfman McInnes .  m - number of rows
195818f449edSLois Curfman McInnes .  n - number of columns
1959c0235b3cSMatthew Knepley -  data - optional location of matrix data in column major order.  Set data=PETSC_NULL for PETSc
1960dfc5480cSLois Curfman McInnes    to control all matrix memory allocation.
196120563c6bSBarry Smith 
196220563c6bSBarry Smith    Output Parameter:
196344cd7ae7SLois Curfman McInnes .  A - the matrix
196420563c6bSBarry Smith 
1965b259b22eSLois Curfman McInnes    Notes:
196618f449edSLois Curfman McInnes    The data input variable is intended primarily for Fortran programmers
196718f449edSLois Curfman McInnes    who wish to allocate their own matrix memory space.  Most users should
1968b4fd4287SBarry Smith    set data=PETSC_NULL.
196918f449edSLois Curfman McInnes 
1970027ccd11SLois Curfman McInnes    Level: intermediate
1971027ccd11SLois Curfman McInnes 
1972dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS
1973d65003e9SLois Curfman McInnes 
1974db81eaa0SLois Curfman McInnes .seealso: MatCreate(), MatCreateMPIDense(), MatSetValues()
197520563c6bSBarry Smith @*/
19767087cfbeSBarry Smith PetscErrorCode  MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A)
1977289bc588SBarry Smith {
1978dfbe8321SBarry Smith   PetscErrorCode ierr;
19793b2fbd54SBarry Smith 
19803a40ed3dSBarry Smith   PetscFunctionBegin;
1981f69a0ea3SMatthew Knepley   ierr = MatCreate(comm,A);CHKERRQ(ierr);
1982f69a0ea3SMatthew Knepley   ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr);
1983273d9f13SBarry Smith   ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr);
1984273d9f13SBarry Smith   ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr);
1985273d9f13SBarry Smith   PetscFunctionReturn(0);
1986273d9f13SBarry Smith }
1987273d9f13SBarry Smith 
19884a2ae208SSatish Balay #undef __FUNCT__
1989afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation"
1990273d9f13SBarry Smith /*@C
1991273d9f13SBarry Smith    MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements
1992273d9f13SBarry Smith 
1993273d9f13SBarry Smith    Collective on MPI_Comm
1994273d9f13SBarry Smith 
1995273d9f13SBarry Smith    Input Parameters:
1996273d9f13SBarry Smith +  A - the matrix
1997273d9f13SBarry Smith -  data - the array (or PETSC_NULL)
1998273d9f13SBarry Smith 
1999273d9f13SBarry Smith    Notes:
2000273d9f13SBarry Smith    The data input variable is intended primarily for Fortran programmers
2001273d9f13SBarry Smith    who wish to allocate their own matrix memory space.  Most users should
2002284134d9SBarry Smith    need not call this routine.
2003273d9f13SBarry Smith 
2004273d9f13SBarry Smith    Level: intermediate
2005273d9f13SBarry Smith 
2006273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS
2007273d9f13SBarry Smith 
2008867c911aSBarry Smith .seealso: MatCreate(), MatCreateMPIDense(), MatSetValues(), MatSeqDenseSetLDA()
2009867c911aSBarry Smith 
2010273d9f13SBarry Smith @*/
20117087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation(Mat B,PetscScalar data[])
2012273d9f13SBarry Smith {
20134ac538c5SBarry Smith   PetscErrorCode ierr;
2014a23d5eceSKris Buschelman 
2015a23d5eceSKris Buschelman   PetscFunctionBegin;
20164ac538c5SBarry Smith   ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr);
2017a23d5eceSKris Buschelman   PetscFunctionReturn(0);
2018a23d5eceSKris Buschelman }
2019a23d5eceSKris Buschelman 
2020a23d5eceSKris Buschelman EXTERN_C_BEGIN
2021a23d5eceSKris Buschelman #undef __FUNCT__
2022afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense"
20237087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data)
2024a23d5eceSKris Buschelman {
2025273d9f13SBarry Smith   Mat_SeqDense   *b;
2026dfbe8321SBarry Smith   PetscErrorCode ierr;
2027273d9f13SBarry Smith 
2028273d9f13SBarry Smith   PetscFunctionBegin;
2029273d9f13SBarry Smith   B->preallocated = PETSC_TRUE;
2030a868139aSShri Abhyankar 
203134ef9618SShri Abhyankar   ierr = PetscLayoutSetBlockSize(B->rmap,1);CHKERRQ(ierr);
203234ef9618SShri Abhyankar   ierr = PetscLayoutSetBlockSize(B->cmap,1);CHKERRQ(ierr);
203334ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr);
203434ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr);
203534ef9618SShri Abhyankar 
2036273d9f13SBarry Smith   b       = (Mat_SeqDense*)B->data;
203786d161a7SShri Abhyankar   b->Mmax = B->rmap->n;
203886d161a7SShri Abhyankar   b->Nmax = B->cmap->n;
203986d161a7SShri Abhyankar   if(b->lda <= 0 || b->changelda) b->lda = B->rmap->n;
204086d161a7SShri Abhyankar 
20419e8f95c4SLisandro Dalcin   if (!data) { /* petsc-allocated storage */
20429e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
20435afd5e0cSBarry Smith     ierr = PetscMalloc(b->lda*b->Nmax*sizeof(PetscScalar),&b->v);CHKERRQ(ierr);
2044284134d9SBarry Smith     ierr = PetscMemzero(b->v,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
2045284134d9SBarry Smith     ierr = PetscLogObjectMemory(B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
20469e8f95c4SLisandro Dalcin     b->user_alloc = PETSC_FALSE;
2047273d9f13SBarry Smith   } else { /* user-allocated storage */
20489e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2049273d9f13SBarry Smith     b->v          = data;
2050273d9f13SBarry Smith     b->user_alloc = PETSC_TRUE;
2051273d9f13SBarry Smith   }
20520450473dSBarry Smith   B->assembled = PETSC_TRUE;
2053273d9f13SBarry Smith   PetscFunctionReturn(0);
2054273d9f13SBarry Smith }
2055a23d5eceSKris Buschelman EXTERN_C_END
2056273d9f13SBarry Smith 
20571b807ce4Svictorle #undef __FUNCT__
20581b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA"
20591b807ce4Svictorle /*@C
20601b807ce4Svictorle   MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array
20611b807ce4Svictorle 
20621b807ce4Svictorle   Input parameter:
20631b807ce4Svictorle + A - the matrix
20641b807ce4Svictorle - lda - the leading dimension
20651b807ce4Svictorle 
20661b807ce4Svictorle   Notes:
2067867c911aSBarry Smith   This routine is to be used in conjunction with MatSeqDenseSetPreallocation();
20681b807ce4Svictorle   it asserts that the preallocation has a leading dimension (the LDA parameter
20691b807ce4Svictorle   of Blas and Lapack fame) larger than M, the first dimension of the matrix.
20701b807ce4Svictorle 
20711b807ce4Svictorle   Level: intermediate
20721b807ce4Svictorle 
20731b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS
20741b807ce4Svictorle 
2075284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize()
2076867c911aSBarry Smith 
20771b807ce4Svictorle @*/
20787087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetLDA(Mat B,PetscInt lda)
20791b807ce4Svictorle {
20801b807ce4Svictorle   Mat_SeqDense *b = (Mat_SeqDense*)B->data;
208121a2c019SBarry Smith 
20821b807ce4Svictorle   PetscFunctionBegin;
2083e32f2f54SBarry Smith   if (lda < B->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"LDA %D must be at least matrix dimension %D",lda,B->rmap->n);
20841b807ce4Svictorle   b->lda       = lda;
208521a2c019SBarry Smith   b->changelda = PETSC_FALSE;
208621a2c019SBarry Smith   b->Mmax      = PetscMax(b->Mmax,lda);
20871b807ce4Svictorle   PetscFunctionReturn(0);
20881b807ce4Svictorle }
20891b807ce4Svictorle 
20900bad9183SKris Buschelman /*MC
2091fafad747SKris Buschelman    MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices.
20920bad9183SKris Buschelman 
20930bad9183SKris Buschelman    Options Database Keys:
20940bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions()
20950bad9183SKris Buschelman 
20960bad9183SKris Buschelman   Level: beginner
20970bad9183SKris Buschelman 
209889665df3SBarry Smith .seealso: MatCreateSeqDense()
209989665df3SBarry Smith 
21000bad9183SKris Buschelman M*/
21010bad9183SKris Buschelman 
2102273d9f13SBarry Smith EXTERN_C_BEGIN
21034a2ae208SSatish Balay #undef __FUNCT__
21044a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense"
21057087cfbeSBarry Smith PetscErrorCode  MatCreate_SeqDense(Mat B)
2106273d9f13SBarry Smith {
2107273d9f13SBarry Smith   Mat_SeqDense   *b;
2108dfbe8321SBarry Smith   PetscErrorCode ierr;
21097c334f02SBarry Smith   PetscMPIInt    size;
2110273d9f13SBarry Smith 
2111273d9f13SBarry Smith   PetscFunctionBegin;
21127adad957SLisandro Dalcin   ierr = MPI_Comm_size(((PetscObject)B)->comm,&size);CHKERRQ(ierr);
2113e32f2f54SBarry Smith   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1");
211455659b69SBarry Smith 
211538f2d2fdSLisandro Dalcin   ierr            = PetscNewLog(B,Mat_SeqDense,&b);CHKERRQ(ierr);
2116549d3d68SSatish Balay   ierr            = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr);
211744cd7ae7SLois Curfman McInnes   B->data         = (void*)b;
211818f449edSLois Curfman McInnes 
211944cd7ae7SLois Curfman McInnes   b->pivots       = 0;
2120273d9f13SBarry Smith   b->roworiented  = PETSC_TRUE;
2121273d9f13SBarry Smith   b->v            = 0;
212221a2c019SBarry Smith   b->changelda    = PETSC_FALSE;
21234e220ebcSLois Curfman McInnes 
2124b24902e0SBarry Smith 
2125ec1065edSBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatGetFactor_petsc_C",
2126b24902e0SBarry Smith                                      "MatGetFactor_seqdense_petsc",
2127b24902e0SBarry Smith                                       MatGetFactor_seqdense_petsc);CHKERRQ(ierr);
2128a23d5eceSKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatSeqDenseSetPreallocation_C",
2129a23d5eceSKris Buschelman                                     "MatSeqDenseSetPreallocation_SeqDense",
2130a23d5eceSKris Buschelman                                      MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr);
21314ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMult_seqaij_seqdense_C",
21324ae313f4SHong Zhang                                      "MatMatMult_SeqAIJ_SeqDense",
21334ae313f4SHong Zhang                                       MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
21344ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",
21354ae313f4SHong Zhang                                      "MatMatMultSymbolic_SeqAIJ_SeqDense",
21364ae313f4SHong Zhang                                       MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
21374ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",
21384ae313f4SHong Zhang                                      "MatMatMultNumeric_SeqAIJ_SeqDense",
21394ae313f4SHong Zhang                                       MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
214017667f90SBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr);
21413a40ed3dSBarry Smith   PetscFunctionReturn(0);
2142289bc588SBarry Smith }
2143273d9f13SBarry Smith EXTERN_C_END
2144