xref: /petsc/src/mat/impls/dense/seq/dense.c (revision 6e111a19f6677190c8cb13236301fcb65e0e3d3b)
1be1d678aSKris Buschelman 
267e560aaSBarry Smith /*
367e560aaSBarry Smith      Defines the basic matrix operations for sequential dense.
467e560aaSBarry Smith */
5289bc588SBarry Smith 
6dec5eb66SMatthew G Knepley #include <../src/mat/impls/dense/seq/dense.h> /*I "petscmat.h" I*/
7c6db04a5SJed Brown #include <petscblaslapack.h>
8289bc588SBarry Smith 
96a63e612SBarry Smith #include <../src/mat/impls/aij/seq/aij.h>
106a63e612SBarry Smith EXTERN_C_BEGIN
116a63e612SBarry Smith #undef __FUNCT__
126a63e612SBarry Smith #define __FUNCT__ "MatConvert_SeqDense_SeqAIJ"
136a63e612SBarry Smith PetscErrorCode  MatConvert_SeqDense_SeqAIJ(Mat A, MatType newtype,MatReuse reuse,Mat *newmat)
146a63e612SBarry Smith {
156a63e612SBarry Smith   Mat            B;
166a63e612SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
176a63e612SBarry Smith   PetscErrorCode ierr;
186a63e612SBarry Smith   PetscInt       i;
196a63e612SBarry Smith   PetscInt       *rows;
206a63e612SBarry Smith   MatScalar      *aa = a->v;
216a63e612SBarry Smith 
226a63e612SBarry Smith   PetscFunctionBegin;
236a63e612SBarry Smith   ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr);
246a63e612SBarry Smith   ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr);
256a63e612SBarry Smith   ierr = MatSetType(B,MATSEQAIJ);CHKERRQ(ierr);
266a63e612SBarry Smith   ierr = MatSeqAIJSetPreallocation(B,A->cmap->n,PETSC_NULL);CHKERRQ(ierr);
276a63e612SBarry Smith 
286a63e612SBarry Smith   ierr = PetscMalloc(A->rmap->n*sizeof(PetscInt),&rows);CHKERRQ(ierr);
296a63e612SBarry Smith   for (i=0; i<A->rmap->n; i++) rows[i] = i;
306a63e612SBarry Smith 
316a63e612SBarry Smith   for (i=0; i<A->cmap->n; i++) {
326a63e612SBarry Smith     ierr  = MatSetValues(B,A->rmap->n,rows,1,&i,aa,INSERT_VALUES);CHKERRQ(ierr);
336a63e612SBarry Smith     aa   += a->lda;
346a63e612SBarry Smith   }
356a63e612SBarry Smith   ierr = PetscFree(rows);CHKERRQ(ierr);
366a63e612SBarry Smith   ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
376a63e612SBarry Smith   ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
386a63e612SBarry Smith 
396a63e612SBarry Smith   if (reuse == MAT_REUSE_MATRIX) {
406a63e612SBarry Smith     ierr = MatHeaderReplace(A,B);CHKERRQ(ierr);
416a63e612SBarry Smith   } else {
426a63e612SBarry Smith     *newmat = B;
436a63e612SBarry Smith   }
446a63e612SBarry Smith   PetscFunctionReturn(0);
456a63e612SBarry Smith }
466a63e612SBarry Smith EXTERN_C_END
476a63e612SBarry Smith 
484a2ae208SSatish Balay #undef __FUNCT__
494a2ae208SSatish Balay #define __FUNCT__ "MatAXPY_SeqDense"
50f4df32b1SMatthew Knepley PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str)
511987afe7SBarry Smith {
521987afe7SBarry Smith   Mat_SeqDense   *x = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data;
53f4df32b1SMatthew Knepley   PetscScalar    oalpha = alpha;
5413f74950SBarry Smith   PetscInt       j;
550805154bSBarry Smith   PetscBLASInt   N,m,ldax,lday,one = 1;
56efee365bSSatish Balay   PetscErrorCode ierr;
573a40ed3dSBarry Smith 
583a40ed3dSBarry Smith   PetscFunctionBegin;
59d0f46423SBarry Smith   N    = PetscBLASIntCast(X->rmap->n*X->cmap->n);
60d0f46423SBarry Smith   m    = PetscBLASIntCast(X->rmap->n);
610805154bSBarry Smith   ldax = PetscBLASIntCast(x->lda);
620805154bSBarry Smith   lday = PetscBLASIntCast(y->lda);
63a5ce6ee0Svictorle   if (ldax>m || lday>m) {
64d0f46423SBarry Smith     for (j=0; j<X->cmap->n; j++) {
65f4df32b1SMatthew Knepley       BLASaxpy_(&m,&oalpha,x->v+j*ldax,&one,y->v+j*lday,&one);
66a5ce6ee0Svictorle     }
67a5ce6ee0Svictorle   } else {
68f4df32b1SMatthew Knepley     BLASaxpy_(&N,&oalpha,x->v,&one,y->v,&one);
69a5ce6ee0Svictorle   }
700450473dSBarry Smith   ierr = PetscLogFlops(PetscMax(2*N-1,0));CHKERRQ(ierr);
713a40ed3dSBarry Smith   PetscFunctionReturn(0);
721987afe7SBarry Smith }
731987afe7SBarry Smith 
744a2ae208SSatish Balay #undef __FUNCT__
754a2ae208SSatish Balay #define __FUNCT__ "MatGetInfo_SeqDense"
76dfbe8321SBarry Smith PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info)
77289bc588SBarry Smith {
78d0f46423SBarry Smith   PetscInt     N = A->rmap->n*A->cmap->n;
793a40ed3dSBarry Smith 
803a40ed3dSBarry Smith   PetscFunctionBegin;
814e220ebcSLois Curfman McInnes   info->block_size        = 1.0;
824e220ebcSLois Curfman McInnes   info->nz_allocated      = (double)N;
836de62eeeSBarry Smith   info->nz_used           = (double)N;
846de62eeeSBarry Smith   info->nz_unneeded       = (double)0;
854e220ebcSLois Curfman McInnes   info->assemblies        = (double)A->num_ass;
864e220ebcSLois Curfman McInnes   info->mallocs           = 0;
877adad957SLisandro Dalcin   info->memory            = ((PetscObject)A)->mem;
884e220ebcSLois Curfman McInnes   info->fill_ratio_given  = 0;
894e220ebcSLois Curfman McInnes   info->fill_ratio_needed = 0;
904e220ebcSLois Curfman McInnes   info->factor_mallocs    = 0;
913a40ed3dSBarry Smith   PetscFunctionReturn(0);
92289bc588SBarry Smith }
93289bc588SBarry Smith 
944a2ae208SSatish Balay #undef __FUNCT__
954a2ae208SSatish Balay #define __FUNCT__ "MatScale_SeqDense"
96f4df32b1SMatthew Knepley PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha)
9780cd9d93SLois Curfman McInnes {
98273d9f13SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
99f4df32b1SMatthew Knepley   PetscScalar    oalpha = alpha;
100efee365bSSatish Balay   PetscErrorCode ierr;
1010805154bSBarry Smith   PetscBLASInt   one = 1,j,nz,lda = PetscBLASIntCast(a->lda);
10280cd9d93SLois Curfman McInnes 
1033a40ed3dSBarry Smith   PetscFunctionBegin;
104d0f46423SBarry Smith   if (lda>A->rmap->n) {
105d0f46423SBarry Smith     nz = PetscBLASIntCast(A->rmap->n);
106d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
107f4df32b1SMatthew Knepley       BLASscal_(&nz,&oalpha,a->v+j*lda,&one);
108a5ce6ee0Svictorle     }
109a5ce6ee0Svictorle   } else {
110d0f46423SBarry Smith     nz = PetscBLASIntCast(A->rmap->n*A->cmap->n);
111f4df32b1SMatthew Knepley     BLASscal_(&nz,&oalpha,a->v,&one);
112a5ce6ee0Svictorle   }
113efee365bSSatish Balay   ierr = PetscLogFlops(nz);CHKERRQ(ierr);
1143a40ed3dSBarry Smith   PetscFunctionReturn(0);
11580cd9d93SLois Curfman McInnes }
11680cd9d93SLois Curfman McInnes 
1171cbb95d3SBarry Smith #undef __FUNCT__
1181cbb95d3SBarry Smith #define __FUNCT__ "MatIsHermitian_SeqDense"
119ace3abfcSBarry Smith PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscBool  *fl)
1201cbb95d3SBarry Smith {
1211cbb95d3SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
122d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,N;
1231cbb95d3SBarry Smith   PetscScalar    *v = a->v;
1241cbb95d3SBarry Smith 
1251cbb95d3SBarry Smith   PetscFunctionBegin;
1261cbb95d3SBarry Smith   *fl = PETSC_FALSE;
127d0f46423SBarry Smith   if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0);
1281cbb95d3SBarry Smith   N = a->lda;
1291cbb95d3SBarry Smith 
1301cbb95d3SBarry Smith   for (i=0; i<m; i++) {
1311cbb95d3SBarry Smith     for (j=i+1; j<m; j++) {
1321cbb95d3SBarry Smith       if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) PetscFunctionReturn(0);
1331cbb95d3SBarry Smith     }
1341cbb95d3SBarry Smith   }
1351cbb95d3SBarry Smith   *fl = PETSC_TRUE;
1361cbb95d3SBarry Smith   PetscFunctionReturn(0);
1371cbb95d3SBarry Smith }
1381cbb95d3SBarry Smith 
139b24902e0SBarry Smith #undef __FUNCT__
140b24902e0SBarry Smith #define __FUNCT__ "MatDuplicateNoCreate_SeqDense"
141719d5645SBarry Smith PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat newi,Mat A,MatDuplicateOption cpvalues)
142b24902e0SBarry Smith {
143b24902e0SBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data,*l;
144b24902e0SBarry Smith   PetscErrorCode ierr;
145b24902e0SBarry Smith   PetscInt       lda = (PetscInt)mat->lda,j,m;
146b24902e0SBarry Smith 
147b24902e0SBarry Smith   PetscFunctionBegin;
148aa5ea44dSBarry Smith   ierr = PetscLayoutReference(A->rmap,&newi->rmap);CHKERRQ(ierr);
149aa5ea44dSBarry Smith   ierr = PetscLayoutReference(A->cmap,&newi->cmap);CHKERRQ(ierr);
150719d5645SBarry Smith   ierr = MatSeqDenseSetPreallocation(newi,PETSC_NULL);CHKERRQ(ierr);
151b24902e0SBarry Smith   if (cpvalues == MAT_COPY_VALUES) {
152b24902e0SBarry Smith     l = (Mat_SeqDense*)newi->data;
153d0f46423SBarry Smith     if (lda>A->rmap->n) {
154d0f46423SBarry Smith       m = A->rmap->n;
155d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
156b24902e0SBarry Smith         ierr = PetscMemcpy(l->v+j*m,mat->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
157b24902e0SBarry Smith       }
158b24902e0SBarry Smith     } else {
159d0f46423SBarry Smith       ierr = PetscMemcpy(l->v,mat->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
160b24902e0SBarry Smith     }
161b24902e0SBarry Smith   }
162b24902e0SBarry Smith   newi->assembled = PETSC_TRUE;
163b24902e0SBarry Smith   PetscFunctionReturn(0);
164b24902e0SBarry Smith }
165b24902e0SBarry Smith 
1664a2ae208SSatish Balay #undef __FUNCT__
1674a2ae208SSatish Balay #define __FUNCT__ "MatDuplicate_SeqDense"
168dfbe8321SBarry Smith PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat)
16902cad45dSBarry Smith {
1706849ba73SBarry Smith   PetscErrorCode ierr;
17102cad45dSBarry Smith 
1723a40ed3dSBarry Smith   PetscFunctionBegin;
1735c9eb25fSBarry Smith   ierr = MatCreate(((PetscObject)A)->comm,newmat);CHKERRQ(ierr);
174d0f46423SBarry Smith   ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
1755c9eb25fSBarry Smith   ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
176719d5645SBarry Smith   ierr = MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues);CHKERRQ(ierr);
177b24902e0SBarry Smith   PetscFunctionReturn(0);
178b24902e0SBarry Smith }
179b24902e0SBarry Smith 
1806ee01492SSatish Balay 
1810481f469SBarry Smith extern PetscErrorCode MatLUFactor_SeqDense(Mat,IS,IS,const MatFactorInfo*);
182719d5645SBarry Smith 
1834a2ae208SSatish Balay #undef __FUNCT__
1844a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorNumeric_SeqDense"
1850481f469SBarry Smith PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
186289bc588SBarry Smith {
1874482741eSBarry Smith   MatFactorInfo  info;
188a093e273SMatthew Knepley   PetscErrorCode ierr;
1893a40ed3dSBarry Smith 
1903a40ed3dSBarry Smith   PetscFunctionBegin;
191c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
192719d5645SBarry Smith   ierr = MatLUFactor_SeqDense(fact,0,0,&info);CHKERRQ(ierr);
1933a40ed3dSBarry Smith   PetscFunctionReturn(0);
194289bc588SBarry Smith }
1956ee01492SSatish Balay 
1960b4b3355SBarry Smith #undef __FUNCT__
1974a2ae208SSatish Balay #define __FUNCT__ "MatSolve_SeqDense"
198dfbe8321SBarry Smith PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy)
199289bc588SBarry Smith {
200c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
2016849ba73SBarry Smith   PetscErrorCode ierr;
20287828ca2SBarry Smith   PetscScalar    *x,*y;
203d0f46423SBarry Smith   PetscBLASInt   one = 1,info,m = PetscBLASIntCast(A->rmap->n);
20467e560aaSBarry Smith 
2053a40ed3dSBarry Smith   PetscFunctionBegin;
2061ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
2071ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
208d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
209d5f3da31SBarry Smith   if (A->factortype == MAT_FACTOR_LU) {
210ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
211e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
212ae7cfcebSSatish Balay #else
21371044d3cSBarry Smith     LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info);
214e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
215ae7cfcebSSatish Balay #endif
216d5f3da31SBarry Smith   } else if (A->factortype == MAT_FACTOR_CHOLESKY) {
217ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
218e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
219ae7cfcebSSatish Balay #else
22071044d3cSBarry Smith     LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info);
221e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
222ae7cfcebSSatish Balay #endif
223289bc588SBarry Smith   }
224e32f2f54SBarry Smith   else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
2251ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
2261ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
227dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
2283a40ed3dSBarry Smith   PetscFunctionReturn(0);
229289bc588SBarry Smith }
2306ee01492SSatish Balay 
2314a2ae208SSatish Balay #undef __FUNCT__
23285e2c93fSHong Zhang #define __FUNCT__ "MatMatSolve_SeqDense"
23385e2c93fSHong Zhang PetscErrorCode MatMatSolve_SeqDense(Mat A,Mat B,Mat X)
23485e2c93fSHong Zhang {
23585e2c93fSHong Zhang   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
23685e2c93fSHong Zhang   PetscErrorCode ierr;
23785e2c93fSHong Zhang   PetscScalar    *b,*x;
238efb80c78SLisandro Dalcin   PetscInt       n;
239783b601eSJed Brown   PetscBLASInt   nrhs,info,m;
240bda8bf91SBarry Smith   PetscBool      flg;
24185e2c93fSHong Zhang 
24285e2c93fSHong Zhang   PetscFunctionBegin;
243783b601eSJed Brown   m = PetscBLASIntCast(A->rmap->n);
244251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATMPIDENSE,PETSC_NULL);CHKERRQ(ierr);
245bda8bf91SBarry Smith   if (!flg) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_ARG_WRONG,"Matrix B must be MATDENSE matrix");
246251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompareAny((PetscObject)X,&flg,MATSEQDENSE,MATMPIDENSE,PETSC_NULL);CHKERRQ(ierr);
247bda8bf91SBarry Smith   if (!flg) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_ARG_WRONG,"Matrix X must be MATDENSE matrix");
248bda8bf91SBarry Smith 
249efb80c78SLisandro Dalcin   ierr = MatGetSize(B,PETSC_NULL,&n);CHKERRQ(ierr);
250efb80c78SLisandro Dalcin   nrhs = PetscBLASIntCast(n);
2518c778c55SBarry Smith   ierr = MatDenseGetArray(B,&b);CHKERRQ(ierr);
2528c778c55SBarry Smith   ierr = MatDenseGetArray(X,&x);CHKERRQ(ierr);
25385e2c93fSHong Zhang 
254f272c775SHong Zhang   ierr = PetscMemcpy(x,b,m*nrhs*sizeof(PetscScalar));CHKERRQ(ierr);
25585e2c93fSHong Zhang 
25685e2c93fSHong Zhang   if (A->factortype == MAT_FACTOR_LU) {
25785e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_GETRS)
25885e2c93fSHong Zhang     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
25985e2c93fSHong Zhang #else
26085e2c93fSHong Zhang     LAPACKgetrs_("N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info);
26185e2c93fSHong Zhang     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
26285e2c93fSHong Zhang #endif
26385e2c93fSHong Zhang   } else if (A->factortype == MAT_FACTOR_CHOLESKY) {
26485e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_POTRS)
26585e2c93fSHong Zhang     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
26685e2c93fSHong Zhang #else
26785e2c93fSHong Zhang     LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info);
26885e2c93fSHong Zhang     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
26985e2c93fSHong Zhang #endif
27085e2c93fSHong Zhang   }
27185e2c93fSHong Zhang   else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
27285e2c93fSHong Zhang 
2738c778c55SBarry Smith   ierr = MatDenseRestoreArray(B,&b);CHKERRQ(ierr);
2748c778c55SBarry Smith   ierr = MatDenseRestoreArray(X,&x);CHKERRQ(ierr);
27585e2c93fSHong Zhang   ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr);
27685e2c93fSHong Zhang   PetscFunctionReturn(0);
27785e2c93fSHong Zhang }
27885e2c93fSHong Zhang 
27985e2c93fSHong Zhang #undef __FUNCT__
2804a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense"
281dfbe8321SBarry Smith PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy)
282da3a660dSBarry Smith {
283c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
284dfbe8321SBarry Smith   PetscErrorCode ierr;
28587828ca2SBarry Smith   PetscScalar    *x,*y;
286d0f46423SBarry Smith   PetscBLASInt   one = 1,info,m = PetscBLASIntCast(A->rmap->n);
28767e560aaSBarry Smith 
2883a40ed3dSBarry Smith   PetscFunctionBegin;
2891ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
2901ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
291d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
292752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
293da3a660dSBarry Smith   if (mat->pivots) {
294ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
295e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
296ae7cfcebSSatish Balay #else
29771044d3cSBarry Smith     LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info);
298e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve");
299ae7cfcebSSatish Balay #endif
3007a97a34bSBarry Smith   } else {
301ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
302e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
303ae7cfcebSSatish Balay #else
30471044d3cSBarry Smith     LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info);
305e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve");
306ae7cfcebSSatish Balay #endif
307da3a660dSBarry Smith   }
3081ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
3091ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
310dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
3113a40ed3dSBarry Smith   PetscFunctionReturn(0);
312da3a660dSBarry Smith }
3136ee01492SSatish Balay 
3144a2ae208SSatish Balay #undef __FUNCT__
3154a2ae208SSatish Balay #define __FUNCT__ "MatSolveAdd_SeqDense"
316dfbe8321SBarry Smith PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
317da3a660dSBarry Smith {
318c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
319dfbe8321SBarry Smith   PetscErrorCode ierr;
32087828ca2SBarry Smith   PetscScalar    *x,*y,sone = 1.0;
321da3a660dSBarry Smith   Vec            tmp = 0;
322d0f46423SBarry Smith   PetscBLASInt   one = 1,info,m = PetscBLASIntCast(A->rmap->n);
32367e560aaSBarry Smith 
3243a40ed3dSBarry Smith   PetscFunctionBegin;
3251ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
3261ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
327d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
328da3a660dSBarry Smith   if (yy == zz) {
32978b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
33052e6d16bSBarry Smith     ierr = PetscLogObjectParent(A,tmp);CHKERRQ(ierr);
33178b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
332da3a660dSBarry Smith   }
333d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
334752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
335da3a660dSBarry Smith   if (mat->pivots) {
336ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
337e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
338ae7cfcebSSatish Balay #else
33971044d3cSBarry Smith     LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info);
340e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
341ae7cfcebSSatish Balay #endif
342a8c6a408SBarry Smith   } else {
343ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
344e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
345ae7cfcebSSatish Balay #else
34671044d3cSBarry Smith     LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info);
347e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
348ae7cfcebSSatish Balay #endif
349da3a660dSBarry Smith   }
3506bf464f9SBarry Smith   if (tmp) {
3516bf464f9SBarry Smith     ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr);
3526bf464f9SBarry Smith     ierr = VecDestroy(&tmp);CHKERRQ(ierr);
3536bf464f9SBarry Smith   } else {
3546bf464f9SBarry Smith     ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);
3556bf464f9SBarry Smith   }
3561ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
3571ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
358dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
3593a40ed3dSBarry Smith   PetscFunctionReturn(0);
360da3a660dSBarry Smith }
36167e560aaSBarry Smith 
3624a2ae208SSatish Balay #undef __FUNCT__
3634a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense"
364dfbe8321SBarry Smith PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
365da3a660dSBarry Smith {
366c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
3676849ba73SBarry Smith   PetscErrorCode ierr;
36887828ca2SBarry Smith   PetscScalar    *x,*y,sone = 1.0;
369da3a660dSBarry Smith   Vec            tmp;
370d0f46423SBarry Smith   PetscBLASInt   one = 1,info,m = PetscBLASIntCast(A->rmap->n);
37167e560aaSBarry Smith 
3723a40ed3dSBarry Smith   PetscFunctionBegin;
373d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
3741ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
3751ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
376da3a660dSBarry Smith   if (yy == zz) {
37778b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
37852e6d16bSBarry Smith     ierr = PetscLogObjectParent(A,tmp);CHKERRQ(ierr);
37978b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
380da3a660dSBarry Smith   }
381d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
382752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
383da3a660dSBarry Smith   if (mat->pivots) {
384ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
385e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
386ae7cfcebSSatish Balay #else
38771044d3cSBarry Smith     LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info);
388e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
389ae7cfcebSSatish Balay #endif
3903a40ed3dSBarry Smith   } else {
391ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
392e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
393ae7cfcebSSatish Balay #else
39471044d3cSBarry Smith     LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info);
395e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
396ae7cfcebSSatish Balay #endif
397da3a660dSBarry Smith   }
39890f02eecSBarry Smith   if (tmp) {
3992dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr);
4006bf464f9SBarry Smith     ierr = VecDestroy(&tmp);CHKERRQ(ierr);
4013a40ed3dSBarry Smith   } else {
4022dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);
40390f02eecSBarry Smith   }
4041ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
4051ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
406dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
4073a40ed3dSBarry Smith   PetscFunctionReturn(0);
408da3a660dSBarry Smith }
409db4efbfdSBarry Smith 
410db4efbfdSBarry Smith /* ---------------------------------------------------------------*/
411db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots,
412db4efbfdSBarry Smith    rather than put it in the Mat->row slot.*/
413db4efbfdSBarry Smith #undef __FUNCT__
414db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactor_SeqDense"
4150481f469SBarry Smith PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo)
416db4efbfdSBarry Smith {
417db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF)
418db4efbfdSBarry Smith   PetscFunctionBegin;
419e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable.");
420db4efbfdSBarry Smith #else
421db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
422db4efbfdSBarry Smith   PetscErrorCode ierr;
423db4efbfdSBarry Smith   PetscBLASInt   n,m,info;
424db4efbfdSBarry Smith 
425db4efbfdSBarry Smith   PetscFunctionBegin;
426db4efbfdSBarry Smith   n = PetscBLASIntCast(A->cmap->n);
427db4efbfdSBarry Smith   m = PetscBLASIntCast(A->rmap->n);
428db4efbfdSBarry Smith   if (!mat->pivots) {
429db4efbfdSBarry Smith     ierr = PetscMalloc((A->rmap->n+1)*sizeof(PetscBLASInt),&mat->pivots);CHKERRQ(ierr);
430db4efbfdSBarry Smith     ierr = PetscLogObjectMemory(A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr);
431db4efbfdSBarry Smith   }
432db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
4338e57ea43SSatish Balay   ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
434db4efbfdSBarry Smith   LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info);
4358e57ea43SSatish Balay   ierr = PetscFPTrapPop();CHKERRQ(ierr);
4368e57ea43SSatish Balay 
437e32f2f54SBarry Smith   if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization");
438e32f2f54SBarry Smith   if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization");
439db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
440db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
441db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
442db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
443d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_LU;
444db4efbfdSBarry Smith 
445dc0b31edSSatish Balay   ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr);
446db4efbfdSBarry Smith #endif
447db4efbfdSBarry Smith   PetscFunctionReturn(0);
448db4efbfdSBarry Smith }
449db4efbfdSBarry Smith 
450db4efbfdSBarry Smith #undef __FUNCT__
451db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactor_SeqDense"
4520481f469SBarry Smith PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo)
453db4efbfdSBarry Smith {
454db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF)
455db4efbfdSBarry Smith   PetscFunctionBegin;
456e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable.");
457db4efbfdSBarry Smith #else
458db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
459db4efbfdSBarry Smith   PetscErrorCode ierr;
460db4efbfdSBarry Smith   PetscBLASInt   info,n = PetscBLASIntCast(A->cmap->n);
461db4efbfdSBarry Smith 
462db4efbfdSBarry Smith   PetscFunctionBegin;
463db4efbfdSBarry Smith   ierr = PetscFree(mat->pivots);CHKERRQ(ierr);
464db4efbfdSBarry Smith 
465db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
466db4efbfdSBarry Smith   LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info);
467e32f2f54SBarry Smith   if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1);
468db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
469db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
470db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
471db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
472d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_CHOLESKY;
473dc0b31edSSatish Balay   ierr = PetscLogFlops((A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr);
474db4efbfdSBarry Smith #endif
475db4efbfdSBarry Smith   PetscFunctionReturn(0);
476db4efbfdSBarry Smith }
477db4efbfdSBarry Smith 
478db4efbfdSBarry Smith 
479db4efbfdSBarry Smith #undef __FUNCT__
480db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense"
4810481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
482db4efbfdSBarry Smith {
483db4efbfdSBarry Smith   PetscErrorCode ierr;
484db4efbfdSBarry Smith   MatFactorInfo  info;
485db4efbfdSBarry Smith 
486db4efbfdSBarry Smith   PetscFunctionBegin;
487db4efbfdSBarry Smith   info.fill = 1.0;
488c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
489719d5645SBarry Smith   ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr);
490db4efbfdSBarry Smith   PetscFunctionReturn(0);
491db4efbfdSBarry Smith }
492db4efbfdSBarry Smith 
493db4efbfdSBarry Smith #undef __FUNCT__
494db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense"
4950481f469SBarry Smith PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info)
496db4efbfdSBarry Smith {
497db4efbfdSBarry Smith   PetscFunctionBegin;
498c3ef05f6SHong Zhang   fact->assembled                  = PETSC_TRUE;
4991bbcc794SSatish Balay   fact->preallocated               = PETSC_TRUE;
500719d5645SBarry Smith   fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense;
501db4efbfdSBarry Smith   PetscFunctionReturn(0);
502db4efbfdSBarry Smith }
503db4efbfdSBarry Smith 
504db4efbfdSBarry Smith #undef __FUNCT__
505db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactorSymbolic_SeqDense"
5060481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info)
507db4efbfdSBarry Smith {
508db4efbfdSBarry Smith   PetscFunctionBegin;
509b66fe19dSMatthew G Knepley   fact->preallocated         = PETSC_TRUE;
510c3ef05f6SHong Zhang   fact->assembled            = PETSC_TRUE;
511719d5645SBarry Smith   fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense;
512db4efbfdSBarry Smith   PetscFunctionReturn(0);
513db4efbfdSBarry Smith }
514db4efbfdSBarry Smith 
515bb5747d9SMatthew Knepley EXTERN_C_BEGIN
516db4efbfdSBarry Smith #undef __FUNCT__
517db4efbfdSBarry Smith #define __FUNCT__ "MatGetFactor_seqdense_petsc"
518db4efbfdSBarry Smith PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact)
519db4efbfdSBarry Smith {
520db4efbfdSBarry Smith   PetscErrorCode ierr;
521db4efbfdSBarry Smith 
522db4efbfdSBarry Smith   PetscFunctionBegin;
523db4efbfdSBarry Smith   ierr = MatCreate(((PetscObject)A)->comm,fact);CHKERRQ(ierr);
524db4efbfdSBarry Smith   ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
525db4efbfdSBarry Smith   ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr);
526db4efbfdSBarry Smith   if (ftype == MAT_FACTOR_LU) {
527db4efbfdSBarry Smith     (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense;
528db4efbfdSBarry Smith   } else {
529db4efbfdSBarry Smith     (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense;
530db4efbfdSBarry Smith   }
531d5f3da31SBarry Smith   (*fact)->factortype = ftype;
532db4efbfdSBarry Smith   PetscFunctionReturn(0);
533db4efbfdSBarry Smith }
534bb5747d9SMatthew Knepley EXTERN_C_END
535db4efbfdSBarry Smith 
536289bc588SBarry Smith /* ------------------------------------------------------------------*/
5374a2ae208SSatish Balay #undef __FUNCT__
53841f059aeSBarry Smith #define __FUNCT__ "MatSOR_SeqDense"
53941f059aeSBarry Smith PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx)
540289bc588SBarry Smith {
541c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
54287828ca2SBarry Smith   PetscScalar    *x,*b,*v = mat->v,zero = 0.0,xt;
543dfbe8321SBarry Smith   PetscErrorCode ierr;
544d0f46423SBarry Smith   PetscInt       m = A->rmap->n,i;
5450805154bSBarry Smith   PetscBLASInt   o = 1,bm = PetscBLASIntCast(m);
546289bc588SBarry Smith 
5473a40ed3dSBarry Smith   PetscFunctionBegin;
548289bc588SBarry Smith   if (flag & SOR_ZERO_INITIAL_GUESS) {
54971044d3cSBarry Smith     /* this is a hack fix, should have another version without the second BLASdot */
5502dcb1b2aSMatthew Knepley     ierr = VecSet(xx,zero);CHKERRQ(ierr);
551289bc588SBarry Smith   }
5521ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
5531ebc52fbSHong Zhang   ierr = VecGetArray(bb,&b);CHKERRQ(ierr);
554b965ef7fSBarry Smith   its  = its*lits;
555e32f2f54SBarry Smith   if (its <= 0) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Relaxation requires global its %D and local its %D both positive",its,lits);
556289bc588SBarry Smith   while (its--) {
557fccaa45eSBarry Smith     if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) {
558289bc588SBarry Smith       for (i=0; i<m; i++) {
55971044d3cSBarry Smith         xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o);
56055a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
561289bc588SBarry Smith       }
562289bc588SBarry Smith     }
563fccaa45eSBarry Smith     if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) {
564289bc588SBarry Smith       for (i=m-1; i>=0; i--) {
56571044d3cSBarry Smith         xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o);
56655a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
567289bc588SBarry Smith       }
568289bc588SBarry Smith     }
569289bc588SBarry Smith   }
5701ebc52fbSHong Zhang   ierr = VecRestoreArray(bb,&b);CHKERRQ(ierr);
5711ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
5723a40ed3dSBarry Smith   PetscFunctionReturn(0);
573289bc588SBarry Smith }
574289bc588SBarry Smith 
575289bc588SBarry Smith /* -----------------------------------------------------------------*/
5764a2ae208SSatish Balay #undef __FUNCT__
5774a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense"
578dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy)
579289bc588SBarry Smith {
580c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
58187828ca2SBarry Smith   PetscScalar    *v = mat->v,*x,*y;
582dfbe8321SBarry Smith   PetscErrorCode ierr;
5830805154bSBarry Smith   PetscBLASInt   m, n,_One=1;
584ea709b57SSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
5853a40ed3dSBarry Smith 
5863a40ed3dSBarry Smith   PetscFunctionBegin;
587d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
588d0f46423SBarry Smith   n = PetscBLASIntCast(A->cmap->n);
589d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
5901ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
5911ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
59271044d3cSBarry Smith   BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One);
5931ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
5941ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
595dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
5963a40ed3dSBarry Smith   PetscFunctionReturn(0);
597289bc588SBarry Smith }
598800995b7SMatthew Knepley 
5994a2ae208SSatish Balay #undef __FUNCT__
6004a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense"
601dfbe8321SBarry Smith PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy)
602289bc588SBarry Smith {
603c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
60487828ca2SBarry Smith   PetscScalar    *v = mat->v,*x,*y,_DOne=1.0,_DZero=0.0;
605dfbe8321SBarry Smith   PetscErrorCode ierr;
6060805154bSBarry Smith   PetscBLASInt   m, n, _One=1;
6073a40ed3dSBarry Smith 
6083a40ed3dSBarry Smith   PetscFunctionBegin;
609d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
610d0f46423SBarry Smith   n = PetscBLASIntCast(A->cmap->n);
611d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
6121ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
6131ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
61471044d3cSBarry Smith   BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One);
6151ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6161ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
617dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr);
6183a40ed3dSBarry Smith   PetscFunctionReturn(0);
619289bc588SBarry Smith }
6206ee01492SSatish Balay 
6214a2ae208SSatish Balay #undef __FUNCT__
6224a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense"
623dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
624289bc588SBarry Smith {
625c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
62687828ca2SBarry Smith   PetscScalar    *v = mat->v,*x,*y,_DOne=1.0;
627dfbe8321SBarry Smith   PetscErrorCode ierr;
6280805154bSBarry Smith   PetscBLASInt   m, n, _One=1;
6293a40ed3dSBarry Smith 
6303a40ed3dSBarry Smith   PetscFunctionBegin;
631d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
632d0f46423SBarry Smith   n = PetscBLASIntCast(A->cmap->n);
633d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
634600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
6351ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
6361ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
63771044d3cSBarry Smith   BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One);
6381ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6391ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
640dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
6413a40ed3dSBarry Smith   PetscFunctionReturn(0);
642289bc588SBarry Smith }
6436ee01492SSatish Balay 
6444a2ae208SSatish Balay #undef __FUNCT__
6454a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense"
646dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
647289bc588SBarry Smith {
648c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
64987828ca2SBarry Smith   PetscScalar    *v = mat->v,*x,*y;
650dfbe8321SBarry Smith   PetscErrorCode ierr;
6510805154bSBarry Smith   PetscBLASInt   m, n, _One=1;
65287828ca2SBarry Smith   PetscScalar    _DOne=1.0;
6533a40ed3dSBarry Smith 
6543a40ed3dSBarry Smith   PetscFunctionBegin;
655d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
656d0f46423SBarry Smith   n = PetscBLASIntCast(A->cmap->n);
657d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
658600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
6591ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
6601ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
66171044d3cSBarry Smith   BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One);
6621ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6631ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
664dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
6653a40ed3dSBarry Smith   PetscFunctionReturn(0);
666289bc588SBarry Smith }
667289bc588SBarry Smith 
668289bc588SBarry Smith /* -----------------------------------------------------------------*/
6694a2ae208SSatish Balay #undef __FUNCT__
6704a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense"
67113f74950SBarry Smith PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
672289bc588SBarry Smith {
673c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
67487828ca2SBarry Smith   PetscScalar    *v;
6756849ba73SBarry Smith   PetscErrorCode ierr;
67613f74950SBarry Smith   PetscInt       i;
67767e560aaSBarry Smith 
6783a40ed3dSBarry Smith   PetscFunctionBegin;
679d0f46423SBarry Smith   *ncols = A->cmap->n;
680289bc588SBarry Smith   if (cols) {
681d0f46423SBarry Smith     ierr = PetscMalloc((A->cmap->n+1)*sizeof(PetscInt),cols);CHKERRQ(ierr);
682d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) (*cols)[i] = i;
683289bc588SBarry Smith   }
684289bc588SBarry Smith   if (vals) {
685d0f46423SBarry Smith     ierr = PetscMalloc((A->cmap->n+1)*sizeof(PetscScalar),vals);CHKERRQ(ierr);
686289bc588SBarry Smith     v    = mat->v + row;
687d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;}
688289bc588SBarry Smith   }
6893a40ed3dSBarry Smith   PetscFunctionReturn(0);
690289bc588SBarry Smith }
6916ee01492SSatish Balay 
6924a2ae208SSatish Balay #undef __FUNCT__
6934a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense"
69413f74950SBarry Smith PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
695289bc588SBarry Smith {
696dfbe8321SBarry Smith   PetscErrorCode ierr;
697*6e111a19SKarl Rupp 
698606d414cSSatish Balay   PetscFunctionBegin;
699606d414cSSatish Balay   if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);}
700606d414cSSatish Balay   if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); }
7013a40ed3dSBarry Smith   PetscFunctionReturn(0);
702289bc588SBarry Smith }
703289bc588SBarry Smith /* ----------------------------------------------------------------*/
7044a2ae208SSatish Balay #undef __FUNCT__
7054a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense"
70613f74950SBarry Smith PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv)
707289bc588SBarry Smith {
708c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
70913f74950SBarry Smith   PetscInt     i,j,idx=0;
710d6dfbf8fSBarry Smith 
7113a40ed3dSBarry Smith   PetscFunctionBegin;
71271fd2e92SBarry Smith   if (v) PetscValidScalarPointer(v,6);
713289bc588SBarry Smith   if (!mat->roworiented) {
714dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
715289bc588SBarry Smith       for (j=0; j<n; j++) {
716cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
7172515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
718e32f2f54SBarry 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);
71958804f6dSBarry Smith #endif
720289bc588SBarry Smith         for (i=0; i<m; i++) {
721cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
7222515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
723e32f2f54SBarry 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);
72458804f6dSBarry Smith #endif
725cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
726289bc588SBarry Smith         }
727289bc588SBarry Smith       }
7283a40ed3dSBarry Smith     } else {
729289bc588SBarry Smith       for (j=0; j<n; j++) {
730cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
7312515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
732e32f2f54SBarry 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);
73358804f6dSBarry Smith #endif
734289bc588SBarry Smith         for (i=0; i<m; i++) {
735cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
7362515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
737e32f2f54SBarry 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);
73858804f6dSBarry Smith #endif
739cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
740289bc588SBarry Smith         }
741289bc588SBarry Smith       }
742289bc588SBarry Smith     }
7433a40ed3dSBarry Smith   } else {
744dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
745e8d4e0b9SBarry Smith       for (i=0; i<m; i++) {
746cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
7472515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
748e32f2f54SBarry 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);
74958804f6dSBarry Smith #endif
750e8d4e0b9SBarry Smith         for (j=0; j<n; j++) {
751cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
7522515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
753e32f2f54SBarry 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);
75458804f6dSBarry Smith #endif
755cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
756e8d4e0b9SBarry Smith         }
757e8d4e0b9SBarry Smith       }
7583a40ed3dSBarry Smith     } else {
759289bc588SBarry Smith       for (i=0; i<m; i++) {
760cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
7612515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
762e32f2f54SBarry 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);
76358804f6dSBarry Smith #endif
764289bc588SBarry Smith         for (j=0; j<n; j++) {
765cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
7662515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
767e32f2f54SBarry 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);
76858804f6dSBarry Smith #endif
769cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
770289bc588SBarry Smith         }
771289bc588SBarry Smith       }
772289bc588SBarry Smith     }
773e8d4e0b9SBarry Smith   }
7743a40ed3dSBarry Smith   PetscFunctionReturn(0);
775289bc588SBarry Smith }
776e8d4e0b9SBarry Smith 
7774a2ae208SSatish Balay #undef __FUNCT__
7784a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense"
77913f74950SBarry Smith PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[])
780ae80bb75SLois Curfman McInnes {
781ae80bb75SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
78213f74950SBarry Smith   PetscInt     i,j;
783ae80bb75SLois Curfman McInnes 
7843a40ed3dSBarry Smith   PetscFunctionBegin;
785ae80bb75SLois Curfman McInnes   /* row-oriented output */
786ae80bb75SLois Curfman McInnes   for (i=0; i<m; i++) {
78797e567efSBarry Smith     if (indexm[i] < 0) {v += n;continue;}
788e32f2f54SBarry 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);
789ae80bb75SLois Curfman McInnes     for (j=0; j<n; j++) {
7906f31f424SBarry Smith       if (indexn[j] < 0) {v++; continue;}
791e32f2f54SBarry 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);
79297e567efSBarry Smith       *v++ = mat->v[indexn[j]*mat->lda + indexm[i]];
793ae80bb75SLois Curfman McInnes     }
794ae80bb75SLois Curfman McInnes   }
7953a40ed3dSBarry Smith   PetscFunctionReturn(0);
796ae80bb75SLois Curfman McInnes }
797ae80bb75SLois Curfman McInnes 
798289bc588SBarry Smith /* -----------------------------------------------------------------*/
799289bc588SBarry Smith 
8004a2ae208SSatish Balay #undef __FUNCT__
8015bba2384SShri Abhyankar #define __FUNCT__ "MatLoad_SeqDense"
802112444f4SShri Abhyankar PetscErrorCode MatLoad_SeqDense(Mat newmat,PetscViewer viewer)
803aabbc4fbSShri Abhyankar {
804aabbc4fbSShri Abhyankar   Mat_SeqDense   *a;
805aabbc4fbSShri Abhyankar   PetscErrorCode ierr;
806aabbc4fbSShri Abhyankar   PetscInt       *scols,i,j,nz,header[4];
807aabbc4fbSShri Abhyankar   int            fd;
808aabbc4fbSShri Abhyankar   PetscMPIInt    size;
809aabbc4fbSShri Abhyankar   PetscInt       *rowlengths = 0,M,N,*cols,grows,gcols;
810aabbc4fbSShri Abhyankar   PetscScalar    *vals,*svals,*v,*w;
811aabbc4fbSShri Abhyankar   MPI_Comm       comm = ((PetscObject)viewer)->comm;
812aabbc4fbSShri Abhyankar 
813aabbc4fbSShri Abhyankar   PetscFunctionBegin;
814aabbc4fbSShri Abhyankar   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
815aabbc4fbSShri Abhyankar   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor");
816aabbc4fbSShri Abhyankar   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
817aabbc4fbSShri Abhyankar   ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr);
818aabbc4fbSShri Abhyankar   if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object");
819aabbc4fbSShri Abhyankar   M = header[1]; N = header[2]; nz = header[3];
820aabbc4fbSShri Abhyankar 
821aabbc4fbSShri Abhyankar   /* set global size if not set already*/
822aabbc4fbSShri Abhyankar   if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) {
823aabbc4fbSShri Abhyankar     ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr);
824aabbc4fbSShri Abhyankar   } else {
825aabbc4fbSShri Abhyankar     /* if sizes and type are already set, check if the vector global sizes are correct */
826aabbc4fbSShri Abhyankar     ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr);
827aabbc4fbSShri 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);
828aabbc4fbSShri Abhyankar   }
829aabbc4fbSShri Abhyankar   ierr = MatSeqDenseSetPreallocation(newmat,PETSC_NULL);CHKERRQ(ierr);
830aabbc4fbSShri Abhyankar 
831aabbc4fbSShri Abhyankar   if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */
832aabbc4fbSShri Abhyankar     a    = (Mat_SeqDense*)newmat->data;
833aabbc4fbSShri Abhyankar     v    = a->v;
834aabbc4fbSShri Abhyankar     /* Allocate some temp space to read in the values and then flip them
835aabbc4fbSShri Abhyankar        from row major to column major */
836aabbc4fbSShri Abhyankar     ierr = PetscMalloc((M*N > 0 ? M*N : 1)*sizeof(PetscScalar),&w);CHKERRQ(ierr);
837aabbc4fbSShri Abhyankar     /* read in nonzero values */
838aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr);
839aabbc4fbSShri Abhyankar     /* now flip the values and store them in the matrix*/
840aabbc4fbSShri Abhyankar     for (j=0; j<N; j++) {
841aabbc4fbSShri Abhyankar       for (i=0; i<M; i++) {
842aabbc4fbSShri Abhyankar         *v++ =w[i*N+j];
843aabbc4fbSShri Abhyankar       }
844aabbc4fbSShri Abhyankar     }
845aabbc4fbSShri Abhyankar     ierr = PetscFree(w);CHKERRQ(ierr);
846aabbc4fbSShri Abhyankar   } else {
847aabbc4fbSShri Abhyankar     /* read row lengths */
848aabbc4fbSShri Abhyankar     ierr = PetscMalloc((M+1)*sizeof(PetscInt),&rowlengths);CHKERRQ(ierr);
849aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr);
850aabbc4fbSShri Abhyankar 
851aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
852aabbc4fbSShri Abhyankar     v = a->v;
853aabbc4fbSShri Abhyankar 
854aabbc4fbSShri Abhyankar     /* read column indices and nonzeros */
855aabbc4fbSShri Abhyankar     ierr = PetscMalloc((nz+1)*sizeof(PetscInt),&scols);CHKERRQ(ierr);
856aabbc4fbSShri Abhyankar     cols = scols;
857aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr);
858aabbc4fbSShri Abhyankar     ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&svals);CHKERRQ(ierr);
859aabbc4fbSShri Abhyankar     vals = svals;
860aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr);
861aabbc4fbSShri Abhyankar 
862aabbc4fbSShri Abhyankar     /* insert into matrix */
863aabbc4fbSShri Abhyankar     for (i=0; i<M; i++) {
864aabbc4fbSShri Abhyankar       for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j];
865aabbc4fbSShri Abhyankar       svals += rowlengths[i]; scols += rowlengths[i];
866aabbc4fbSShri Abhyankar     }
867aabbc4fbSShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
868aabbc4fbSShri Abhyankar     ierr = PetscFree(cols);CHKERRQ(ierr);
869aabbc4fbSShri Abhyankar     ierr = PetscFree(rowlengths);CHKERRQ(ierr);
870aabbc4fbSShri Abhyankar   }
871aabbc4fbSShri Abhyankar   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
872aabbc4fbSShri Abhyankar   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
873aabbc4fbSShri Abhyankar 
874aabbc4fbSShri Abhyankar   PetscFunctionReturn(0);
875aabbc4fbSShri Abhyankar }
876aabbc4fbSShri Abhyankar 
877aabbc4fbSShri Abhyankar #undef __FUNCT__
8784a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII"
8796849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer)
880289bc588SBarry Smith {
881932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
882dfbe8321SBarry Smith   PetscErrorCode    ierr;
88313f74950SBarry Smith   PetscInt          i,j;
8842dcb1b2aSMatthew Knepley   const char        *name;
88587828ca2SBarry Smith   PetscScalar       *v;
886f3ef73ceSBarry Smith   PetscViewerFormat format;
8875f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX)
888ace3abfcSBarry Smith   PetscBool         allreal = PETSC_TRUE;
8895f481a85SSatish Balay #endif
890932b0c3eSLois Curfman McInnes 
8913a40ed3dSBarry Smith   PetscFunctionBegin;
892b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
893456192e2SBarry Smith   if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
8943a40ed3dSBarry Smith     PetscFunctionReturn(0);  /* do nothing for now */
895fb9695e5SSatish Balay   } else if (format == PETSC_VIEWER_ASCII_COMMON) {
896d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
8977566de4bSShri Abhyankar     ierr = PetscObjectPrintClassNamePrefixType((PetscObject)A,viewer,"Matrix Object");CHKERRQ(ierr);
898d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
89944cd7ae7SLois Curfman McInnes       v = a->v + i;
90077431f27SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr);
901d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
902aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
903329f5518SBarry Smith         if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) {
904a83599f4SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %G + %G i) ",j,PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr);
905329f5518SBarry Smith         } else if (PetscRealPart(*v)) {
906a83599f4SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,PetscRealPart(*v));CHKERRQ(ierr);
9076831982aSBarry Smith         }
90880cd9d93SLois Curfman McInnes #else
9096831982aSBarry Smith         if (*v) {
910a83599f4SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,*v);CHKERRQ(ierr);
9116831982aSBarry Smith         }
91280cd9d93SLois Curfman McInnes #endif
9131b807ce4Svictorle         v += a->lda;
91480cd9d93SLois Curfman McInnes       }
915b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
91680cd9d93SLois Curfman McInnes     }
917d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
9183a40ed3dSBarry Smith   } else {
919d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
920aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
92147989497SBarry Smith     /* determine if matrix has all real values */
92247989497SBarry Smith     v = a->v;
923d0f46423SBarry Smith     for (i=0; i<A->rmap->n*A->cmap->n; i++) {
924ffac6cdbSBarry Smith         if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break ;}
92547989497SBarry Smith     }
92647989497SBarry Smith #endif
927fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
9283a7fca6bSBarry Smith       ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr);
929d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr);
930d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
931fb9695e5SSatish Balay       ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr);
9327566de4bSShri Abhyankar     } else {
9337566de4bSShri Abhyankar       ierr = PetscObjectPrintClassNamePrefixType((PetscObject)A,viewer,"Matrix Object");CHKERRQ(ierr);
934ffac6cdbSBarry Smith     }
935ffac6cdbSBarry Smith 
936d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
937932b0c3eSLois Curfman McInnes       v = a->v + i;
938d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
939aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
94047989497SBarry Smith         if (allreal) {
941c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr);
94247989497SBarry Smith         } else {
943c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr);
94447989497SBarry Smith         }
945289bc588SBarry Smith #else
946c61cd2faSJed Brown         ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr);
947289bc588SBarry Smith #endif
9481b807ce4Svictorle         v += a->lda;
949289bc588SBarry Smith       }
950b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
951289bc588SBarry Smith     }
952fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
953b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr);
954ffac6cdbSBarry Smith     }
955d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
956da3a660dSBarry Smith   }
957b0a32e0cSBarry Smith   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
9583a40ed3dSBarry Smith   PetscFunctionReturn(0);
959289bc588SBarry Smith }
960289bc588SBarry Smith 
9614a2ae208SSatish Balay #undef __FUNCT__
9624a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary"
9636849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer)
964932b0c3eSLois Curfman McInnes {
965932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
9666849ba73SBarry Smith   PetscErrorCode    ierr;
96713f74950SBarry Smith   int               fd;
968d0f46423SBarry Smith   PetscInt          ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n;
969f4403165SShri Abhyankar   PetscScalar       *v,*anonz,*vals;
970f4403165SShri Abhyankar   PetscViewerFormat format;
971932b0c3eSLois Curfman McInnes 
9723a40ed3dSBarry Smith   PetscFunctionBegin;
973b0a32e0cSBarry Smith   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
97490ace30eSBarry Smith 
975f4403165SShri Abhyankar   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
976f4403165SShri Abhyankar   if (format == PETSC_VIEWER_NATIVE) {
977f4403165SShri Abhyankar     /* store the matrix as a dense matrix */
978f4403165SShri Abhyankar     ierr = PetscMalloc(4*sizeof(PetscInt),&col_lens);CHKERRQ(ierr);
979f4403165SShri Abhyankar     col_lens[0] = MAT_FILE_CLASSID;
980f4403165SShri Abhyankar     col_lens[1] = m;
981f4403165SShri Abhyankar     col_lens[2] = n;
982f4403165SShri Abhyankar     col_lens[3] = MATRIX_BINARY_FORMAT_DENSE;
983f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
984f4403165SShri Abhyankar     ierr = PetscFree(col_lens);CHKERRQ(ierr);
985f4403165SShri Abhyankar 
986f4403165SShri Abhyankar     /* write out matrix, by rows */
987f4403165SShri Abhyankar     ierr = PetscMalloc((m*n+1)*sizeof(PetscScalar),&vals);CHKERRQ(ierr);
988f4403165SShri Abhyankar     v    = a->v;
989f4403165SShri Abhyankar     for (j=0; j<n; j++) {
990f4403165SShri Abhyankar       for (i=0; i<m; i++) {
991f4403165SShri Abhyankar         vals[j + i*n] = *v++;
992f4403165SShri Abhyankar       }
993f4403165SShri Abhyankar     }
994f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
995f4403165SShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
996f4403165SShri Abhyankar   } else {
99713f74950SBarry Smith     ierr = PetscMalloc((4+nz)*sizeof(PetscInt),&col_lens);CHKERRQ(ierr);
9980700a824SBarry Smith     col_lens[0] = MAT_FILE_CLASSID;
999932b0c3eSLois Curfman McInnes     col_lens[1] = m;
1000932b0c3eSLois Curfman McInnes     col_lens[2] = n;
1001932b0c3eSLois Curfman McInnes     col_lens[3] = nz;
1002932b0c3eSLois Curfman McInnes 
1003932b0c3eSLois Curfman McInnes     /* store lengths of each row and write (including header) to file */
1004932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) col_lens[4+i] = n;
10056f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
1006932b0c3eSLois Curfman McInnes 
1007932b0c3eSLois Curfman McInnes     /* Possibly should write in smaller increments, not whole matrix at once? */
1008932b0c3eSLois Curfman McInnes     /* store column indices (zero start index) */
1009932b0c3eSLois Curfman McInnes     ict = 0;
1010932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1011932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) col_lens[ict++] = j;
1012932b0c3eSLois Curfman McInnes     }
10136f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
1014606d414cSSatish Balay     ierr = PetscFree(col_lens);CHKERRQ(ierr);
1015932b0c3eSLois Curfman McInnes 
1016932b0c3eSLois Curfman McInnes     /* store nonzero values */
101787828ca2SBarry Smith     ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&anonz);CHKERRQ(ierr);
1018932b0c3eSLois Curfman McInnes     ict  = 0;
1019932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1020932b0c3eSLois Curfman McInnes       v = a->v + i;
1021932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) {
10221b807ce4Svictorle         anonz[ict++] = *v; v += a->lda;
1023932b0c3eSLois Curfman McInnes       }
1024932b0c3eSLois Curfman McInnes     }
10256f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
1026606d414cSSatish Balay     ierr = PetscFree(anonz);CHKERRQ(ierr);
1027f4403165SShri Abhyankar   }
10283a40ed3dSBarry Smith   PetscFunctionReturn(0);
1029932b0c3eSLois Curfman McInnes }
1030932b0c3eSLois Curfman McInnes 
10314a2ae208SSatish Balay #undef __FUNCT__
10324a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom"
1033dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa)
1034f1af5d2fSBarry Smith {
1035f1af5d2fSBarry Smith   Mat               A = (Mat) Aa;
1036f1af5d2fSBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
10376849ba73SBarry Smith   PetscErrorCode    ierr;
1038d0f46423SBarry Smith   PetscInt          m = A->rmap->n,n = A->cmap->n,color,i,j;
103987828ca2SBarry Smith   PetscScalar       *v = a->v;
1040b0a32e0cSBarry Smith   PetscViewer       viewer;
1041b0a32e0cSBarry Smith   PetscDraw         popup;
1042329f5518SBarry Smith   PetscReal         xl,yl,xr,yr,x_l,x_r,y_l,y_r,scale,maxv = 0.0;
1043f3ef73ceSBarry Smith   PetscViewerFormat format;
1044f1af5d2fSBarry Smith 
1045f1af5d2fSBarry Smith   PetscFunctionBegin;
1046f1af5d2fSBarry Smith   ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr);
1047b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1048b0a32e0cSBarry Smith   ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr);
1049f1af5d2fSBarry Smith 
1050f1af5d2fSBarry Smith   /* Loop over matrix elements drawing boxes */
1051fb9695e5SSatish Balay   if (format != PETSC_VIEWER_DRAW_CONTOUR) {
1052f1af5d2fSBarry Smith     /* Blue for negative and Red for positive */
1053b0a32e0cSBarry Smith     color = PETSC_DRAW_BLUE;
1054f1af5d2fSBarry Smith     for (j = 0; j < n; j++) {
1055f1af5d2fSBarry Smith       x_l = j;
1056f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1057f1af5d2fSBarry Smith       for (i = 0; i < m; i++) {
1058f1af5d2fSBarry Smith         y_l = m - i - 1.0;
1059f1af5d2fSBarry Smith         y_r = y_l + 1.0;
1060329f5518SBarry Smith         if (PetscRealPart(v[j*m+i]) >  0.) {
1061b0a32e0cSBarry Smith           color = PETSC_DRAW_RED;
1062329f5518SBarry Smith         } else if (PetscRealPart(v[j*m+i]) <  0.) {
1063b0a32e0cSBarry Smith           color = PETSC_DRAW_BLUE;
1064f1af5d2fSBarry Smith         } else {
1065f1af5d2fSBarry Smith           continue;
1066f1af5d2fSBarry Smith         }
1067b0a32e0cSBarry Smith         ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1068f1af5d2fSBarry Smith       }
1069f1af5d2fSBarry Smith     }
1070f1af5d2fSBarry Smith   } else {
1071f1af5d2fSBarry Smith     /* use contour shading to indicate magnitude of values */
1072f1af5d2fSBarry Smith     /* first determine max of all nonzero values */
1073f1af5d2fSBarry Smith     for (i = 0; i < m*n; i++) {
1074f1af5d2fSBarry Smith       if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]);
1075f1af5d2fSBarry Smith     }
1076b0a32e0cSBarry Smith     scale = (245.0 - PETSC_DRAW_BASIC_COLORS)/maxv;
1077b0a32e0cSBarry Smith     ierr  = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr);
1078b0a32e0cSBarry Smith     if (popup) {ierr  = PetscDrawScalePopup(popup,0.0,maxv);CHKERRQ(ierr);}
1079f1af5d2fSBarry Smith     for (j = 0; j < n; j++) {
1080f1af5d2fSBarry Smith       x_l = j;
1081f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1082f1af5d2fSBarry Smith       for (i = 0; i < m; i++) {
1083f1af5d2fSBarry Smith         y_l   = m - i - 1.0;
1084f1af5d2fSBarry Smith         y_r   = y_l + 1.0;
1085b0a32e0cSBarry Smith         color = PETSC_DRAW_BASIC_COLORS + (int)(scale*PetscAbsScalar(v[j*m+i]));
1086b0a32e0cSBarry Smith         ierr  = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1087f1af5d2fSBarry Smith       }
1088f1af5d2fSBarry Smith     }
1089f1af5d2fSBarry Smith   }
1090f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1091f1af5d2fSBarry Smith }
1092f1af5d2fSBarry Smith 
10934a2ae208SSatish Balay #undef __FUNCT__
10944a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw"
1095dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer)
1096f1af5d2fSBarry Smith {
1097b0a32e0cSBarry Smith   PetscDraw      draw;
1098ace3abfcSBarry Smith   PetscBool      isnull;
1099329f5518SBarry Smith   PetscReal      xr,yr,xl,yl,h,w;
1100dfbe8321SBarry Smith   PetscErrorCode ierr;
1101f1af5d2fSBarry Smith 
1102f1af5d2fSBarry Smith   PetscFunctionBegin;
1103b0a32e0cSBarry Smith   ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
1104b0a32e0cSBarry Smith   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
1105abc0a331SBarry Smith   if (isnull) PetscFunctionReturn(0);
1106f1af5d2fSBarry Smith 
1107f1af5d2fSBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr);
1108d0f46423SBarry Smith   xr  = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0;
1109f1af5d2fSBarry Smith   xr += w;    yr += h;  xl = -w;     yl = -h;
1110b0a32e0cSBarry Smith   ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr);
1111b0a32e0cSBarry Smith   ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr);
1112f1af5d2fSBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",PETSC_NULL);CHKERRQ(ierr);
1113f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1114f1af5d2fSBarry Smith }
1115f1af5d2fSBarry Smith 
11164a2ae208SSatish Balay #undef __FUNCT__
11174a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense"
1118dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer)
1119932b0c3eSLois Curfman McInnes {
1120dfbe8321SBarry Smith   PetscErrorCode ierr;
1121ace3abfcSBarry Smith   PetscBool      iascii,isbinary,isdraw;
1122932b0c3eSLois Curfman McInnes 
11233a40ed3dSBarry Smith   PetscFunctionBegin;
1124251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
1125251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
1126251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
11270f5bd95cSBarry Smith 
1128c45a1595SBarry Smith   if (iascii) {
1129c45a1595SBarry Smith     ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr);
11300f5bd95cSBarry Smith   } else if (isbinary) {
11313a40ed3dSBarry Smith     ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr);
1132f1af5d2fSBarry Smith   } else if (isdraw) {
1133f1af5d2fSBarry Smith     ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr);
11345cd90555SBarry Smith   } else {
1135e32f2f54SBarry Smith     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Viewer type %s not supported by dense matrix",((PetscObject)viewer)->type_name);
1136932b0c3eSLois Curfman McInnes   }
11373a40ed3dSBarry Smith   PetscFunctionReturn(0);
1138932b0c3eSLois Curfman McInnes }
1139289bc588SBarry Smith 
11404a2ae208SSatish Balay #undef __FUNCT__
11414a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense"
1142dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqDense(Mat mat)
1143289bc588SBarry Smith {
1144ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)mat->data;
1145dfbe8321SBarry Smith   PetscErrorCode ierr;
114690f02eecSBarry Smith 
11473a40ed3dSBarry Smith   PetscFunctionBegin;
1148aa482453SBarry Smith #if defined(PETSC_USE_LOG)
1149d0f46423SBarry Smith   PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n);
1150a5a9c739SBarry Smith #endif
115105b42c5fSBarry Smith   ierr = PetscFree(l->pivots);CHKERRQ(ierr);
11526857c123SSatish Balay   if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);}
1153bf0cc555SLisandro Dalcin   ierr = PetscFree(mat->data);CHKERRQ(ierr);
1154dbd8c25aSHong Zhang 
1155dbd8c25aSHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr);
11568c778c55SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatDenseGetArray_C","",PETSC_NULL);CHKERRQ(ierr);
11578c778c55SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatDenseRestoreArray_C","",PETSC_NULL);CHKERRQ(ierr);
1158901853e0SKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatSeqDenseSetPreallocation_C","",PETSC_NULL);CHKERRQ(ierr);
11594ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMult_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr);
11604ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr);
11614ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr);
11623a40ed3dSBarry Smith   PetscFunctionReturn(0);
1163289bc588SBarry Smith }
1164289bc588SBarry Smith 
11654a2ae208SSatish Balay #undef __FUNCT__
11664a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense"
1167fc4dec0aSBarry Smith PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout)
1168289bc588SBarry Smith {
1169c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
11706849ba73SBarry Smith   PetscErrorCode ierr;
117113f74950SBarry Smith   PetscInt       k,j,m,n,M;
117287828ca2SBarry Smith   PetscScalar    *v,tmp;
117348b35521SBarry Smith 
11743a40ed3dSBarry Smith   PetscFunctionBegin;
1175d0f46423SBarry Smith   v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n;
1176e9695a30SBarry Smith   if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */
1177e7e72b3dSBarry Smith     if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place");
1178e7e72b3dSBarry Smith     else {
1179d3e5ee88SLois Curfman McInnes       for (j=0; j<m; j++) {
1180289bc588SBarry Smith         for (k=0; k<j; k++) {
11811b807ce4Svictorle           tmp = v[j + k*M];
11821b807ce4Svictorle           v[j + k*M] = v[k + j*M];
11831b807ce4Svictorle           v[k + j*M] = tmp;
1184289bc588SBarry Smith         }
1185289bc588SBarry Smith       }
1186d64ed03dSBarry Smith     }
11873a40ed3dSBarry Smith   } else { /* out-of-place transpose */
1188d3e5ee88SLois Curfman McInnes     Mat          tmat;
1189ec8511deSBarry Smith     Mat_SeqDense *tmatd;
119087828ca2SBarry Smith     PetscScalar  *v2;
1191ea709b57SSatish Balay 
1192fc4dec0aSBarry Smith     if (reuse == MAT_INITIAL_MATRIX) {
11937adad957SLisandro Dalcin       ierr  = MatCreate(((PetscObject)A)->comm,&tmat);CHKERRQ(ierr);
1194d0f46423SBarry Smith       ierr  = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr);
11957adad957SLisandro Dalcin       ierr  = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
11965c5985e7SKris Buschelman       ierr  = MatSeqDenseSetPreallocation(tmat,PETSC_NULL);CHKERRQ(ierr);
1197fc4dec0aSBarry Smith     } else {
1198fc4dec0aSBarry Smith       tmat = *matout;
1199fc4dec0aSBarry Smith     }
1200ec8511deSBarry Smith     tmatd = (Mat_SeqDense*)tmat->data;
12010de55854SLois Curfman McInnes     v = mat->v; v2 = tmatd->v;
1202d3e5ee88SLois Curfman McInnes     for (j=0; j<n; j++) {
12031b807ce4Svictorle       for (k=0; k<m; k++) v2[j + k*n] = v[k + j*M];
1204d3e5ee88SLois Curfman McInnes     }
12056d4a8577SBarry Smith     ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
12066d4a8577SBarry Smith     ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1207d3e5ee88SLois Curfman McInnes     *matout = tmat;
120848b35521SBarry Smith   }
12093a40ed3dSBarry Smith   PetscFunctionReturn(0);
1210289bc588SBarry Smith }
1211289bc588SBarry Smith 
12124a2ae208SSatish Balay #undef __FUNCT__
12134a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense"
1214ace3abfcSBarry Smith PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool  *flg)
1215289bc588SBarry Smith {
1216c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data;
1217c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data;
121813f74950SBarry Smith   PetscInt     i,j;
1219a2ea699eSBarry Smith   PetscScalar  *v1,*v2;
12209ea5d5aeSSatish Balay 
12213a40ed3dSBarry Smith   PetscFunctionBegin;
1222d0f46423SBarry Smith   if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1223d0f46423SBarry Smith   if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1224d0f46423SBarry Smith   for (i=0; i<A1->rmap->n; i++) {
12251b807ce4Svictorle     v1 = mat1->v+i; v2 = mat2->v+i;
1226d0f46423SBarry Smith     for (j=0; j<A1->cmap->n; j++) {
12273a40ed3dSBarry Smith       if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
12281b807ce4Svictorle       v1 += mat1->lda; v2 += mat2->lda;
12291b807ce4Svictorle     }
1230289bc588SBarry Smith   }
123177c4ece6SBarry Smith   *flg = PETSC_TRUE;
12323a40ed3dSBarry Smith   PetscFunctionReturn(0);
1233289bc588SBarry Smith }
1234289bc588SBarry Smith 
12354a2ae208SSatish Balay #undef __FUNCT__
12364a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense"
1237dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v)
1238289bc588SBarry Smith {
1239c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
1240dfbe8321SBarry Smith   PetscErrorCode ierr;
124113f74950SBarry Smith   PetscInt       i,n,len;
124287828ca2SBarry Smith   PetscScalar    *x,zero = 0.0;
124344cd7ae7SLois Curfman McInnes 
12443a40ed3dSBarry Smith   PetscFunctionBegin;
12452dcb1b2aSMatthew Knepley   ierr = VecSet(v,zero);CHKERRQ(ierr);
12467a97a34bSBarry Smith   ierr = VecGetSize(v,&n);CHKERRQ(ierr);
12471ebc52fbSHong Zhang   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1248d0f46423SBarry Smith   len = PetscMin(A->rmap->n,A->cmap->n);
1249e32f2f54SBarry Smith   if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec");
125044cd7ae7SLois Curfman McInnes   for (i=0; i<len; i++) {
12511b807ce4Svictorle     x[i] = mat->v[i*mat->lda + i];
1252289bc588SBarry Smith   }
12531ebc52fbSHong Zhang   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
12543a40ed3dSBarry Smith   PetscFunctionReturn(0);
1255289bc588SBarry Smith }
1256289bc588SBarry Smith 
12574a2ae208SSatish Balay #undef __FUNCT__
12584a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense"
1259dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr)
1260289bc588SBarry Smith {
1261c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
126287828ca2SBarry Smith   PetscScalar    *l,*r,x,*v;
1263dfbe8321SBarry Smith   PetscErrorCode ierr;
1264d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n;
126555659b69SBarry Smith 
12663a40ed3dSBarry Smith   PetscFunctionBegin;
126728988994SBarry Smith   if (ll) {
12687a97a34bSBarry Smith     ierr = VecGetSize(ll,&m);CHKERRQ(ierr);
12691ebc52fbSHong Zhang     ierr = VecGetArray(ll,&l);CHKERRQ(ierr);
1270e32f2f54SBarry Smith     if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size");
1271da3a660dSBarry Smith     for (i=0; i<m; i++) {
1272da3a660dSBarry Smith       x = l[i];
1273da3a660dSBarry Smith       v = mat->v + i;
1274da3a660dSBarry Smith       for (j=0; j<n; j++) { (*v) *= x; v+= m;}
1275da3a660dSBarry Smith     }
12761ebc52fbSHong Zhang     ierr = VecRestoreArray(ll,&l);CHKERRQ(ierr);
1277efee365bSSatish Balay     ierr = PetscLogFlops(n*m);CHKERRQ(ierr);
1278da3a660dSBarry Smith   }
127928988994SBarry Smith   if (rr) {
12807a97a34bSBarry Smith     ierr = VecGetSize(rr,&n);CHKERRQ(ierr);
12811ebc52fbSHong Zhang     ierr = VecGetArray(rr,&r);CHKERRQ(ierr);
1282e32f2f54SBarry Smith     if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size");
1283da3a660dSBarry Smith     for (i=0; i<n; i++) {
1284da3a660dSBarry Smith       x = r[i];
1285da3a660dSBarry Smith       v = mat->v + i*m;
1286da3a660dSBarry Smith       for (j=0; j<m; j++) { (*v++) *= x;}
1287da3a660dSBarry Smith     }
12881ebc52fbSHong Zhang     ierr = VecRestoreArray(rr,&r);CHKERRQ(ierr);
1289efee365bSSatish Balay     ierr = PetscLogFlops(n*m);CHKERRQ(ierr);
1290da3a660dSBarry Smith   }
12913a40ed3dSBarry Smith   PetscFunctionReturn(0);
1292289bc588SBarry Smith }
1293289bc588SBarry Smith 
12944a2ae208SSatish Balay #undef __FUNCT__
12954a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense"
1296dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm)
1297289bc588SBarry Smith {
1298c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
129987828ca2SBarry Smith   PetscScalar  *v = mat->v;
1300329f5518SBarry Smith   PetscReal    sum = 0.0;
1301d0f46423SBarry Smith   PetscInt     lda=mat->lda,m=A->rmap->n,i,j;
1302efee365bSSatish Balay   PetscErrorCode ierr;
130355659b69SBarry Smith 
13043a40ed3dSBarry Smith   PetscFunctionBegin;
1305289bc588SBarry Smith   if (type == NORM_FROBENIUS) {
1306a5ce6ee0Svictorle     if (lda>m) {
1307d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1308a5ce6ee0Svictorle         v = mat->v+j*lda;
1309a5ce6ee0Svictorle         for (i=0; i<m; i++) {
1310a5ce6ee0Svictorle           sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1311a5ce6ee0Svictorle         }
1312a5ce6ee0Svictorle       }
1313a5ce6ee0Svictorle     } else {
1314d0f46423SBarry Smith       for (i=0; i<A->cmap->n*A->rmap->n; i++) {
1315329f5518SBarry Smith         sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1316289bc588SBarry Smith       }
1317a5ce6ee0Svictorle     }
13188f1a2a5eSBarry Smith     *nrm = PetscSqrtReal(sum);
1319dc0b31edSSatish Balay     ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
13203a40ed3dSBarry Smith   } else if (type == NORM_1) {
1321064f8208SBarry Smith     *nrm = 0.0;
1322d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
13231b807ce4Svictorle       v = mat->v + j*mat->lda;
1324289bc588SBarry Smith       sum = 0.0;
1325d0f46423SBarry Smith       for (i=0; i<A->rmap->n; i++) {
132633a8263dSBarry Smith         sum += PetscAbsScalar(*v);  v++;
1327289bc588SBarry Smith       }
1328064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1329289bc588SBarry Smith     }
1330d0f46423SBarry Smith     ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr);
13313a40ed3dSBarry Smith   } else if (type == NORM_INFINITY) {
1332064f8208SBarry Smith     *nrm = 0.0;
1333d0f46423SBarry Smith     for (j=0; j<A->rmap->n; j++) {
1334289bc588SBarry Smith       v = mat->v + j;
1335289bc588SBarry Smith       sum = 0.0;
1336d0f46423SBarry Smith       for (i=0; i<A->cmap->n; i++) {
13371b807ce4Svictorle         sum += PetscAbsScalar(*v); v += mat->lda;
1338289bc588SBarry Smith       }
1339064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1340289bc588SBarry Smith     }
1341d0f46423SBarry Smith     ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr);
1342e7e72b3dSBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm");
13433a40ed3dSBarry Smith   PetscFunctionReturn(0);
1344289bc588SBarry Smith }
1345289bc588SBarry Smith 
13464a2ae208SSatish Balay #undef __FUNCT__
13474a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense"
1348ace3abfcSBarry Smith PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool  flg)
1349289bc588SBarry Smith {
1350c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *aij = (Mat_SeqDense*)A->data;
135163ba0a88SBarry Smith   PetscErrorCode ierr;
135267e560aaSBarry Smith 
13533a40ed3dSBarry Smith   PetscFunctionBegin;
1354b5a2b587SKris Buschelman   switch (op) {
1355b5a2b587SKris Buschelman   case MAT_ROW_ORIENTED:
13564e0d8c25SBarry Smith     aij->roworiented = flg;
1357b5a2b587SKris Buschelman     break;
1358512a5fc5SBarry Smith   case MAT_NEW_NONZERO_LOCATIONS:
1359b5a2b587SKris Buschelman   case MAT_NEW_NONZERO_LOCATION_ERR:
13603971808eSMatthew Knepley   case MAT_NEW_NONZERO_ALLOCATION_ERR:
13614e0d8c25SBarry Smith   case MAT_NEW_DIAGONALS:
136213fa8e87SLisandro Dalcin   case MAT_KEEP_NONZERO_PATTERN:
1363b5a2b587SKris Buschelman   case MAT_IGNORE_OFF_PROC_ENTRIES:
1364b5a2b587SKris Buschelman   case MAT_USE_HASH_TABLE:
13655021d80fSJed Brown   case MAT_IGNORE_LOWER_TRIANGULAR:
13665021d80fSJed Brown     ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr);
13675021d80fSJed Brown     break;
13685021d80fSJed Brown   case MAT_SPD:
136977e54ba9SKris Buschelman   case MAT_SYMMETRIC:
137077e54ba9SKris Buschelman   case MAT_STRUCTURALLY_SYMMETRIC:
13719a4540c5SBarry Smith   case MAT_HERMITIAN:
13729a4540c5SBarry Smith   case MAT_SYMMETRY_ETERNAL:
13735021d80fSJed Brown     /* These options are handled directly by MatSetOption() */
137477e54ba9SKris Buschelman     break;
1375b5a2b587SKris Buschelman   default:
1376e32f2f54SBarry Smith     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]);
13773a40ed3dSBarry Smith   }
13783a40ed3dSBarry Smith   PetscFunctionReturn(0);
1379289bc588SBarry Smith }
1380289bc588SBarry Smith 
13814a2ae208SSatish Balay #undef __FUNCT__
13824a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense"
1383dfbe8321SBarry Smith PetscErrorCode MatZeroEntries_SeqDense(Mat A)
13846f0a148fSBarry Smith {
1385ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)A->data;
13866849ba73SBarry Smith   PetscErrorCode ierr;
1387d0f46423SBarry Smith   PetscInt       lda=l->lda,m=A->rmap->n,j;
13883a40ed3dSBarry Smith 
13893a40ed3dSBarry Smith   PetscFunctionBegin;
1390a5ce6ee0Svictorle   if (lda>m) {
1391d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1392a5ce6ee0Svictorle       ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
1393a5ce6ee0Svictorle     }
1394a5ce6ee0Svictorle   } else {
1395d0f46423SBarry Smith     ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1396a5ce6ee0Svictorle   }
13973a40ed3dSBarry Smith   PetscFunctionReturn(0);
13986f0a148fSBarry Smith }
13996f0a148fSBarry Smith 
14004a2ae208SSatish Balay #undef __FUNCT__
14014a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense"
14022b40b63fSBarry Smith PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b)
14036f0a148fSBarry Smith {
140497b48c8fSBarry Smith   PetscErrorCode    ierr;
1405ec8511deSBarry Smith   Mat_SeqDense      *l = (Mat_SeqDense*)A->data;
1406b9679d65SBarry Smith   PetscInt          m = l->lda, n = A->cmap->n, i,j;
140797b48c8fSBarry Smith   PetscScalar       *slot,*bb;
140897b48c8fSBarry Smith   const PetscScalar *xx;
140955659b69SBarry Smith 
14103a40ed3dSBarry Smith   PetscFunctionBegin;
1411b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG)
1412b9679d65SBarry Smith   for (i=0; i<N; i++) {
1413b9679d65SBarry Smith     if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed");
1414b9679d65SBarry Smith     if (rows[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row %D requested to be zeroed greater than or equal number of rows %D",rows[i],A->rmap->n);
1415b9679d65SBarry Smith   }
1416b9679d65SBarry Smith #endif
1417b9679d65SBarry Smith 
141897b48c8fSBarry Smith   /* fix right hand side if needed */
141997b48c8fSBarry Smith   if (x && b) {
142097b48c8fSBarry Smith     ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr);
142197b48c8fSBarry Smith     ierr = VecGetArray(b,&bb);CHKERRQ(ierr);
142297b48c8fSBarry Smith     for (i=0; i<N; i++) {
142397b48c8fSBarry Smith       bb[rows[i]] = diag*xx[rows[i]];
142497b48c8fSBarry Smith     }
142597b48c8fSBarry Smith     ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr);
142697b48c8fSBarry Smith     ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr);
142797b48c8fSBarry Smith   }
142897b48c8fSBarry Smith 
14296f0a148fSBarry Smith   for (i=0; i<N; i++) {
14306f0a148fSBarry Smith     slot = l->v + rows[i];
1431b9679d65SBarry Smith     for (j=0; j<n; j++) { *slot = 0.0; slot += m;}
14326f0a148fSBarry Smith   }
1433f4df32b1SMatthew Knepley   if (diag != 0.0) {
1434b9679d65SBarry Smith     if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices");
14356f0a148fSBarry Smith     for (i=0; i<N; i++) {
1436b9679d65SBarry Smith       slot = l->v + (m+1)*rows[i];
1437f4df32b1SMatthew Knepley       *slot = diag;
14386f0a148fSBarry Smith     }
14396f0a148fSBarry Smith   }
14403a40ed3dSBarry Smith   PetscFunctionReturn(0);
14416f0a148fSBarry Smith }
1442557bce09SLois Curfman McInnes 
14434a2ae208SSatish Balay #undef __FUNCT__
14448c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray_SeqDense"
14458c778c55SBarry Smith PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar *array[])
144664e87e97SBarry Smith {
1447c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
14483a40ed3dSBarry Smith 
14493a40ed3dSBarry Smith   PetscFunctionBegin;
1450e32f2f54SBarry 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");
145164e87e97SBarry Smith   *array = mat->v;
14523a40ed3dSBarry Smith   PetscFunctionReturn(0);
145364e87e97SBarry Smith }
14540754003eSLois Curfman McInnes 
14554a2ae208SSatish Balay #undef __FUNCT__
14568c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray_SeqDense"
14578c778c55SBarry Smith PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar *array[])
1458ff14e315SSatish Balay {
14593a40ed3dSBarry Smith   PetscFunctionBegin;
146009b544d4SBarry Smith   *array = 0; /* user cannot accidently use the array later */
14613a40ed3dSBarry Smith   PetscFunctionReturn(0);
1462ff14e315SSatish Balay }
14630754003eSLois Curfman McInnes 
14644a2ae208SSatish Balay #undef __FUNCT__
14658c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray"
1466dec5eb66SMatthew G Knepley /*@C
14678c778c55SBarry Smith    MatDenseGetArray - gives access to the array where the data for a SeqDense matrix is stored
146873a71a0fSBarry Smith 
146973a71a0fSBarry Smith    Not Collective
147073a71a0fSBarry Smith 
147173a71a0fSBarry Smith    Input Parameter:
147273a71a0fSBarry Smith .  mat - a MATSEQDENSE matrix
147373a71a0fSBarry Smith 
147473a71a0fSBarry Smith    Output Parameter:
147573a71a0fSBarry Smith .   array - pointer to the data
147673a71a0fSBarry Smith 
147773a71a0fSBarry Smith    Level: intermediate
147873a71a0fSBarry Smith 
14798c778c55SBarry Smith .seealso: MatDenseRestoreArray()
148073a71a0fSBarry Smith @*/
14818c778c55SBarry Smith PetscErrorCode  MatDenseGetArray(Mat A,PetscScalar **array)
148273a71a0fSBarry Smith {
148373a71a0fSBarry Smith   PetscErrorCode ierr;
148473a71a0fSBarry Smith 
148573a71a0fSBarry Smith   PetscFunctionBegin;
14868c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
148773a71a0fSBarry Smith   PetscFunctionReturn(0);
148873a71a0fSBarry Smith }
148973a71a0fSBarry Smith 
149073a71a0fSBarry Smith #undef __FUNCT__
14918c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray"
1492dec5eb66SMatthew G Knepley /*@C
14938c778c55SBarry Smith    MatDenseRestoreArray - returns access to the array where the data for a SeqDense matrix is stored obtained by MatDenseGetArray()
149473a71a0fSBarry Smith 
149573a71a0fSBarry Smith    Not Collective
149673a71a0fSBarry Smith 
149773a71a0fSBarry Smith    Input Parameters:
149873a71a0fSBarry Smith .  mat - a MATSEQDENSE matrix
149973a71a0fSBarry Smith .  array - pointer to the data
150073a71a0fSBarry Smith 
150173a71a0fSBarry Smith    Level: intermediate
150273a71a0fSBarry Smith 
15038c778c55SBarry Smith .seealso: MatDenseGetArray()
150473a71a0fSBarry Smith @*/
15058c778c55SBarry Smith PetscErrorCode  MatDenseRestoreArray(Mat A,PetscScalar **array)
150673a71a0fSBarry Smith {
150773a71a0fSBarry Smith   PetscErrorCode ierr;
150873a71a0fSBarry Smith 
150973a71a0fSBarry Smith   PetscFunctionBegin;
15108c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
151173a71a0fSBarry Smith   PetscFunctionReturn(0);
151273a71a0fSBarry Smith }
151373a71a0fSBarry Smith 
151473a71a0fSBarry Smith #undef __FUNCT__
15154a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense"
151613f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B)
15170754003eSLois Curfman McInnes {
1518c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
15196849ba73SBarry Smith   PetscErrorCode ierr;
15205d0c19d7SBarry Smith   PetscInt       i,j,nrows,ncols;
15215d0c19d7SBarry Smith   const PetscInt *irow,*icol;
152287828ca2SBarry Smith   PetscScalar    *av,*bv,*v = mat->v;
15230754003eSLois Curfman McInnes   Mat            newmat;
15240754003eSLois Curfman McInnes 
15253a40ed3dSBarry Smith   PetscFunctionBegin;
152678b31e54SBarry Smith   ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr);
152778b31e54SBarry Smith   ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr);
1528e03a110bSBarry Smith   ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr);
1529e03a110bSBarry Smith   ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr);
15300754003eSLois Curfman McInnes 
1531182d2002SSatish Balay   /* Check submatrixcall */
1532182d2002SSatish Balay   if (scall == MAT_REUSE_MATRIX) {
153313f74950SBarry Smith     PetscInt n_cols,n_rows;
1534182d2002SSatish Balay     ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr);
153521a2c019SBarry Smith     if (n_rows != nrows || n_cols != ncols) {
1536f746d493SDmitry Karpeev       /* resize the result matrix to match number of requested rows/columns */
1537c61587bbSBarry Smith       ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
153821a2c019SBarry Smith     }
1539182d2002SSatish Balay     newmat = *B;
1540182d2002SSatish Balay   } else {
15410754003eSLois Curfman McInnes     /* Create and fill new matrix */
15427adad957SLisandro Dalcin     ierr = MatCreate(((PetscObject)A)->comm,&newmat);CHKERRQ(ierr);
1543f69a0ea3SMatthew Knepley     ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
15447adad957SLisandro Dalcin     ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
15455c5985e7SKris Buschelman     ierr = MatSeqDenseSetPreallocation(newmat,PETSC_NULL);CHKERRQ(ierr);
1546182d2002SSatish Balay   }
1547182d2002SSatish Balay 
1548182d2002SSatish Balay   /* Now extract the data pointers and do the copy,column at a time */
1549182d2002SSatish Balay   bv = ((Mat_SeqDense*)newmat->data)->v;
1550182d2002SSatish Balay 
1551182d2002SSatish Balay   for (i=0; i<ncols; i++) {
15526de62eeeSBarry Smith     av = v + mat->lda*icol[i];
1553182d2002SSatish Balay     for (j=0; j<nrows; j++) {
1554182d2002SSatish Balay       *bv++ = av[irow[j]];
15550754003eSLois Curfman McInnes     }
15560754003eSLois Curfman McInnes   }
1557182d2002SSatish Balay 
1558182d2002SSatish Balay   /* Assemble the matrices so that the correct flags are set */
15596d4a8577SBarry Smith   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
15606d4a8577SBarry Smith   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
15610754003eSLois Curfman McInnes 
15620754003eSLois Curfman McInnes   /* Free work space */
156378b31e54SBarry Smith   ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr);
156478b31e54SBarry Smith   ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr);
1565182d2002SSatish Balay   *B = newmat;
15663a40ed3dSBarry Smith   PetscFunctionReturn(0);
15670754003eSLois Curfman McInnes }
15680754003eSLois Curfman McInnes 
15694a2ae208SSatish Balay #undef __FUNCT__
15704a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense"
157113f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[])
1572905e6a2fSBarry Smith {
15736849ba73SBarry Smith   PetscErrorCode ierr;
157413f74950SBarry Smith   PetscInt       i;
1575905e6a2fSBarry Smith 
15763a40ed3dSBarry Smith   PetscFunctionBegin;
1577905e6a2fSBarry Smith   if (scall == MAT_INITIAL_MATRIX) {
1578b0a32e0cSBarry Smith     ierr = PetscMalloc((n+1)*sizeof(Mat),B);CHKERRQ(ierr);
1579905e6a2fSBarry Smith   }
1580905e6a2fSBarry Smith 
1581905e6a2fSBarry Smith   for (i=0; i<n; i++) {
15826a6a5d1dSBarry Smith     ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr);
1583905e6a2fSBarry Smith   }
15843a40ed3dSBarry Smith   PetscFunctionReturn(0);
1585905e6a2fSBarry Smith }
1586905e6a2fSBarry Smith 
15874a2ae208SSatish Balay #undef __FUNCT__
1588c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense"
1589c0aa2d19SHong Zhang PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode)
1590c0aa2d19SHong Zhang {
1591c0aa2d19SHong Zhang   PetscFunctionBegin;
1592c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1593c0aa2d19SHong Zhang }
1594c0aa2d19SHong Zhang 
1595c0aa2d19SHong Zhang #undef __FUNCT__
1596c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense"
1597c0aa2d19SHong Zhang PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode)
1598c0aa2d19SHong Zhang {
1599c0aa2d19SHong Zhang   PetscFunctionBegin;
1600c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1601c0aa2d19SHong Zhang }
1602c0aa2d19SHong Zhang 
1603c0aa2d19SHong Zhang #undef __FUNCT__
16044a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense"
1605dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str)
16064b0e389bSBarry Smith {
16074b0e389bSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense *)B->data;
16086849ba73SBarry Smith   PetscErrorCode ierr;
1609d0f46423SBarry Smith   PetscInt       lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j;
16103a40ed3dSBarry Smith 
16113a40ed3dSBarry Smith   PetscFunctionBegin;
161233f4a19fSKris Buschelman   /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */
161333f4a19fSKris Buschelman   if (A->ops->copy != B->ops->copy) {
1614cb5b572fSBarry Smith     ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr);
16153a40ed3dSBarry Smith     PetscFunctionReturn(0);
16163a40ed3dSBarry Smith   }
1617e32f2f54SBarry Smith   if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)");
1618a5ce6ee0Svictorle   if (lda1>m || lda2>m) {
16190dbb7854Svictorle     for (j=0; j<n; j++) {
1620a5ce6ee0Svictorle       ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr);
1621a5ce6ee0Svictorle     }
1622a5ce6ee0Svictorle   } else {
1623d0f46423SBarry Smith     ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1624a5ce6ee0Svictorle   }
1625273d9f13SBarry Smith   PetscFunctionReturn(0);
1626273d9f13SBarry Smith }
1627273d9f13SBarry Smith 
16284a2ae208SSatish Balay #undef __FUNCT__
16294994cf47SJed Brown #define __FUNCT__ "MatSetUp_SeqDense"
16304994cf47SJed Brown PetscErrorCode MatSetUp_SeqDense(Mat A)
1631273d9f13SBarry Smith {
1632dfbe8321SBarry Smith   PetscErrorCode ierr;
1633273d9f13SBarry Smith 
1634273d9f13SBarry Smith   PetscFunctionBegin;
1635273d9f13SBarry Smith   ierr =  MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr);
16363a40ed3dSBarry Smith   PetscFunctionReturn(0);
16374b0e389bSBarry Smith }
16384b0e389bSBarry Smith 
1639284134d9SBarry Smith #undef __FUNCT__
1640ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense"
1641ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A)
1642ba337c44SJed Brown {
1643ba337c44SJed Brown   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1644ba337c44SJed Brown   PetscInt       i,nz = A->rmap->n*A->cmap->n;
1645ba337c44SJed Brown   PetscScalar    *aa = a->v;
1646ba337c44SJed Brown 
1647ba337c44SJed Brown   PetscFunctionBegin;
1648ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]);
1649ba337c44SJed Brown   PetscFunctionReturn(0);
1650ba337c44SJed Brown }
1651ba337c44SJed Brown 
1652ba337c44SJed Brown #undef __FUNCT__
1653ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense"
1654ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A)
1655ba337c44SJed Brown {
1656ba337c44SJed Brown   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1657ba337c44SJed Brown   PetscInt       i,nz = A->rmap->n*A->cmap->n;
1658ba337c44SJed Brown   PetscScalar    *aa = a->v;
1659ba337c44SJed Brown 
1660ba337c44SJed Brown   PetscFunctionBegin;
1661ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]);
1662ba337c44SJed Brown   PetscFunctionReturn(0);
1663ba337c44SJed Brown }
1664ba337c44SJed Brown 
1665ba337c44SJed Brown #undef __FUNCT__
1666ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense"
1667ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A)
1668ba337c44SJed Brown {
1669ba337c44SJed Brown   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1670ba337c44SJed Brown   PetscInt       i,nz = A->rmap->n*A->cmap->n;
1671ba337c44SJed Brown   PetscScalar    *aa = a->v;
1672ba337c44SJed Brown 
1673ba337c44SJed Brown   PetscFunctionBegin;
1674ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]);
1675ba337c44SJed Brown   PetscFunctionReturn(0);
1676ba337c44SJed Brown }
1677284134d9SBarry Smith 
1678a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/
1679a9fe9ddaSSatish Balay #undef __FUNCT__
1680a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense"
1681a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1682a9fe9ddaSSatish Balay {
1683a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1684a9fe9ddaSSatish Balay 
1685a9fe9ddaSSatish Balay   PetscFunctionBegin;
1686a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
1687a9fe9ddaSSatish Balay     ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
1688a9fe9ddaSSatish Balay   }
1689a9fe9ddaSSatish Balay   ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
1690a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1691a9fe9ddaSSatish Balay }
1692a9fe9ddaSSatish Balay 
1693a9fe9ddaSSatish Balay #undef __FUNCT__
1694a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense"
1695a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1696a9fe9ddaSSatish Balay {
1697ee16a9a1SHong Zhang   PetscErrorCode ierr;
1698d0f46423SBarry Smith   PetscInt       m=A->rmap->n,n=B->cmap->n;
1699ee16a9a1SHong Zhang   Mat            Cmat;
1700a9fe9ddaSSatish Balay 
1701ee16a9a1SHong Zhang   PetscFunctionBegin;
1702e32f2f54SBarry 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);
1703ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1704ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1705ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
1706ee16a9a1SHong Zhang   ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr);
1707d73949e8SHong Zhang 
1708ee16a9a1SHong Zhang   *C = Cmat;
1709ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1710ee16a9a1SHong Zhang }
1711a9fe9ddaSSatish Balay 
171298a3b096SSatish Balay #undef __FUNCT__
1713a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense"
1714a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1715a9fe9ddaSSatish Balay {
1716a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1717a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1718a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
17190805154bSBarry Smith   PetscBLASInt   m,n,k;
1720a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1721a9fe9ddaSSatish Balay 
1722a9fe9ddaSSatish Balay   PetscFunctionBegin;
1723d0f46423SBarry Smith   m = PetscBLASIntCast(A->rmap->n);
1724d0f46423SBarry Smith   n = PetscBLASIntCast(B->cmap->n);
1725d0f46423SBarry Smith   k = PetscBLASIntCast(A->cmap->n);
1726a9fe9ddaSSatish Balay   BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda);
1727a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1728a9fe9ddaSSatish Balay }
1729a9fe9ddaSSatish Balay 
1730a9fe9ddaSSatish Balay #undef __FUNCT__
173175648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqDense_SeqDense"
173275648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1733a9fe9ddaSSatish Balay {
1734a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1735a9fe9ddaSSatish Balay 
1736a9fe9ddaSSatish Balay   PetscFunctionBegin;
1737a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
173875648e8dSHong Zhang     ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
1739a9fe9ddaSSatish Balay   }
174075648e8dSHong Zhang   ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
1741a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1742a9fe9ddaSSatish Balay }
1743a9fe9ddaSSatish Balay 
1744a9fe9ddaSSatish Balay #undef __FUNCT__
174575648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqDense_SeqDense"
174675648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1747a9fe9ddaSSatish Balay {
1748ee16a9a1SHong Zhang   PetscErrorCode ierr;
1749d0f46423SBarry Smith   PetscInt       m=A->cmap->n,n=B->cmap->n;
1750ee16a9a1SHong Zhang   Mat            Cmat;
1751a9fe9ddaSSatish Balay 
1752ee16a9a1SHong Zhang   PetscFunctionBegin;
1753e32f2f54SBarry 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);
1754ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1755ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1756ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
1757ee16a9a1SHong Zhang   ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr);
1758ee16a9a1SHong Zhang   Cmat->assembled = PETSC_TRUE;
1759ee16a9a1SHong Zhang   *C = Cmat;
1760ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1761ee16a9a1SHong Zhang }
1762a9fe9ddaSSatish Balay 
1763a9fe9ddaSSatish Balay #undef __FUNCT__
176475648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqDense_SeqDense"
176575648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1766a9fe9ddaSSatish Balay {
1767a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1768a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1769a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
17700805154bSBarry Smith   PetscBLASInt   m,n,k;
1771a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1772a9fe9ddaSSatish Balay 
1773a9fe9ddaSSatish Balay   PetscFunctionBegin;
1774d0f46423SBarry Smith   m = PetscBLASIntCast(A->cmap->n);
1775d0f46423SBarry Smith   n = PetscBLASIntCast(B->cmap->n);
1776d0f46423SBarry Smith   k = PetscBLASIntCast(A->rmap->n);
17772fbe02b9SBarry Smith   /*
17782fbe02b9SBarry Smith      Note the m and n arguments below are the number rows and columns of A', not A!
17792fbe02b9SBarry Smith   */
1780a9fe9ddaSSatish Balay   BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda);
1781a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1782a9fe9ddaSSatish Balay }
1783985db425SBarry Smith 
1784985db425SBarry Smith #undef __FUNCT__
1785985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense"
1786985db425SBarry Smith PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[])
1787985db425SBarry Smith {
1788985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1789985db425SBarry Smith   PetscErrorCode ierr;
1790d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1791985db425SBarry Smith   PetscScalar    *x;
1792985db425SBarry Smith   MatScalar      *aa = a->v;
1793985db425SBarry Smith 
1794985db425SBarry Smith   PetscFunctionBegin;
1795e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1796985db425SBarry Smith 
1797985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1798985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1799985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1800e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1801985db425SBarry Smith   for (i=0; i<m; i++) {
1802985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1803985db425SBarry Smith     for (j=1; j<n; j++) {
1804985db425SBarry Smith       if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1805985db425SBarry Smith     }
1806985db425SBarry Smith   }
1807985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1808985db425SBarry Smith   PetscFunctionReturn(0);
1809985db425SBarry Smith }
1810985db425SBarry Smith 
1811985db425SBarry Smith #undef __FUNCT__
1812985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense"
1813985db425SBarry Smith PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[])
1814985db425SBarry Smith {
1815985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1816985db425SBarry Smith   PetscErrorCode ierr;
1817d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1818985db425SBarry Smith   PetscScalar    *x;
1819985db425SBarry Smith   PetscReal      atmp;
1820985db425SBarry Smith   MatScalar      *aa = a->v;
1821985db425SBarry Smith 
1822985db425SBarry Smith   PetscFunctionBegin;
1823e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1824985db425SBarry Smith 
1825985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1826985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1827985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1828e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1829985db425SBarry Smith   for (i=0; i<m; i++) {
18309189402eSHong Zhang     x[i] = PetscAbsScalar(aa[i]);
1831985db425SBarry Smith     for (j=1; j<n; j++) {
1832985db425SBarry Smith       atmp = PetscAbsScalar(aa[i+m*j]);
1833985db425SBarry Smith       if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;}
1834985db425SBarry Smith     }
1835985db425SBarry Smith   }
1836985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1837985db425SBarry Smith   PetscFunctionReturn(0);
1838985db425SBarry Smith }
1839985db425SBarry Smith 
1840985db425SBarry Smith #undef __FUNCT__
1841985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense"
1842985db425SBarry Smith PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[])
1843985db425SBarry Smith {
1844985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1845985db425SBarry Smith   PetscErrorCode ierr;
1846d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1847985db425SBarry Smith   PetscScalar    *x;
1848985db425SBarry Smith   MatScalar      *aa = a->v;
1849985db425SBarry Smith 
1850985db425SBarry Smith   PetscFunctionBegin;
1851e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1852985db425SBarry Smith 
1853985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1854985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1855985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1856e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1857985db425SBarry Smith   for (i=0; i<m; i++) {
1858985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1859985db425SBarry Smith     for (j=1; j<n; j++) {
1860985db425SBarry Smith       if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1861985db425SBarry Smith     }
1862985db425SBarry Smith   }
1863985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1864985db425SBarry Smith   PetscFunctionReturn(0);
1865985db425SBarry Smith }
1866985db425SBarry Smith 
18678d0534beSBarry Smith #undef __FUNCT__
18688d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense"
18698d0534beSBarry Smith PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col)
18708d0534beSBarry Smith {
18718d0534beSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
18728d0534beSBarry Smith   PetscErrorCode ierr;
18738d0534beSBarry Smith   PetscScalar    *x;
18748d0534beSBarry Smith 
18758d0534beSBarry Smith   PetscFunctionBegin;
1876e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
18778d0534beSBarry Smith 
18788d0534beSBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1879d0f46423SBarry Smith   ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
18808d0534beSBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
18818d0534beSBarry Smith   PetscFunctionReturn(0);
18828d0534beSBarry Smith }
18838d0534beSBarry Smith 
18840716a85fSBarry Smith 
18850716a85fSBarry Smith #undef __FUNCT__
18860716a85fSBarry Smith #define __FUNCT__ "MatGetColumnNorms_SeqDense"
18870716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms)
18880716a85fSBarry Smith {
18890716a85fSBarry Smith   PetscErrorCode ierr;
18900716a85fSBarry Smith   PetscInt       i,j,m,n;
18910716a85fSBarry Smith   PetscScalar    *a;
18920716a85fSBarry Smith 
18930716a85fSBarry Smith   PetscFunctionBegin;
18940716a85fSBarry Smith   ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr);
18950716a85fSBarry Smith   ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr);
18968c778c55SBarry Smith   ierr = MatDenseGetArray(A,&a);CHKERRQ(ierr);
18970716a85fSBarry Smith   if (type == NORM_2) {
18980716a85fSBarry Smith     for (i=0; i<n; i++) {
18990716a85fSBarry Smith       for (j=0; j<m; j++) {
19000716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]*a[j]);
19010716a85fSBarry Smith       }
19020716a85fSBarry Smith       a += m;
19030716a85fSBarry Smith     }
19040716a85fSBarry Smith   } else if (type == NORM_1) {
19050716a85fSBarry Smith     for (i=0; i<n; i++) {
19060716a85fSBarry Smith       for (j=0; j<m; j++) {
19070716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]);
19080716a85fSBarry Smith       }
19090716a85fSBarry Smith       a += m;
19100716a85fSBarry Smith     }
19110716a85fSBarry Smith   } else if (type == NORM_INFINITY) {
19120716a85fSBarry Smith     for (i=0; i<n; i++) {
19130716a85fSBarry Smith       for (j=0; j<m; j++) {
19140716a85fSBarry Smith         norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]);
19150716a85fSBarry Smith       }
19160716a85fSBarry Smith       a += m;
19170716a85fSBarry Smith     }
19180716a85fSBarry Smith   } else SETERRQ(((PetscObject)A)->comm,PETSC_ERR_ARG_WRONG,"Unknown NormType");
19198c778c55SBarry Smith   ierr = MatDenseRestoreArray(A,&a);CHKERRQ(ierr);
19200716a85fSBarry Smith   if (type == NORM_2) {
19218f1a2a5eSBarry Smith     for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]);
19220716a85fSBarry Smith   }
19230716a85fSBarry Smith   PetscFunctionReturn(0);
19240716a85fSBarry Smith }
19250716a85fSBarry Smith 
192673a71a0fSBarry Smith #undef __FUNCT__
192773a71a0fSBarry Smith #define __FUNCT__ "MatSetRandom_SeqDense"
192873a71a0fSBarry Smith static PetscErrorCode  MatSetRandom_SeqDense(Mat x,PetscRandom rctx)
192973a71a0fSBarry Smith {
193073a71a0fSBarry Smith   PetscErrorCode ierr;
193173a71a0fSBarry Smith   PetscScalar    *a;
193273a71a0fSBarry Smith   PetscInt       m,n,i;
193373a71a0fSBarry Smith 
193473a71a0fSBarry Smith   PetscFunctionBegin;
193573a71a0fSBarry Smith   ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr);
19368c778c55SBarry Smith   ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr);
193773a71a0fSBarry Smith   for (i=0; i<m*n; i++) {
193873a71a0fSBarry Smith     ierr = PetscRandomGetValue(rctx,a+i);CHKERRQ(ierr);
193973a71a0fSBarry Smith   }
19408c778c55SBarry Smith   ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr);
194173a71a0fSBarry Smith   PetscFunctionReturn(0);
194273a71a0fSBarry Smith }
194373a71a0fSBarry Smith 
194473a71a0fSBarry Smith 
1945289bc588SBarry Smith /* -------------------------------------------------------------------*/
1946a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = {MatSetValues_SeqDense,
1947905e6a2fSBarry Smith        MatGetRow_SeqDense,
1948905e6a2fSBarry Smith        MatRestoreRow_SeqDense,
1949905e6a2fSBarry Smith        MatMult_SeqDense,
195097304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense,
19517c922b88SBarry Smith        MatMultTranspose_SeqDense,
19527c922b88SBarry Smith        MatMultTransposeAdd_SeqDense,
1953db4efbfdSBarry Smith        0,
1954db4efbfdSBarry Smith        0,
1955db4efbfdSBarry Smith        0,
1956db4efbfdSBarry Smith /*10*/ 0,
1957905e6a2fSBarry Smith        MatLUFactor_SeqDense,
1958905e6a2fSBarry Smith        MatCholeskyFactor_SeqDense,
195941f059aeSBarry Smith        MatSOR_SeqDense,
1960ec8511deSBarry Smith        MatTranspose_SeqDense,
196197304618SKris Buschelman /*15*/ MatGetInfo_SeqDense,
1962905e6a2fSBarry Smith        MatEqual_SeqDense,
1963905e6a2fSBarry Smith        MatGetDiagonal_SeqDense,
1964905e6a2fSBarry Smith        MatDiagonalScale_SeqDense,
1965905e6a2fSBarry Smith        MatNorm_SeqDense,
1966c0aa2d19SHong Zhang /*20*/ MatAssemblyBegin_SeqDense,
1967c0aa2d19SHong Zhang        MatAssemblyEnd_SeqDense,
1968905e6a2fSBarry Smith        MatSetOption_SeqDense,
1969905e6a2fSBarry Smith        MatZeroEntries_SeqDense,
1970d519adbfSMatthew Knepley /*24*/ MatZeroRows_SeqDense,
1971db4efbfdSBarry Smith        0,
1972db4efbfdSBarry Smith        0,
1973db4efbfdSBarry Smith        0,
1974db4efbfdSBarry Smith        0,
19754994cf47SJed Brown /*29*/ MatSetUp_SeqDense,
1976273d9f13SBarry Smith        0,
1977905e6a2fSBarry Smith        0,
197873a71a0fSBarry Smith        0,
197973a71a0fSBarry Smith        0,
1980d519adbfSMatthew Knepley /*34*/ MatDuplicate_SeqDense,
1981a5ae1ecdSBarry Smith        0,
1982a5ae1ecdSBarry Smith        0,
1983a5ae1ecdSBarry Smith        0,
1984a5ae1ecdSBarry Smith        0,
1985d519adbfSMatthew Knepley /*39*/ MatAXPY_SeqDense,
1986a5ae1ecdSBarry Smith        MatGetSubMatrices_SeqDense,
1987a5ae1ecdSBarry Smith        0,
19884b0e389bSBarry Smith        MatGetValues_SeqDense,
1989a5ae1ecdSBarry Smith        MatCopy_SeqDense,
1990d519adbfSMatthew Knepley /*44*/ MatGetRowMax_SeqDense,
1991a5ae1ecdSBarry Smith        MatScale_SeqDense,
1992a5ae1ecdSBarry Smith        0,
1993a5ae1ecdSBarry Smith        0,
1994a5ae1ecdSBarry Smith        0,
199573a71a0fSBarry Smith /*49*/ MatSetRandom_SeqDense,
1996a5ae1ecdSBarry Smith        0,
1997a5ae1ecdSBarry Smith        0,
1998a5ae1ecdSBarry Smith        0,
1999a5ae1ecdSBarry Smith        0,
2000d519adbfSMatthew Knepley /*54*/ 0,
2001a5ae1ecdSBarry Smith        0,
2002a5ae1ecdSBarry Smith        0,
2003a5ae1ecdSBarry Smith        0,
2004a5ae1ecdSBarry Smith        0,
2005d519adbfSMatthew Knepley /*59*/ 0,
2006e03a110bSBarry Smith        MatDestroy_SeqDense,
2007e03a110bSBarry Smith        MatView_SeqDense,
2008357abbc8SBarry Smith        0,
200997304618SKris Buschelman        0,
2010d519adbfSMatthew Knepley /*64*/ 0,
201197304618SKris Buschelman        0,
201297304618SKris Buschelman        0,
201397304618SKris Buschelman        0,
201497304618SKris Buschelman        0,
2015d519adbfSMatthew Knepley /*69*/ MatGetRowMaxAbs_SeqDense,
201697304618SKris Buschelman        0,
201797304618SKris Buschelman        0,
201897304618SKris Buschelman        0,
201997304618SKris Buschelman        0,
2020d519adbfSMatthew Knepley /*74*/ 0,
202197304618SKris Buschelman        0,
202297304618SKris Buschelman        0,
202397304618SKris Buschelman        0,
202497304618SKris Buschelman        0,
2025d519adbfSMatthew Knepley /*79*/ 0,
202697304618SKris Buschelman        0,
202797304618SKris Buschelman        0,
202897304618SKris Buschelman        0,
20295bba2384SShri Abhyankar /*83*/ MatLoad_SeqDense,
2030865e5f61SKris Buschelman        0,
20311cbb95d3SBarry Smith        MatIsHermitian_SeqDense,
2032865e5f61SKris Buschelman        0,
2033865e5f61SKris Buschelman        0,
2034865e5f61SKris Buschelman        0,
2035d519adbfSMatthew Knepley /*89*/ MatMatMult_SeqDense_SeqDense,
2036a9fe9ddaSSatish Balay        MatMatMultSymbolic_SeqDense_SeqDense,
2037a9fe9ddaSSatish Balay        MatMatMultNumeric_SeqDense_SeqDense,
2038865e5f61SKris Buschelman        0,
2039865e5f61SKris Buschelman        0,
2040d519adbfSMatthew Knepley /*94*/ 0,
20415df89d91SHong Zhang        0,
20425df89d91SHong Zhang        0,
20435df89d91SHong Zhang        0,
2044284134d9SBarry Smith        0,
2045d519adbfSMatthew Knepley /*99*/ 0,
2046284134d9SBarry Smith        0,
2047284134d9SBarry Smith        0,
2048ba337c44SJed Brown        MatConjugate_SeqDense,
2049f73d5cc4SBarry Smith        0,
2050ba337c44SJed Brown /*104*/0,
2051ba337c44SJed Brown        MatRealPart_SeqDense,
2052ba337c44SJed Brown        MatImaginaryPart_SeqDense,
2053985db425SBarry Smith        0,
2054985db425SBarry Smith        0,
205585e2c93fSHong Zhang /*109*/MatMatSolve_SeqDense,
2056985db425SBarry Smith        0,
20578d0534beSBarry Smith        MatGetRowMin_SeqDense,
2058aabbc4fbSShri Abhyankar        MatGetColumnVector_SeqDense,
2059aabbc4fbSShri Abhyankar        0,
2060aabbc4fbSShri Abhyankar /*114*/0,
2061aabbc4fbSShri Abhyankar        0,
2062aabbc4fbSShri Abhyankar        0,
2063aabbc4fbSShri Abhyankar        0,
2064aabbc4fbSShri Abhyankar        0,
2065aabbc4fbSShri Abhyankar /*119*/0,
2066aabbc4fbSShri Abhyankar        0,
2067aabbc4fbSShri Abhyankar        0,
20680716a85fSBarry Smith        0,
20690716a85fSBarry Smith        0,
20700716a85fSBarry Smith /*124*/0,
20715df89d91SHong Zhang        MatGetColumnNorms_SeqDense,
20725df89d91SHong Zhang        0,
20735df89d91SHong Zhang        0,
20745df89d91SHong Zhang        0,
20755df89d91SHong Zhang /*129*/0,
207675648e8dSHong Zhang        MatTransposeMatMult_SeqDense_SeqDense,
207775648e8dSHong Zhang        MatTransposeMatMultSymbolic_SeqDense_SeqDense,
207875648e8dSHong Zhang        MatTransposeMatMultNumeric_SeqDense_SeqDense,
2079985db425SBarry Smith };
208090ace30eSBarry Smith 
20814a2ae208SSatish Balay #undef __FUNCT__
20824a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense"
20834b828684SBarry Smith /*@C
2084fafbff53SBarry Smith    MatCreateSeqDense - Creates a sequential dense matrix that
2085d65003e9SLois Curfman McInnes    is stored in column major order (the usual Fortran 77 manner). Many
2086d65003e9SLois Curfman McInnes    of the matrix operations use the BLAS and LAPACK routines.
2087289bc588SBarry Smith 
2088db81eaa0SLois Curfman McInnes    Collective on MPI_Comm
2089db81eaa0SLois Curfman McInnes 
209020563c6bSBarry Smith    Input Parameters:
2091db81eaa0SLois Curfman McInnes +  comm - MPI communicator, set to PETSC_COMM_SELF
20920c775827SLois Curfman McInnes .  m - number of rows
209318f449edSLois Curfman McInnes .  n - number of columns
2094c0235b3cSMatthew Knepley -  data - optional location of matrix data in column major order.  Set data=PETSC_NULL for PETSc
2095dfc5480cSLois Curfman McInnes    to control all matrix memory allocation.
209620563c6bSBarry Smith 
209720563c6bSBarry Smith    Output Parameter:
209844cd7ae7SLois Curfman McInnes .  A - the matrix
209920563c6bSBarry Smith 
2100b259b22eSLois Curfman McInnes    Notes:
210118f449edSLois Curfman McInnes    The data input variable is intended primarily for Fortran programmers
210218f449edSLois Curfman McInnes    who wish to allocate their own matrix memory space.  Most users should
2103b4fd4287SBarry Smith    set data=PETSC_NULL.
210418f449edSLois Curfman McInnes 
2105027ccd11SLois Curfman McInnes    Level: intermediate
2106027ccd11SLois Curfman McInnes 
2107dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS
2108d65003e9SLois Curfman McInnes 
210969b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues()
211020563c6bSBarry Smith @*/
21117087cfbeSBarry Smith PetscErrorCode  MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A)
2112289bc588SBarry Smith {
2113dfbe8321SBarry Smith   PetscErrorCode ierr;
21143b2fbd54SBarry Smith 
21153a40ed3dSBarry Smith   PetscFunctionBegin;
2116f69a0ea3SMatthew Knepley   ierr = MatCreate(comm,A);CHKERRQ(ierr);
2117f69a0ea3SMatthew Knepley   ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr);
2118273d9f13SBarry Smith   ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr);
2119273d9f13SBarry Smith   ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr);
2120273d9f13SBarry Smith   PetscFunctionReturn(0);
2121273d9f13SBarry Smith }
2122273d9f13SBarry Smith 
21234a2ae208SSatish Balay #undef __FUNCT__
2124afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation"
2125273d9f13SBarry Smith /*@C
2126273d9f13SBarry Smith    MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements
2127273d9f13SBarry Smith 
2128273d9f13SBarry Smith    Collective on MPI_Comm
2129273d9f13SBarry Smith 
2130273d9f13SBarry Smith    Input Parameters:
2131273d9f13SBarry Smith +  A - the matrix
2132273d9f13SBarry Smith -  data - the array (or PETSC_NULL)
2133273d9f13SBarry Smith 
2134273d9f13SBarry Smith    Notes:
2135273d9f13SBarry Smith    The data input variable is intended primarily for Fortran programmers
2136273d9f13SBarry Smith    who wish to allocate their own matrix memory space.  Most users should
2137284134d9SBarry Smith    need not call this routine.
2138273d9f13SBarry Smith 
2139273d9f13SBarry Smith    Level: intermediate
2140273d9f13SBarry Smith 
2141273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS
2142273d9f13SBarry Smith 
214369b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA()
2144867c911aSBarry Smith 
2145273d9f13SBarry Smith @*/
21467087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation(Mat B,PetscScalar data[])
2147273d9f13SBarry Smith {
21484ac538c5SBarry Smith   PetscErrorCode ierr;
2149a23d5eceSKris Buschelman 
2150a23d5eceSKris Buschelman   PetscFunctionBegin;
21514ac538c5SBarry Smith   ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr);
2152a23d5eceSKris Buschelman   PetscFunctionReturn(0);
2153a23d5eceSKris Buschelman }
2154a23d5eceSKris Buschelman 
2155a23d5eceSKris Buschelman EXTERN_C_BEGIN
2156a23d5eceSKris Buschelman #undef __FUNCT__
2157afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense"
21587087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data)
2159a23d5eceSKris Buschelman {
2160273d9f13SBarry Smith   Mat_SeqDense   *b;
2161dfbe8321SBarry Smith   PetscErrorCode ierr;
2162273d9f13SBarry Smith 
2163273d9f13SBarry Smith   PetscFunctionBegin;
2164273d9f13SBarry Smith   B->preallocated = PETSC_TRUE;
2165a868139aSShri Abhyankar 
216634ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr);
216734ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr);
216834ef9618SShri Abhyankar 
2169273d9f13SBarry Smith   b       = (Mat_SeqDense*)B->data;
217086d161a7SShri Abhyankar   b->Mmax = B->rmap->n;
217186d161a7SShri Abhyankar   b->Nmax = B->cmap->n;
217286d161a7SShri Abhyankar   if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n;
217386d161a7SShri Abhyankar 
21749e8f95c4SLisandro Dalcin   if (!data) { /* petsc-allocated storage */
21759e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
21765afd5e0cSBarry Smith     ierr = PetscMalloc(b->lda*b->Nmax*sizeof(PetscScalar),&b->v);CHKERRQ(ierr);
2177284134d9SBarry Smith     ierr = PetscMemzero(b->v,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
2178284134d9SBarry Smith     ierr = PetscLogObjectMemory(B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
21799e8f95c4SLisandro Dalcin     b->user_alloc = PETSC_FALSE;
2180273d9f13SBarry Smith   } else { /* user-allocated storage */
21819e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2182273d9f13SBarry Smith     b->v          = data;
2183273d9f13SBarry Smith     b->user_alloc = PETSC_TRUE;
2184273d9f13SBarry Smith   }
21850450473dSBarry Smith   B->assembled = PETSC_TRUE;
2186273d9f13SBarry Smith   PetscFunctionReturn(0);
2187273d9f13SBarry Smith }
2188a23d5eceSKris Buschelman EXTERN_C_END
2189273d9f13SBarry Smith 
21901b807ce4Svictorle #undef __FUNCT__
21911b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA"
21921b807ce4Svictorle /*@C
21931b807ce4Svictorle   MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array
21941b807ce4Svictorle 
21951b807ce4Svictorle   Input parameter:
21961b807ce4Svictorle + A - the matrix
21971b807ce4Svictorle - lda - the leading dimension
21981b807ce4Svictorle 
21991b807ce4Svictorle   Notes:
2200867c911aSBarry Smith   This routine is to be used in conjunction with MatSeqDenseSetPreallocation();
22011b807ce4Svictorle   it asserts that the preallocation has a leading dimension (the LDA parameter
22021b807ce4Svictorle   of Blas and Lapack fame) larger than M, the first dimension of the matrix.
22031b807ce4Svictorle 
22041b807ce4Svictorle   Level: intermediate
22051b807ce4Svictorle 
22061b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS
22071b807ce4Svictorle 
2208284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize()
2209867c911aSBarry Smith 
22101b807ce4Svictorle @*/
22117087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetLDA(Mat B,PetscInt lda)
22121b807ce4Svictorle {
22131b807ce4Svictorle   Mat_SeqDense *b = (Mat_SeqDense*)B->data;
221421a2c019SBarry Smith 
22151b807ce4Svictorle   PetscFunctionBegin;
2216e32f2f54SBarry 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);
22171b807ce4Svictorle   b->lda       = lda;
221821a2c019SBarry Smith   b->changelda = PETSC_FALSE;
221921a2c019SBarry Smith   b->Mmax      = PetscMax(b->Mmax,lda);
22201b807ce4Svictorle   PetscFunctionReturn(0);
22211b807ce4Svictorle }
22221b807ce4Svictorle 
22230bad9183SKris Buschelman /*MC
2224fafad747SKris Buschelman    MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices.
22250bad9183SKris Buschelman 
22260bad9183SKris Buschelman    Options Database Keys:
22270bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions()
22280bad9183SKris Buschelman 
22290bad9183SKris Buschelman   Level: beginner
22300bad9183SKris Buschelman 
223189665df3SBarry Smith .seealso: MatCreateSeqDense()
223289665df3SBarry Smith 
22330bad9183SKris Buschelman M*/
22340bad9183SKris Buschelman 
2235273d9f13SBarry Smith EXTERN_C_BEGIN
22364a2ae208SSatish Balay #undef __FUNCT__
22374a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense"
22387087cfbeSBarry Smith PetscErrorCode  MatCreate_SeqDense(Mat B)
2239273d9f13SBarry Smith {
2240273d9f13SBarry Smith   Mat_SeqDense   *b;
2241dfbe8321SBarry Smith   PetscErrorCode ierr;
22427c334f02SBarry Smith   PetscMPIInt    size;
2243273d9f13SBarry Smith 
2244273d9f13SBarry Smith   PetscFunctionBegin;
22457adad957SLisandro Dalcin   ierr = MPI_Comm_size(((PetscObject)B)->comm,&size);CHKERRQ(ierr);
2246e32f2f54SBarry Smith   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1");
224755659b69SBarry Smith 
224838f2d2fdSLisandro Dalcin   ierr            = PetscNewLog(B,Mat_SeqDense,&b);CHKERRQ(ierr);
2249549d3d68SSatish Balay   ierr            = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr);
225044cd7ae7SLois Curfman McInnes   B->data         = (void*)b;
225118f449edSLois Curfman McInnes 
225244cd7ae7SLois Curfman McInnes   b->pivots       = 0;
2253273d9f13SBarry Smith   b->roworiented  = PETSC_TRUE;
2254273d9f13SBarry Smith   b->v            = 0;
225521a2c019SBarry Smith   b->changelda    = PETSC_FALSE;
22564e220ebcSLois Curfman McInnes 
22578c778c55SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatDenseGetArray_C","MatDenseGetArray_SeqDense",MatDenseGetArray_SeqDense);CHKERRQ(ierr);
22588c778c55SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatDenseRestoreArray_C","MatDenseRestoreArray_SeqDense",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr);
2259b24902e0SBarry Smith 
22606a63e612SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatConvert_seqdense_seqaij_C","MatConvert_SeqDense_SeqAIJ",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr);
2261ec1065edSBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatGetFactor_petsc_C",
2262b24902e0SBarry Smith                                      "MatGetFactor_seqdense_petsc",
2263b24902e0SBarry Smith                                       MatGetFactor_seqdense_petsc);CHKERRQ(ierr);
2264a23d5eceSKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatSeqDenseSetPreallocation_C",
2265a23d5eceSKris Buschelman                                     "MatSeqDenseSetPreallocation_SeqDense",
2266a23d5eceSKris Buschelman                                      MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr);
22672356f84bSDmitry Karpeev 
22684ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMult_seqaij_seqdense_C",
22694ae313f4SHong Zhang                                      "MatMatMult_SeqAIJ_SeqDense",
22704ae313f4SHong Zhang                                       MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
22712356f84bSDmitry Karpeev 
2272c0c8ee5eSDmitry Karpeev 
22734ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",
22744ae313f4SHong Zhang                                      "MatMatMultSymbolic_SeqAIJ_SeqDense",
22754ae313f4SHong Zhang                                       MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
22764ae313f4SHong Zhang   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",
22774ae313f4SHong Zhang                                      "MatMatMultNumeric_SeqAIJ_SeqDense",
22784ae313f4SHong Zhang                                       MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
227917667f90SBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr);
22803a40ed3dSBarry Smith   PetscFunctionReturn(0);
2281289bc588SBarry Smith }
2282273d9f13SBarry Smith EXTERN_C_END
2283