xref: /petsc/src/mat/impls/dense/seq/dense.c (revision f9426fe092dba0ba2fdf65dfec8d938c4b10a31c)
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>
10b2573a8aSBarry Smith 
116a63e612SBarry Smith #undef __FUNCT__
126a63e612SBarry Smith #define __FUNCT__ "MatConvert_SeqDense_SeqAIJ"
138cc058d9SJed Brown PETSC_EXTERN 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;
23ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),&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);
260298fd71SBarry Smith   ierr = MatSeqAIJSetPreallocation(B,A->cmap->n,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 
474a2ae208SSatish Balay #undef __FUNCT__
484a2ae208SSatish Balay #define __FUNCT__ "MatAXPY_SeqDense"
49f4df32b1SMatthew Knepley PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str)
501987afe7SBarry Smith {
511987afe7SBarry Smith   Mat_SeqDense   *x     = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data;
52f4df32b1SMatthew Knepley   PetscScalar    oalpha = alpha;
5313f74950SBarry Smith   PetscInt       j;
540805154bSBarry Smith   PetscBLASInt   N,m,ldax,lday,one = 1;
55efee365bSSatish Balay   PetscErrorCode ierr;
563a40ed3dSBarry Smith 
573a40ed3dSBarry Smith   PetscFunctionBegin;
58c5df96a5SBarry Smith   ierr = PetscBLASIntCast(X->rmap->n*X->cmap->n,&N);CHKERRQ(ierr);
59c5df96a5SBarry Smith   ierr = PetscBLASIntCast(X->rmap->n,&m);CHKERRQ(ierr);
60c5df96a5SBarry Smith   ierr = PetscBLASIntCast(x->lda,&ldax);CHKERRQ(ierr);
61c5df96a5SBarry Smith   ierr = PetscBLASIntCast(y->lda,&lday);CHKERRQ(ierr);
62a5ce6ee0Svictorle   if (ldax>m || lday>m) {
63d0f46423SBarry Smith     for (j=0; j<X->cmap->n; j++) {
648b83055fSJed Brown       PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&m,&oalpha,x->v+j*ldax,&one,y->v+j*lday,&one));
65a5ce6ee0Svictorle     }
66a5ce6ee0Svictorle   } else {
678b83055fSJed Brown     PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&N,&oalpha,x->v,&one,y->v,&one));
68a5ce6ee0Svictorle   }
690450473dSBarry Smith   ierr = PetscLogFlops(PetscMax(2*N-1,0));CHKERRQ(ierr);
703a40ed3dSBarry Smith   PetscFunctionReturn(0);
711987afe7SBarry Smith }
721987afe7SBarry Smith 
734a2ae208SSatish Balay #undef __FUNCT__
744a2ae208SSatish Balay #define __FUNCT__ "MatGetInfo_SeqDense"
75dfbe8321SBarry Smith PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info)
76289bc588SBarry Smith {
77d0f46423SBarry Smith   PetscInt N = A->rmap->n*A->cmap->n;
783a40ed3dSBarry Smith 
793a40ed3dSBarry Smith   PetscFunctionBegin;
804e220ebcSLois Curfman McInnes   info->block_size        = 1.0;
814e220ebcSLois Curfman McInnes   info->nz_allocated      = (double)N;
826de62eeeSBarry Smith   info->nz_used           = (double)N;
836de62eeeSBarry Smith   info->nz_unneeded       = (double)0;
844e220ebcSLois Curfman McInnes   info->assemblies        = (double)A->num_ass;
854e220ebcSLois Curfman McInnes   info->mallocs           = 0;
867adad957SLisandro Dalcin   info->memory            = ((PetscObject)A)->mem;
874e220ebcSLois Curfman McInnes   info->fill_ratio_given  = 0;
884e220ebcSLois Curfman McInnes   info->fill_ratio_needed = 0;
894e220ebcSLois Curfman McInnes   info->factor_mallocs    = 0;
903a40ed3dSBarry Smith   PetscFunctionReturn(0);
91289bc588SBarry Smith }
92289bc588SBarry Smith 
934a2ae208SSatish Balay #undef __FUNCT__
944a2ae208SSatish Balay #define __FUNCT__ "MatScale_SeqDense"
95f4df32b1SMatthew Knepley PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha)
9680cd9d93SLois Curfman McInnes {
97273d9f13SBarry Smith   Mat_SeqDense   *a     = (Mat_SeqDense*)A->data;
98f4df32b1SMatthew Knepley   PetscScalar    oalpha = alpha;
99efee365bSSatish Balay   PetscErrorCode ierr;
100c5df96a5SBarry Smith   PetscBLASInt   one = 1,j,nz,lda;
10180cd9d93SLois Curfman McInnes 
1023a40ed3dSBarry Smith   PetscFunctionBegin;
103c5df96a5SBarry Smith   ierr = PetscBLASIntCast(a->lda,&lda);CHKERRQ(ierr);
104d0f46423SBarry Smith   if (lda>A->rmap->n) {
105c5df96a5SBarry Smith     ierr = PetscBLASIntCast(A->rmap->n,&nz);CHKERRQ(ierr);
106d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1078b83055fSJed Brown       PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v+j*lda,&one));
108a5ce6ee0Svictorle     }
109a5ce6ee0Svictorle   } else {
110c5df96a5SBarry Smith     ierr = PetscBLASIntCast(A->rmap->n*A->cmap->n,&nz);CHKERRQ(ierr);
1118b83055fSJed Brown     PetscStackCallBLAS("BLASscal",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);
1500298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(newi,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;
173ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),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;
203c5df96a5SBarry Smith   PetscBLASInt   one = 1,info,m;
20467e560aaSBarry Smith 
2053a40ed3dSBarry Smith   PetscFunctionBegin;
206c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
2071ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
2081ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
209d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
210d5f3da31SBarry Smith   if (A->factortype == MAT_FACTOR_LU) {
211ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
212e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
213ae7cfcebSSatish Balay #else
2148b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
215e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
216ae7cfcebSSatish Balay #endif
217d5f3da31SBarry Smith   } else if (A->factortype == MAT_FACTOR_CHOLESKY) {
218ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
219e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
220ae7cfcebSSatish Balay #else
2218b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
222e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
223ae7cfcebSSatish Balay #endif
2242205254eSKarl Rupp   } 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;
243c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
2440298fd71SBarry Smith   ierr = PetscObjectTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr);
245ce94432eSBarry Smith   if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix B must be MATDENSE matrix");
2460298fd71SBarry Smith   ierr = PetscObjectTypeCompareAny((PetscObject)X,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr);
247ce94432eSBarry Smith   if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix X must be MATDENSE matrix");
248bda8bf91SBarry Smith 
2490298fd71SBarry Smith   ierr = MatGetSize(B,NULL,&n);CHKERRQ(ierr);
250c5df96a5SBarry Smith   ierr = PetscBLASIntCast(n,&nrhs);CHKERRQ(ierr);
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
2608b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",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
2678b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",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
2702205254eSKarl Rupp   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
27185e2c93fSHong Zhang 
2728c778c55SBarry Smith   ierr = MatDenseRestoreArray(B,&b);CHKERRQ(ierr);
2738c778c55SBarry Smith   ierr = MatDenseRestoreArray(X,&x);CHKERRQ(ierr);
27485e2c93fSHong Zhang   ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr);
27585e2c93fSHong Zhang   PetscFunctionReturn(0);
27685e2c93fSHong Zhang }
27785e2c93fSHong Zhang 
27885e2c93fSHong Zhang #undef __FUNCT__
2794a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense"
280dfbe8321SBarry Smith PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy)
281da3a660dSBarry Smith {
282c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
283dfbe8321SBarry Smith   PetscErrorCode ierr;
28487828ca2SBarry Smith   PetscScalar    *x,*y;
285c5df96a5SBarry Smith   PetscBLASInt   one = 1,info,m;
28667e560aaSBarry Smith 
2873a40ed3dSBarry Smith   PetscFunctionBegin;
288c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
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
2978b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",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
3048b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",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;
322c5df96a5SBarry Smith   PetscBLASInt   one = 1,info,m;
32367e560aaSBarry Smith 
3243a40ed3dSBarry Smith   PetscFunctionBegin;
325c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
3261ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
3271ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
328d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
329da3a660dSBarry Smith   if (yy == zz) {
33078b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
3313bb1ff40SBarry Smith     ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr);
33278b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
333da3a660dSBarry Smith   }
334d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
335752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
336da3a660dSBarry Smith   if (mat->pivots) {
337ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
338e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
339ae7cfcebSSatish Balay #else
3408b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
341e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
342ae7cfcebSSatish Balay #endif
343a8c6a408SBarry Smith   } else {
344ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
345e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
346ae7cfcebSSatish Balay #else
3478b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
348e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
349ae7cfcebSSatish Balay #endif
350da3a660dSBarry Smith   }
3516bf464f9SBarry Smith   if (tmp) {
3526bf464f9SBarry Smith     ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr);
3536bf464f9SBarry Smith     ierr = VecDestroy(&tmp);CHKERRQ(ierr);
3546bf464f9SBarry Smith   } else {
3556bf464f9SBarry Smith     ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);
3566bf464f9SBarry Smith   }
3571ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
3581ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
359dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
3603a40ed3dSBarry Smith   PetscFunctionReturn(0);
361da3a660dSBarry Smith }
36267e560aaSBarry Smith 
3634a2ae208SSatish Balay #undef __FUNCT__
3644a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense"
365dfbe8321SBarry Smith PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
366da3a660dSBarry Smith {
367c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
3686849ba73SBarry Smith   PetscErrorCode ierr;
36987828ca2SBarry Smith   PetscScalar    *x,*y,sone = 1.0;
370da3a660dSBarry Smith   Vec            tmp;
371c5df96a5SBarry Smith   PetscBLASInt   one = 1,info,m;
37267e560aaSBarry Smith 
3733a40ed3dSBarry Smith   PetscFunctionBegin;
374c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
375d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
3761ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
3771ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
378da3a660dSBarry Smith   if (yy == zz) {
37978b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
3803bb1ff40SBarry Smith     ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr);
38178b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
382da3a660dSBarry Smith   }
383d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
384752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
385da3a660dSBarry Smith   if (mat->pivots) {
386ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
387e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
388ae7cfcebSSatish Balay #else
3898b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
390e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
391ae7cfcebSSatish Balay #endif
3923a40ed3dSBarry Smith   } else {
393ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
394e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
395ae7cfcebSSatish Balay #else
3968b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
397e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
398ae7cfcebSSatish Balay #endif
399da3a660dSBarry Smith   }
40090f02eecSBarry Smith   if (tmp) {
4012dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr);
4026bf464f9SBarry Smith     ierr = VecDestroy(&tmp);CHKERRQ(ierr);
4033a40ed3dSBarry Smith   } else {
4042dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);
40590f02eecSBarry Smith   }
4061ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
4071ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
408dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
4093a40ed3dSBarry Smith   PetscFunctionReturn(0);
410da3a660dSBarry Smith }
411db4efbfdSBarry Smith 
412db4efbfdSBarry Smith /* ---------------------------------------------------------------*/
413db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots,
414db4efbfdSBarry Smith    rather than put it in the Mat->row slot.*/
415db4efbfdSBarry Smith #undef __FUNCT__
416db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactor_SeqDense"
4170481f469SBarry Smith PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo)
418db4efbfdSBarry Smith {
419db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF)
420db4efbfdSBarry Smith   PetscFunctionBegin;
421e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable.");
422db4efbfdSBarry Smith #else
423db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
424db4efbfdSBarry Smith   PetscErrorCode ierr;
425db4efbfdSBarry Smith   PetscBLASInt   n,m,info;
426db4efbfdSBarry Smith 
427db4efbfdSBarry Smith   PetscFunctionBegin;
428c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
429c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
430db4efbfdSBarry Smith   if (!mat->pivots) {
431db4efbfdSBarry Smith     ierr = PetscMalloc((A->rmap->n+1)*sizeof(PetscBLASInt),&mat->pivots);CHKERRQ(ierr);
4323bb1ff40SBarry Smith     ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr);
433db4efbfdSBarry Smith   }
434db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
4358e57ea43SSatish Balay   ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
4368b83055fSJed Brown   PetscStackCallBLAS("LAPACKgetrf",LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info));
4378e57ea43SSatish Balay   ierr = PetscFPTrapPop();CHKERRQ(ierr);
4388e57ea43SSatish Balay 
439e32f2f54SBarry Smith   if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization");
440e32f2f54SBarry Smith   if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization");
441db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
442db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
443db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
444db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
445d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_LU;
446db4efbfdSBarry Smith 
447dc0b31edSSatish Balay   ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr);
448db4efbfdSBarry Smith #endif
449db4efbfdSBarry Smith   PetscFunctionReturn(0);
450db4efbfdSBarry Smith }
451db4efbfdSBarry Smith 
452db4efbfdSBarry Smith #undef __FUNCT__
453db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactor_SeqDense"
4540481f469SBarry Smith PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo)
455db4efbfdSBarry Smith {
456db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF)
457db4efbfdSBarry Smith   PetscFunctionBegin;
458e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable.");
459db4efbfdSBarry Smith #else
460db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
461db4efbfdSBarry Smith   PetscErrorCode ierr;
462c5df96a5SBarry Smith   PetscBLASInt   info,n;
463db4efbfdSBarry Smith 
464db4efbfdSBarry Smith   PetscFunctionBegin;
465c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
466db4efbfdSBarry Smith   ierr = PetscFree(mat->pivots);CHKERRQ(ierr);
467db4efbfdSBarry Smith 
468db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
4698b83055fSJed Brown   PetscStackCallBLAS("LAPACKpotrf",LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info));
470e32f2f54SBarry Smith   if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1);
471db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
472db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
473db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
474db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
475d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_CHOLESKY;
4762205254eSKarl Rupp 
477dc0b31edSSatish Balay   ierr = PetscLogFlops((A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr);
478db4efbfdSBarry Smith #endif
479db4efbfdSBarry Smith   PetscFunctionReturn(0);
480db4efbfdSBarry Smith }
481db4efbfdSBarry Smith 
482db4efbfdSBarry Smith 
483db4efbfdSBarry Smith #undef __FUNCT__
484db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense"
4850481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
486db4efbfdSBarry Smith {
487db4efbfdSBarry Smith   PetscErrorCode ierr;
488db4efbfdSBarry Smith   MatFactorInfo  info;
489db4efbfdSBarry Smith 
490db4efbfdSBarry Smith   PetscFunctionBegin;
491db4efbfdSBarry Smith   info.fill = 1.0;
4922205254eSKarl Rupp 
493c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
494719d5645SBarry Smith   ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr);
495db4efbfdSBarry Smith   PetscFunctionReturn(0);
496db4efbfdSBarry Smith }
497db4efbfdSBarry Smith 
498db4efbfdSBarry Smith #undef __FUNCT__
499db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense"
5000481f469SBarry Smith PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info)
501db4efbfdSBarry Smith {
502db4efbfdSBarry Smith   PetscFunctionBegin;
503c3ef05f6SHong Zhang   fact->assembled                  = PETSC_TRUE;
5041bbcc794SSatish Balay   fact->preallocated               = PETSC_TRUE;
505719d5645SBarry Smith   fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense;
506db4efbfdSBarry Smith   PetscFunctionReturn(0);
507db4efbfdSBarry Smith }
508db4efbfdSBarry Smith 
509db4efbfdSBarry Smith #undef __FUNCT__
510db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactorSymbolic_SeqDense"
5110481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info)
512db4efbfdSBarry Smith {
513db4efbfdSBarry Smith   PetscFunctionBegin;
514b66fe19dSMatthew G Knepley   fact->preallocated         = PETSC_TRUE;
515c3ef05f6SHong Zhang   fact->assembled            = PETSC_TRUE;
516719d5645SBarry Smith   fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense;
517db4efbfdSBarry Smith   PetscFunctionReturn(0);
518db4efbfdSBarry Smith }
519db4efbfdSBarry Smith 
520db4efbfdSBarry Smith #undef __FUNCT__
521db4efbfdSBarry Smith #define __FUNCT__ "MatGetFactor_seqdense_petsc"
5228cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact)
523db4efbfdSBarry Smith {
524db4efbfdSBarry Smith   PetscErrorCode ierr;
525db4efbfdSBarry Smith 
526db4efbfdSBarry Smith   PetscFunctionBegin;
527ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),fact);CHKERRQ(ierr);
528db4efbfdSBarry Smith   ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
529db4efbfdSBarry Smith   ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr);
530db4efbfdSBarry Smith   if (ftype == MAT_FACTOR_LU) {
531db4efbfdSBarry Smith     (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense;
532db4efbfdSBarry Smith   } else {
533db4efbfdSBarry Smith     (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense;
534db4efbfdSBarry Smith   }
535d5f3da31SBarry Smith   (*fact)->factortype = ftype;
536db4efbfdSBarry Smith   PetscFunctionReturn(0);
537db4efbfdSBarry Smith }
538db4efbfdSBarry Smith 
539289bc588SBarry Smith /* ------------------------------------------------------------------*/
5404a2ae208SSatish Balay #undef __FUNCT__
54141f059aeSBarry Smith #define __FUNCT__ "MatSOR_SeqDense"
54241f059aeSBarry Smith PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx)
543289bc588SBarry Smith {
544c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
54587828ca2SBarry Smith   PetscScalar    *x,*b,*v = mat->v,zero = 0.0,xt;
546dfbe8321SBarry Smith   PetscErrorCode ierr;
547d0f46423SBarry Smith   PetscInt       m = A->rmap->n,i;
548c5df96a5SBarry Smith   PetscBLASInt   o = 1,bm;
549289bc588SBarry Smith 
5503a40ed3dSBarry Smith   PetscFunctionBegin;
551c5df96a5SBarry Smith   ierr = PetscBLASIntCast(m,&bm);CHKERRQ(ierr);
552289bc588SBarry Smith   if (flag & SOR_ZERO_INITIAL_GUESS) {
55371044d3cSBarry Smith     /* this is a hack fix, should have another version without the second BLASdot */
5542dcb1b2aSMatthew Knepley     ierr = VecSet(xx,zero);CHKERRQ(ierr);
555289bc588SBarry Smith   }
5561ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
5571ebc52fbSHong Zhang   ierr = VecGetArray(bb,&b);CHKERRQ(ierr);
558b965ef7fSBarry Smith   its  = its*lits;
559e32f2f54SBarry 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);
560289bc588SBarry Smith   while (its--) {
561fccaa45eSBarry Smith     if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) {
562289bc588SBarry Smith       for (i=0; i<m; i++) {
5638b83055fSJed Brown         PetscStackCallBLAS("BLASdot",xt   = b[i] - BLASdot_(&bm,v+i,&bm,x,&o));
56455a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
565289bc588SBarry Smith       }
566289bc588SBarry Smith     }
567fccaa45eSBarry Smith     if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) {
568289bc588SBarry Smith       for (i=m-1; i>=0; i--) {
5698b83055fSJed Brown         PetscStackCallBLAS("BLASdot",xt   = b[i] - BLASdot_(&bm,v+i,&bm,x,&o));
57055a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
571289bc588SBarry Smith       }
572289bc588SBarry Smith     }
573289bc588SBarry Smith   }
5741ebc52fbSHong Zhang   ierr = VecRestoreArray(bb,&b);CHKERRQ(ierr);
5751ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
5763a40ed3dSBarry Smith   PetscFunctionReturn(0);
577289bc588SBarry Smith }
578289bc588SBarry Smith 
579289bc588SBarry Smith /* -----------------------------------------------------------------*/
5804a2ae208SSatish Balay #undef __FUNCT__
5814a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense"
582dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy)
583289bc588SBarry Smith {
584c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
58587828ca2SBarry Smith   PetscScalar    *v   = mat->v,*x,*y;
586dfbe8321SBarry Smith   PetscErrorCode ierr;
5870805154bSBarry Smith   PetscBLASInt   m, n,_One=1;
588ea709b57SSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
5893a40ed3dSBarry Smith 
5903a40ed3dSBarry Smith   PetscFunctionBegin;
591c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
592c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
593d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
5941ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
5951ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
5968b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One));
5971ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
5981ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
599dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
6003a40ed3dSBarry Smith   PetscFunctionReturn(0);
601289bc588SBarry Smith }
602800995b7SMatthew Knepley 
6034a2ae208SSatish Balay #undef __FUNCT__
6044a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense"
605dfbe8321SBarry Smith PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy)
606289bc588SBarry Smith {
607c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
60887828ca2SBarry Smith   PetscScalar    *v   = mat->v,*x,*y,_DOne=1.0,_DZero=0.0;
609dfbe8321SBarry Smith   PetscErrorCode ierr;
6100805154bSBarry Smith   PetscBLASInt   m, n, _One=1;
6113a40ed3dSBarry Smith 
6123a40ed3dSBarry Smith   PetscFunctionBegin;
613c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
614c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
615d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
6161ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
6171ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
6188b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One));
6191ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6201ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
621dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr);
6223a40ed3dSBarry Smith   PetscFunctionReturn(0);
623289bc588SBarry Smith }
6246ee01492SSatish Balay 
6254a2ae208SSatish Balay #undef __FUNCT__
6264a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense"
627dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
628289bc588SBarry Smith {
629c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
63087828ca2SBarry Smith   PetscScalar    *v   = mat->v,*x,*y,_DOne=1.0;
631dfbe8321SBarry Smith   PetscErrorCode ierr;
6320805154bSBarry Smith   PetscBLASInt   m, n, _One=1;
6333a40ed3dSBarry Smith 
6343a40ed3dSBarry Smith   PetscFunctionBegin;
635c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
636c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
637d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
638600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
6391ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
6401ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
6418b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
6421ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6431ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
644dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
6453a40ed3dSBarry Smith   PetscFunctionReturn(0);
646289bc588SBarry Smith }
6476ee01492SSatish Balay 
6484a2ae208SSatish Balay #undef __FUNCT__
6494a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense"
650dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
651289bc588SBarry Smith {
652c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
65387828ca2SBarry Smith   PetscScalar    *v   = mat->v,*x,*y;
654dfbe8321SBarry Smith   PetscErrorCode ierr;
6550805154bSBarry Smith   PetscBLASInt   m, n, _One=1;
65687828ca2SBarry Smith   PetscScalar    _DOne=1.0;
6573a40ed3dSBarry Smith 
6583a40ed3dSBarry Smith   PetscFunctionBegin;
659c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
660c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
661d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
662600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
6631ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
6641ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
6658b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
6661ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6671ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
668dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
6693a40ed3dSBarry Smith   PetscFunctionReturn(0);
670289bc588SBarry Smith }
671289bc588SBarry Smith 
672289bc588SBarry Smith /* -----------------------------------------------------------------*/
6734a2ae208SSatish Balay #undef __FUNCT__
6744a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense"
67513f74950SBarry Smith PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
676289bc588SBarry Smith {
677c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
67887828ca2SBarry Smith   PetscScalar    *v;
6796849ba73SBarry Smith   PetscErrorCode ierr;
68013f74950SBarry Smith   PetscInt       i;
68167e560aaSBarry Smith 
6823a40ed3dSBarry Smith   PetscFunctionBegin;
683d0f46423SBarry Smith   *ncols = A->cmap->n;
684289bc588SBarry Smith   if (cols) {
685d0f46423SBarry Smith     ierr = PetscMalloc((A->cmap->n+1)*sizeof(PetscInt),cols);CHKERRQ(ierr);
686d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) (*cols)[i] = i;
687289bc588SBarry Smith   }
688289bc588SBarry Smith   if (vals) {
689d0f46423SBarry Smith     ierr = PetscMalloc((A->cmap->n+1)*sizeof(PetscScalar),vals);CHKERRQ(ierr);
690289bc588SBarry Smith     v    = mat->v + row;
691d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;}
692289bc588SBarry Smith   }
6933a40ed3dSBarry Smith   PetscFunctionReturn(0);
694289bc588SBarry Smith }
6956ee01492SSatish Balay 
6964a2ae208SSatish Balay #undef __FUNCT__
6974a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense"
69813f74950SBarry Smith PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
699289bc588SBarry Smith {
700dfbe8321SBarry Smith   PetscErrorCode ierr;
7016e111a19SKarl Rupp 
702606d414cSSatish Balay   PetscFunctionBegin;
703606d414cSSatish Balay   if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);}
704606d414cSSatish Balay   if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); }
7053a40ed3dSBarry Smith   PetscFunctionReturn(0);
706289bc588SBarry Smith }
707289bc588SBarry Smith /* ----------------------------------------------------------------*/
7084a2ae208SSatish Balay #undef __FUNCT__
7094a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense"
71013f74950SBarry Smith PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv)
711289bc588SBarry Smith {
712c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
71313f74950SBarry Smith   PetscInt     i,j,idx=0;
714d6dfbf8fSBarry Smith 
7153a40ed3dSBarry Smith   PetscFunctionBegin;
71671fd2e92SBarry Smith   if (v) PetscValidScalarPointer(v,6);
717289bc588SBarry Smith   if (!mat->roworiented) {
718dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
719289bc588SBarry Smith       for (j=0; j<n; j++) {
720cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
7212515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
722e32f2f54SBarry 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);
72358804f6dSBarry Smith #endif
724289bc588SBarry Smith         for (i=0; i<m; i++) {
725cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
7262515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
727e32f2f54SBarry 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);
72858804f6dSBarry Smith #endif
729cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
730289bc588SBarry Smith         }
731289bc588SBarry Smith       }
7323a40ed3dSBarry Smith     } else {
733289bc588SBarry Smith       for (j=0; j<n; j++) {
734cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
7352515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
736e32f2f54SBarry 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);
73758804f6dSBarry Smith #endif
738289bc588SBarry Smith         for (i=0; i<m; i++) {
739cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
7402515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
741e32f2f54SBarry 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);
74258804f6dSBarry Smith #endif
743cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
744289bc588SBarry Smith         }
745289bc588SBarry Smith       }
746289bc588SBarry Smith     }
7473a40ed3dSBarry Smith   } else {
748dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
749e8d4e0b9SBarry Smith       for (i=0; i<m; i++) {
750cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
7512515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
752e32f2f54SBarry 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);
75358804f6dSBarry Smith #endif
754e8d4e0b9SBarry Smith         for (j=0; j<n; j++) {
755cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
7562515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
757e32f2f54SBarry 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);
75858804f6dSBarry Smith #endif
759cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
760e8d4e0b9SBarry Smith         }
761e8d4e0b9SBarry Smith       }
7623a40ed3dSBarry Smith     } else {
763289bc588SBarry Smith       for (i=0; i<m; i++) {
764cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
7652515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
766e32f2f54SBarry 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);
76758804f6dSBarry Smith #endif
768289bc588SBarry Smith         for (j=0; j<n; j++) {
769cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
7702515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
771e32f2f54SBarry 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);
77258804f6dSBarry Smith #endif
773cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
774289bc588SBarry Smith         }
775289bc588SBarry Smith       }
776289bc588SBarry Smith     }
777e8d4e0b9SBarry Smith   }
7783a40ed3dSBarry Smith   PetscFunctionReturn(0);
779289bc588SBarry Smith }
780e8d4e0b9SBarry Smith 
7814a2ae208SSatish Balay #undef __FUNCT__
7824a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense"
78313f74950SBarry Smith PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[])
784ae80bb75SLois Curfman McInnes {
785ae80bb75SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
78613f74950SBarry Smith   PetscInt     i,j;
787ae80bb75SLois Curfman McInnes 
7883a40ed3dSBarry Smith   PetscFunctionBegin;
789ae80bb75SLois Curfman McInnes   /* row-oriented output */
790ae80bb75SLois Curfman McInnes   for (i=0; i<m; i++) {
79197e567efSBarry Smith     if (indexm[i] < 0) {v += n;continue;}
792e32f2f54SBarry 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);
793ae80bb75SLois Curfman McInnes     for (j=0; j<n; j++) {
7946f31f424SBarry Smith       if (indexn[j] < 0) {v++; continue;}
795e32f2f54SBarry 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);
79697e567efSBarry Smith       *v++ = mat->v[indexn[j]*mat->lda + indexm[i]];
797ae80bb75SLois Curfman McInnes     }
798ae80bb75SLois Curfman McInnes   }
7993a40ed3dSBarry Smith   PetscFunctionReturn(0);
800ae80bb75SLois Curfman McInnes }
801ae80bb75SLois Curfman McInnes 
802289bc588SBarry Smith /* -----------------------------------------------------------------*/
803289bc588SBarry Smith 
8044a2ae208SSatish Balay #undef __FUNCT__
8055bba2384SShri Abhyankar #define __FUNCT__ "MatLoad_SeqDense"
806112444f4SShri Abhyankar PetscErrorCode MatLoad_SeqDense(Mat newmat,PetscViewer viewer)
807aabbc4fbSShri Abhyankar {
808aabbc4fbSShri Abhyankar   Mat_SeqDense   *a;
809aabbc4fbSShri Abhyankar   PetscErrorCode ierr;
810aabbc4fbSShri Abhyankar   PetscInt       *scols,i,j,nz,header[4];
811aabbc4fbSShri Abhyankar   int            fd;
812aabbc4fbSShri Abhyankar   PetscMPIInt    size;
813aabbc4fbSShri Abhyankar   PetscInt       *rowlengths = 0,M,N,*cols,grows,gcols;
814aabbc4fbSShri Abhyankar   PetscScalar    *vals,*svals,*v,*w;
815ce94432eSBarry Smith   MPI_Comm       comm;
816aabbc4fbSShri Abhyankar 
817aabbc4fbSShri Abhyankar   PetscFunctionBegin;
818ce94432eSBarry Smith   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
819aabbc4fbSShri Abhyankar   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
820aabbc4fbSShri Abhyankar   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor");
821aabbc4fbSShri Abhyankar   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
822aabbc4fbSShri Abhyankar   ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr);
823aabbc4fbSShri Abhyankar   if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object");
824aabbc4fbSShri Abhyankar   M = header[1]; N = header[2]; nz = header[3];
825aabbc4fbSShri Abhyankar 
826aabbc4fbSShri Abhyankar   /* set global size if not set already*/
827aabbc4fbSShri Abhyankar   if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) {
828aabbc4fbSShri Abhyankar     ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr);
829aabbc4fbSShri Abhyankar   } else {
830aabbc4fbSShri Abhyankar     /* if sizes and type are already set, check if the vector global sizes are correct */
831aabbc4fbSShri Abhyankar     ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr);
832aabbc4fbSShri 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);
833aabbc4fbSShri Abhyankar   }
8340298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr);
835aabbc4fbSShri Abhyankar 
836aabbc4fbSShri Abhyankar   if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */
837aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
838aabbc4fbSShri Abhyankar     v = a->v;
839aabbc4fbSShri Abhyankar     /* Allocate some temp space to read in the values and then flip them
840aabbc4fbSShri Abhyankar        from row major to column major */
841aabbc4fbSShri Abhyankar     ierr = PetscMalloc((M*N > 0 ? M*N : 1)*sizeof(PetscScalar),&w);CHKERRQ(ierr);
842aabbc4fbSShri Abhyankar     /* read in nonzero values */
843aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr);
844aabbc4fbSShri Abhyankar     /* now flip the values and store them in the matrix*/
845aabbc4fbSShri Abhyankar     for (j=0; j<N; j++) {
846aabbc4fbSShri Abhyankar       for (i=0; i<M; i++) {
847aabbc4fbSShri Abhyankar         *v++ =w[i*N+j];
848aabbc4fbSShri Abhyankar       }
849aabbc4fbSShri Abhyankar     }
850aabbc4fbSShri Abhyankar     ierr = PetscFree(w);CHKERRQ(ierr);
851aabbc4fbSShri Abhyankar   } else {
852aabbc4fbSShri Abhyankar     /* read row lengths */
853aabbc4fbSShri Abhyankar     ierr = PetscMalloc((M+1)*sizeof(PetscInt),&rowlengths);CHKERRQ(ierr);
854aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr);
855aabbc4fbSShri Abhyankar 
856aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
857aabbc4fbSShri Abhyankar     v = a->v;
858aabbc4fbSShri Abhyankar 
859aabbc4fbSShri Abhyankar     /* read column indices and nonzeros */
860aabbc4fbSShri Abhyankar     ierr = PetscMalloc((nz+1)*sizeof(PetscInt),&scols);CHKERRQ(ierr);
861aabbc4fbSShri Abhyankar     cols = scols;
862aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr);
863aabbc4fbSShri Abhyankar     ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&svals);CHKERRQ(ierr);
864aabbc4fbSShri Abhyankar     vals = svals;
865aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr);
866aabbc4fbSShri Abhyankar 
867aabbc4fbSShri Abhyankar     /* insert into matrix */
868aabbc4fbSShri Abhyankar     for (i=0; i<M; i++) {
869aabbc4fbSShri Abhyankar       for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j];
870aabbc4fbSShri Abhyankar       svals += rowlengths[i]; scols += rowlengths[i];
871aabbc4fbSShri Abhyankar     }
872aabbc4fbSShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
873aabbc4fbSShri Abhyankar     ierr = PetscFree(cols);CHKERRQ(ierr);
874aabbc4fbSShri Abhyankar     ierr = PetscFree(rowlengths);CHKERRQ(ierr);
875aabbc4fbSShri Abhyankar   }
876aabbc4fbSShri Abhyankar   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
877aabbc4fbSShri Abhyankar   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
878aabbc4fbSShri Abhyankar   PetscFunctionReturn(0);
879aabbc4fbSShri Abhyankar }
880aabbc4fbSShri Abhyankar 
881aabbc4fbSShri Abhyankar #undef __FUNCT__
8824a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII"
8836849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer)
884289bc588SBarry Smith {
885932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
886dfbe8321SBarry Smith   PetscErrorCode    ierr;
88713f74950SBarry Smith   PetscInt          i,j;
8882dcb1b2aSMatthew Knepley   const char        *name;
88987828ca2SBarry Smith   PetscScalar       *v;
890f3ef73ceSBarry Smith   PetscViewerFormat format;
8915f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX)
892ace3abfcSBarry Smith   PetscBool allreal = PETSC_TRUE;
8935f481a85SSatish Balay #endif
894932b0c3eSLois Curfman McInnes 
8953a40ed3dSBarry Smith   PetscFunctionBegin;
896b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
897456192e2SBarry Smith   if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
8983a40ed3dSBarry Smith     PetscFunctionReturn(0);  /* do nothing for now */
899fb9695e5SSatish Balay   } else if (format == PETSC_VIEWER_ASCII_COMMON) {
900d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
901dae58748SBarry Smith     ierr = PetscObjectPrintClassNamePrefixType((PetscObject)A,viewer);CHKERRQ(ierr);
902d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
90344cd7ae7SLois Curfman McInnes       v    = a->v + i;
90477431f27SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr);
905d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
906aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
907329f5518SBarry Smith         if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) {
908a83599f4SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %G + %G i) ",j,PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr);
909329f5518SBarry Smith         } else if (PetscRealPart(*v)) {
910a83599f4SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,PetscRealPart(*v));CHKERRQ(ierr);
9116831982aSBarry Smith         }
91280cd9d93SLois Curfman McInnes #else
9136831982aSBarry Smith         if (*v) {
914a83599f4SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,*v);CHKERRQ(ierr);
9156831982aSBarry Smith         }
91680cd9d93SLois Curfman McInnes #endif
9171b807ce4Svictorle         v += a->lda;
91880cd9d93SLois Curfman McInnes       }
919b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
92080cd9d93SLois Curfman McInnes     }
921d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
9223a40ed3dSBarry Smith   } else {
923d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
924aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
92547989497SBarry Smith     /* determine if matrix has all real values */
92647989497SBarry Smith     v = a->v;
927d0f46423SBarry Smith     for (i=0; i<A->rmap->n*A->cmap->n; i++) {
928ffac6cdbSBarry Smith       if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break;}
92947989497SBarry Smith     }
93047989497SBarry Smith #endif
931fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
9323a7fca6bSBarry Smith       ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr);
933d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr);
934d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
935fb9695e5SSatish Balay       ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr);
9367566de4bSShri Abhyankar     } else {
937dae58748SBarry Smith       ierr = PetscObjectPrintClassNamePrefixType((PetscObject)A,viewer);CHKERRQ(ierr);
938ffac6cdbSBarry Smith     }
939ffac6cdbSBarry Smith 
940d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
941932b0c3eSLois Curfman McInnes       v = a->v + i;
942d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
943aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
94447989497SBarry Smith         if (allreal) {
945c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr);
94647989497SBarry Smith         } else {
947c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr);
94847989497SBarry Smith         }
949289bc588SBarry Smith #else
950c61cd2faSJed Brown         ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr);
951289bc588SBarry Smith #endif
9521b807ce4Svictorle         v += a->lda;
953289bc588SBarry Smith       }
954b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
955289bc588SBarry Smith     }
956fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
957b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr);
958ffac6cdbSBarry Smith     }
959d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
960da3a660dSBarry Smith   }
961b0a32e0cSBarry Smith   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
9623a40ed3dSBarry Smith   PetscFunctionReturn(0);
963289bc588SBarry Smith }
964289bc588SBarry Smith 
9654a2ae208SSatish Balay #undef __FUNCT__
9664a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary"
9676849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer)
968932b0c3eSLois Curfman McInnes {
969932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
9706849ba73SBarry Smith   PetscErrorCode    ierr;
97113f74950SBarry Smith   int               fd;
972d0f46423SBarry Smith   PetscInt          ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n;
973f4403165SShri Abhyankar   PetscScalar       *v,*anonz,*vals;
974f4403165SShri Abhyankar   PetscViewerFormat format;
975932b0c3eSLois Curfman McInnes 
9763a40ed3dSBarry Smith   PetscFunctionBegin;
977b0a32e0cSBarry Smith   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
97890ace30eSBarry Smith 
979f4403165SShri Abhyankar   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
980f4403165SShri Abhyankar   if (format == PETSC_VIEWER_NATIVE) {
981f4403165SShri Abhyankar     /* store the matrix as a dense matrix */
982f4403165SShri Abhyankar     ierr = PetscMalloc(4*sizeof(PetscInt),&col_lens);CHKERRQ(ierr);
9832205254eSKarl Rupp 
984f4403165SShri Abhyankar     col_lens[0] = MAT_FILE_CLASSID;
985f4403165SShri Abhyankar     col_lens[1] = m;
986f4403165SShri Abhyankar     col_lens[2] = n;
987f4403165SShri Abhyankar     col_lens[3] = MATRIX_BINARY_FORMAT_DENSE;
9882205254eSKarl Rupp 
989f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
990f4403165SShri Abhyankar     ierr = PetscFree(col_lens);CHKERRQ(ierr);
991f4403165SShri Abhyankar 
992f4403165SShri Abhyankar     /* write out matrix, by rows */
993f4403165SShri Abhyankar     ierr = PetscMalloc((m*n+1)*sizeof(PetscScalar),&vals);CHKERRQ(ierr);
994f4403165SShri Abhyankar     v    = a->v;
995f4403165SShri Abhyankar     for (j=0; j<n; j++) {
996f4403165SShri Abhyankar       for (i=0; i<m; i++) {
997f4403165SShri Abhyankar         vals[j + i*n] = *v++;
998f4403165SShri Abhyankar       }
999f4403165SShri Abhyankar     }
1000f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
1001f4403165SShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
1002f4403165SShri Abhyankar   } else {
100313f74950SBarry Smith     ierr = PetscMalloc((4+nz)*sizeof(PetscInt),&col_lens);CHKERRQ(ierr);
10042205254eSKarl Rupp 
10050700a824SBarry Smith     col_lens[0] = MAT_FILE_CLASSID;
1006932b0c3eSLois Curfman McInnes     col_lens[1] = m;
1007932b0c3eSLois Curfman McInnes     col_lens[2] = n;
1008932b0c3eSLois Curfman McInnes     col_lens[3] = nz;
1009932b0c3eSLois Curfman McInnes 
1010932b0c3eSLois Curfman McInnes     /* store lengths of each row and write (including header) to file */
1011932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) col_lens[4+i] = n;
10126f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
1013932b0c3eSLois Curfman McInnes 
1014932b0c3eSLois Curfman McInnes     /* Possibly should write in smaller increments, not whole matrix at once? */
1015932b0c3eSLois Curfman McInnes     /* store column indices (zero start index) */
1016932b0c3eSLois Curfman McInnes     ict = 0;
1017932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1018932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) col_lens[ict++] = j;
1019932b0c3eSLois Curfman McInnes     }
10206f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
1021606d414cSSatish Balay     ierr = PetscFree(col_lens);CHKERRQ(ierr);
1022932b0c3eSLois Curfman McInnes 
1023932b0c3eSLois Curfman McInnes     /* store nonzero values */
102487828ca2SBarry Smith     ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&anonz);CHKERRQ(ierr);
1025932b0c3eSLois Curfman McInnes     ict  = 0;
1026932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1027932b0c3eSLois Curfman McInnes       v = a->v + i;
1028932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) {
10291b807ce4Svictorle         anonz[ict++] = *v; v += a->lda;
1030932b0c3eSLois Curfman McInnes       }
1031932b0c3eSLois Curfman McInnes     }
10326f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
1033606d414cSSatish Balay     ierr = PetscFree(anonz);CHKERRQ(ierr);
1034f4403165SShri Abhyankar   }
10353a40ed3dSBarry Smith   PetscFunctionReturn(0);
1036932b0c3eSLois Curfman McInnes }
1037932b0c3eSLois Curfman McInnes 
10389804daf3SBarry Smith #include <petscdraw.h>
10394a2ae208SSatish Balay #undef __FUNCT__
10404a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom"
1041dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa)
1042f1af5d2fSBarry Smith {
1043f1af5d2fSBarry Smith   Mat               A  = (Mat) Aa;
1044f1af5d2fSBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
10456849ba73SBarry Smith   PetscErrorCode    ierr;
1046d0f46423SBarry Smith   PetscInt          m  = A->rmap->n,n = A->cmap->n,color,i,j;
104787828ca2SBarry Smith   PetscScalar       *v = a->v;
1048b0a32e0cSBarry Smith   PetscViewer       viewer;
1049b0a32e0cSBarry Smith   PetscDraw         popup;
1050329f5518SBarry Smith   PetscReal         xl,yl,xr,yr,x_l,x_r,y_l,y_r,scale,maxv = 0.0;
1051f3ef73ceSBarry Smith   PetscViewerFormat format;
1052f1af5d2fSBarry Smith 
1053f1af5d2fSBarry Smith   PetscFunctionBegin;
1054f1af5d2fSBarry Smith   ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr);
1055b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1056b0a32e0cSBarry Smith   ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr);
1057f1af5d2fSBarry Smith 
1058f1af5d2fSBarry Smith   /* Loop over matrix elements drawing boxes */
1059fb9695e5SSatish Balay   if (format != PETSC_VIEWER_DRAW_CONTOUR) {
1060f1af5d2fSBarry Smith     /* Blue for negative and Red for positive */
1061b0a32e0cSBarry Smith     color = PETSC_DRAW_BLUE;
1062f1af5d2fSBarry Smith     for (j = 0; j < n; j++) {
1063f1af5d2fSBarry Smith       x_l = j;
1064f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1065f1af5d2fSBarry Smith       for (i = 0; i < m; i++) {
1066f1af5d2fSBarry Smith         y_l = m - i - 1.0;
1067f1af5d2fSBarry Smith         y_r = y_l + 1.0;
1068329f5518SBarry Smith         if (PetscRealPart(v[j*m+i]) >  0.) {
1069b0a32e0cSBarry Smith           color = PETSC_DRAW_RED;
1070329f5518SBarry Smith         } else if (PetscRealPart(v[j*m+i]) <  0.) {
1071b0a32e0cSBarry Smith           color = PETSC_DRAW_BLUE;
1072f1af5d2fSBarry Smith         } else {
1073f1af5d2fSBarry Smith           continue;
1074f1af5d2fSBarry Smith         }
1075b0a32e0cSBarry Smith         ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1076f1af5d2fSBarry Smith       }
1077f1af5d2fSBarry Smith     }
1078f1af5d2fSBarry Smith   } else {
1079f1af5d2fSBarry Smith     /* use contour shading to indicate magnitude of values */
1080f1af5d2fSBarry Smith     /* first determine max of all nonzero values */
1081f1af5d2fSBarry Smith     for (i = 0; i < m*n; i++) {
1082f1af5d2fSBarry Smith       if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]);
1083f1af5d2fSBarry Smith     }
1084b0a32e0cSBarry Smith     scale = (245.0 - PETSC_DRAW_BASIC_COLORS)/maxv;
1085b0a32e0cSBarry Smith     ierr  = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr);
1086b0a32e0cSBarry Smith     if (popup) {ierr = PetscDrawScalePopup(popup,0.0,maxv);CHKERRQ(ierr);}
1087f1af5d2fSBarry Smith     for (j = 0; j < n; j++) {
1088f1af5d2fSBarry Smith       x_l = j;
1089f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1090f1af5d2fSBarry Smith       for (i = 0; i < m; i++) {
1091f1af5d2fSBarry Smith         y_l   = m - i - 1.0;
1092f1af5d2fSBarry Smith         y_r   = y_l + 1.0;
1093b0a32e0cSBarry Smith         color = PETSC_DRAW_BASIC_COLORS + (int)(scale*PetscAbsScalar(v[j*m+i]));
1094b0a32e0cSBarry Smith         ierr  = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1095f1af5d2fSBarry Smith       }
1096f1af5d2fSBarry Smith     }
1097f1af5d2fSBarry Smith   }
1098f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1099f1af5d2fSBarry Smith }
1100f1af5d2fSBarry Smith 
11014a2ae208SSatish Balay #undef __FUNCT__
11024a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw"
1103dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer)
1104f1af5d2fSBarry Smith {
1105b0a32e0cSBarry Smith   PetscDraw      draw;
1106ace3abfcSBarry Smith   PetscBool      isnull;
1107329f5518SBarry Smith   PetscReal      xr,yr,xl,yl,h,w;
1108dfbe8321SBarry Smith   PetscErrorCode ierr;
1109f1af5d2fSBarry Smith 
1110f1af5d2fSBarry Smith   PetscFunctionBegin;
1111b0a32e0cSBarry Smith   ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
1112b0a32e0cSBarry Smith   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
1113abc0a331SBarry Smith   if (isnull) PetscFunctionReturn(0);
1114f1af5d2fSBarry Smith 
1115f1af5d2fSBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr);
1116d0f46423SBarry Smith   xr   = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0;
1117f1af5d2fSBarry Smith   xr  += w;    yr += h;  xl = -w;     yl = -h;
1118b0a32e0cSBarry Smith   ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr);
1119b0a32e0cSBarry Smith   ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr);
11200298fd71SBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr);
1121f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1122f1af5d2fSBarry Smith }
1123f1af5d2fSBarry Smith 
11244a2ae208SSatish Balay #undef __FUNCT__
11254a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense"
1126dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer)
1127932b0c3eSLois Curfman McInnes {
1128dfbe8321SBarry Smith   PetscErrorCode ierr;
1129ace3abfcSBarry Smith   PetscBool      iascii,isbinary,isdraw;
1130932b0c3eSLois Curfman McInnes 
11313a40ed3dSBarry Smith   PetscFunctionBegin;
1132251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
1133251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
1134251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
11350f5bd95cSBarry Smith 
1136c45a1595SBarry Smith   if (iascii) {
1137c45a1595SBarry Smith     ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr);
11380f5bd95cSBarry Smith   } else if (isbinary) {
11393a40ed3dSBarry Smith     ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr);
1140f1af5d2fSBarry Smith   } else if (isdraw) {
1141f1af5d2fSBarry Smith     ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr);
1142932b0c3eSLois Curfman McInnes   }
11433a40ed3dSBarry Smith   PetscFunctionReturn(0);
1144932b0c3eSLois Curfman McInnes }
1145289bc588SBarry Smith 
11464a2ae208SSatish Balay #undef __FUNCT__
11474a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense"
1148dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqDense(Mat mat)
1149289bc588SBarry Smith {
1150ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)mat->data;
1151dfbe8321SBarry Smith   PetscErrorCode ierr;
115290f02eecSBarry Smith 
11533a40ed3dSBarry Smith   PetscFunctionBegin;
1154aa482453SBarry Smith #if defined(PETSC_USE_LOG)
1155d0f46423SBarry Smith   PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n);
1156a5a9c739SBarry Smith #endif
115705b42c5fSBarry Smith   ierr = PetscFree(l->pivots);CHKERRQ(ierr);
11586857c123SSatish Balay   if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);}
1159bf0cc555SLisandro Dalcin   ierr = PetscFree(mat->data);CHKERRQ(ierr);
1160dbd8c25aSHong Zhang 
1161dbd8c25aSHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr);
1162bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL);CHKERRQ(ierr);
1163bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL);CHKERRQ(ierr);
1164bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL);CHKERRQ(ierr);
1165bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1166bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1167bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
11683bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
11693bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
11703bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
11713a40ed3dSBarry Smith   PetscFunctionReturn(0);
1172289bc588SBarry Smith }
1173289bc588SBarry Smith 
11744a2ae208SSatish Balay #undef __FUNCT__
11754a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense"
1176fc4dec0aSBarry Smith PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout)
1177289bc588SBarry Smith {
1178c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
11796849ba73SBarry Smith   PetscErrorCode ierr;
118013f74950SBarry Smith   PetscInt       k,j,m,n,M;
118187828ca2SBarry Smith   PetscScalar    *v,tmp;
118248b35521SBarry Smith 
11833a40ed3dSBarry Smith   PetscFunctionBegin;
1184d0f46423SBarry Smith   v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n;
1185e9695a30SBarry Smith   if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */
1186e7e72b3dSBarry Smith     if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place");
1187e7e72b3dSBarry Smith     else {
1188d3e5ee88SLois Curfman McInnes       for (j=0; j<m; j++) {
1189289bc588SBarry Smith         for (k=0; k<j; k++) {
11901b807ce4Svictorle           tmp        = v[j + k*M];
11911b807ce4Svictorle           v[j + k*M] = v[k + j*M];
11921b807ce4Svictorle           v[k + j*M] = tmp;
1193289bc588SBarry Smith         }
1194289bc588SBarry Smith       }
1195d64ed03dSBarry Smith     }
11963a40ed3dSBarry Smith   } else { /* out-of-place transpose */
1197d3e5ee88SLois Curfman McInnes     Mat          tmat;
1198ec8511deSBarry Smith     Mat_SeqDense *tmatd;
119987828ca2SBarry Smith     PetscScalar  *v2;
1200ea709b57SSatish Balay 
1201fc4dec0aSBarry Smith     if (reuse == MAT_INITIAL_MATRIX) {
1202ce94432eSBarry Smith       ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr);
1203d0f46423SBarry Smith       ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr);
12047adad957SLisandro Dalcin       ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
12050298fd71SBarry Smith       ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr);
1206fc4dec0aSBarry Smith     } else {
1207fc4dec0aSBarry Smith       tmat = *matout;
1208fc4dec0aSBarry Smith     }
1209ec8511deSBarry Smith     tmatd = (Mat_SeqDense*)tmat->data;
12100de55854SLois Curfman McInnes     v = mat->v; v2 = tmatd->v;
1211d3e5ee88SLois Curfman McInnes     for (j=0; j<n; j++) {
12121b807ce4Svictorle       for (k=0; k<m; k++) v2[j + k*n] = v[k + j*M];
1213d3e5ee88SLois Curfman McInnes     }
12146d4a8577SBarry Smith     ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
12156d4a8577SBarry Smith     ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1216d3e5ee88SLois Curfman McInnes     *matout = tmat;
121748b35521SBarry Smith   }
12183a40ed3dSBarry Smith   PetscFunctionReturn(0);
1219289bc588SBarry Smith }
1220289bc588SBarry Smith 
12214a2ae208SSatish Balay #undef __FUNCT__
12224a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense"
1223ace3abfcSBarry Smith PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool  *flg)
1224289bc588SBarry Smith {
1225c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data;
1226c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data;
122713f74950SBarry Smith   PetscInt     i,j;
1228a2ea699eSBarry Smith   PetscScalar  *v1,*v2;
12299ea5d5aeSSatish Balay 
12303a40ed3dSBarry Smith   PetscFunctionBegin;
1231d0f46423SBarry Smith   if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1232d0f46423SBarry Smith   if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1233d0f46423SBarry Smith   for (i=0; i<A1->rmap->n; i++) {
12341b807ce4Svictorle     v1 = mat1->v+i; v2 = mat2->v+i;
1235d0f46423SBarry Smith     for (j=0; j<A1->cmap->n; j++) {
12363a40ed3dSBarry Smith       if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
12371b807ce4Svictorle       v1 += mat1->lda; v2 += mat2->lda;
12381b807ce4Svictorle     }
1239289bc588SBarry Smith   }
124077c4ece6SBarry Smith   *flg = PETSC_TRUE;
12413a40ed3dSBarry Smith   PetscFunctionReturn(0);
1242289bc588SBarry Smith }
1243289bc588SBarry Smith 
12444a2ae208SSatish Balay #undef __FUNCT__
12454a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense"
1246dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v)
1247289bc588SBarry Smith {
1248c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
1249dfbe8321SBarry Smith   PetscErrorCode ierr;
125013f74950SBarry Smith   PetscInt       i,n,len;
125187828ca2SBarry Smith   PetscScalar    *x,zero = 0.0;
125244cd7ae7SLois Curfman McInnes 
12533a40ed3dSBarry Smith   PetscFunctionBegin;
12542dcb1b2aSMatthew Knepley   ierr = VecSet(v,zero);CHKERRQ(ierr);
12557a97a34bSBarry Smith   ierr = VecGetSize(v,&n);CHKERRQ(ierr);
12561ebc52fbSHong Zhang   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1257d0f46423SBarry Smith   len  = PetscMin(A->rmap->n,A->cmap->n);
1258e32f2f54SBarry Smith   if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec");
125944cd7ae7SLois Curfman McInnes   for (i=0; i<len; i++) {
12601b807ce4Svictorle     x[i] = mat->v[i*mat->lda + i];
1261289bc588SBarry Smith   }
12621ebc52fbSHong Zhang   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
12633a40ed3dSBarry Smith   PetscFunctionReturn(0);
1264289bc588SBarry Smith }
1265289bc588SBarry Smith 
12664a2ae208SSatish Balay #undef __FUNCT__
12674a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense"
1268dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr)
1269289bc588SBarry Smith {
1270c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
127187828ca2SBarry Smith   PetscScalar    *l,*r,x,*v;
1272dfbe8321SBarry Smith   PetscErrorCode ierr;
1273d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n;
127455659b69SBarry Smith 
12753a40ed3dSBarry Smith   PetscFunctionBegin;
127628988994SBarry Smith   if (ll) {
12777a97a34bSBarry Smith     ierr = VecGetSize(ll,&m);CHKERRQ(ierr);
12781ebc52fbSHong Zhang     ierr = VecGetArray(ll,&l);CHKERRQ(ierr);
1279e32f2f54SBarry Smith     if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size");
1280da3a660dSBarry Smith     for (i=0; i<m; i++) {
1281da3a660dSBarry Smith       x = l[i];
1282da3a660dSBarry Smith       v = mat->v + i;
1283da3a660dSBarry Smith       for (j=0; j<n; j++) { (*v) *= x; v+= m;}
1284da3a660dSBarry Smith     }
12851ebc52fbSHong Zhang     ierr = VecRestoreArray(ll,&l);CHKERRQ(ierr);
1286efee365bSSatish Balay     ierr = PetscLogFlops(n*m);CHKERRQ(ierr);
1287da3a660dSBarry Smith   }
128828988994SBarry Smith   if (rr) {
12897a97a34bSBarry Smith     ierr = VecGetSize(rr,&n);CHKERRQ(ierr);
12901ebc52fbSHong Zhang     ierr = VecGetArray(rr,&r);CHKERRQ(ierr);
1291e32f2f54SBarry Smith     if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size");
1292da3a660dSBarry Smith     for (i=0; i<n; i++) {
1293da3a660dSBarry Smith       x = r[i];
1294da3a660dSBarry Smith       v = mat->v + i*m;
12952205254eSKarl Rupp       for (j=0; j<m; j++) (*v++) *= x;
1296da3a660dSBarry Smith     }
12971ebc52fbSHong Zhang     ierr = VecRestoreArray(rr,&r);CHKERRQ(ierr);
1298efee365bSSatish Balay     ierr = PetscLogFlops(n*m);CHKERRQ(ierr);
1299da3a660dSBarry Smith   }
13003a40ed3dSBarry Smith   PetscFunctionReturn(0);
1301289bc588SBarry Smith }
1302289bc588SBarry Smith 
13034a2ae208SSatish Balay #undef __FUNCT__
13044a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense"
1305dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm)
1306289bc588SBarry Smith {
1307c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
130887828ca2SBarry Smith   PetscScalar    *v   = mat->v;
1309329f5518SBarry Smith   PetscReal      sum  = 0.0;
1310d0f46423SBarry Smith   PetscInt       lda  =mat->lda,m=A->rmap->n,i,j;
1311efee365bSSatish Balay   PetscErrorCode ierr;
131255659b69SBarry Smith 
13133a40ed3dSBarry Smith   PetscFunctionBegin;
1314289bc588SBarry Smith   if (type == NORM_FROBENIUS) {
1315a5ce6ee0Svictorle     if (lda>m) {
1316d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1317a5ce6ee0Svictorle         v = mat->v+j*lda;
1318a5ce6ee0Svictorle         for (i=0; i<m; i++) {
1319a5ce6ee0Svictorle           sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1320a5ce6ee0Svictorle         }
1321a5ce6ee0Svictorle       }
1322a5ce6ee0Svictorle     } else {
1323d0f46423SBarry Smith       for (i=0; i<A->cmap->n*A->rmap->n; i++) {
1324329f5518SBarry Smith         sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1325289bc588SBarry Smith       }
1326a5ce6ee0Svictorle     }
13278f1a2a5eSBarry Smith     *nrm = PetscSqrtReal(sum);
1328dc0b31edSSatish Balay     ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
13293a40ed3dSBarry Smith   } else if (type == NORM_1) {
1330064f8208SBarry Smith     *nrm = 0.0;
1331d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
13321b807ce4Svictorle       v   = mat->v + j*mat->lda;
1333289bc588SBarry Smith       sum = 0.0;
1334d0f46423SBarry Smith       for (i=0; i<A->rmap->n; i++) {
133533a8263dSBarry Smith         sum += PetscAbsScalar(*v);  v++;
1336289bc588SBarry Smith       }
1337064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1338289bc588SBarry Smith     }
1339d0f46423SBarry Smith     ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr);
13403a40ed3dSBarry Smith   } else if (type == NORM_INFINITY) {
1341064f8208SBarry Smith     *nrm = 0.0;
1342d0f46423SBarry Smith     for (j=0; j<A->rmap->n; j++) {
1343289bc588SBarry Smith       v   = mat->v + j;
1344289bc588SBarry Smith       sum = 0.0;
1345d0f46423SBarry Smith       for (i=0; i<A->cmap->n; i++) {
13461b807ce4Svictorle         sum += PetscAbsScalar(*v); v += mat->lda;
1347289bc588SBarry Smith       }
1348064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1349289bc588SBarry Smith     }
1350d0f46423SBarry Smith     ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr);
1351e7e72b3dSBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm");
13523a40ed3dSBarry Smith   PetscFunctionReturn(0);
1353289bc588SBarry Smith }
1354289bc588SBarry Smith 
13554a2ae208SSatish Balay #undef __FUNCT__
13564a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense"
1357ace3abfcSBarry Smith PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg)
1358289bc588SBarry Smith {
1359c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *aij = (Mat_SeqDense*)A->data;
136063ba0a88SBarry Smith   PetscErrorCode ierr;
136167e560aaSBarry Smith 
13623a40ed3dSBarry Smith   PetscFunctionBegin;
1363b5a2b587SKris Buschelman   switch (op) {
1364b5a2b587SKris Buschelman   case MAT_ROW_ORIENTED:
13654e0d8c25SBarry Smith     aij->roworiented = flg;
1366b5a2b587SKris Buschelman     break;
1367512a5fc5SBarry Smith   case MAT_NEW_NONZERO_LOCATIONS:
1368b5a2b587SKris Buschelman   case MAT_NEW_NONZERO_LOCATION_ERR:
13693971808eSMatthew Knepley   case MAT_NEW_NONZERO_ALLOCATION_ERR:
13704e0d8c25SBarry Smith   case MAT_NEW_DIAGONALS:
137113fa8e87SLisandro Dalcin   case MAT_KEEP_NONZERO_PATTERN:
1372b5a2b587SKris Buschelman   case MAT_IGNORE_OFF_PROC_ENTRIES:
1373b5a2b587SKris Buschelman   case MAT_USE_HASH_TABLE:
13745021d80fSJed Brown   case MAT_IGNORE_LOWER_TRIANGULAR:
13755021d80fSJed Brown     ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr);
13765021d80fSJed Brown     break;
13775021d80fSJed Brown   case MAT_SPD:
137877e54ba9SKris Buschelman   case MAT_SYMMETRIC:
137977e54ba9SKris Buschelman   case MAT_STRUCTURALLY_SYMMETRIC:
13809a4540c5SBarry Smith   case MAT_HERMITIAN:
13819a4540c5SBarry Smith   case MAT_SYMMETRY_ETERNAL:
13825021d80fSJed Brown     /* These options are handled directly by MatSetOption() */
138377e54ba9SKris Buschelman     break;
1384b5a2b587SKris Buschelman   default:
1385e32f2f54SBarry Smith     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]);
13863a40ed3dSBarry Smith   }
13873a40ed3dSBarry Smith   PetscFunctionReturn(0);
1388289bc588SBarry Smith }
1389289bc588SBarry Smith 
13904a2ae208SSatish Balay #undef __FUNCT__
13914a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense"
1392dfbe8321SBarry Smith PetscErrorCode MatZeroEntries_SeqDense(Mat A)
13936f0a148fSBarry Smith {
1394ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)A->data;
13956849ba73SBarry Smith   PetscErrorCode ierr;
1396d0f46423SBarry Smith   PetscInt       lda=l->lda,m=A->rmap->n,j;
13973a40ed3dSBarry Smith 
13983a40ed3dSBarry Smith   PetscFunctionBegin;
1399a5ce6ee0Svictorle   if (lda>m) {
1400d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1401a5ce6ee0Svictorle       ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
1402a5ce6ee0Svictorle     }
1403a5ce6ee0Svictorle   } else {
1404d0f46423SBarry Smith     ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1405a5ce6ee0Svictorle   }
14063a40ed3dSBarry Smith   PetscFunctionReturn(0);
14076f0a148fSBarry Smith }
14086f0a148fSBarry Smith 
14094a2ae208SSatish Balay #undef __FUNCT__
14104a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense"
14112b40b63fSBarry Smith PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b)
14126f0a148fSBarry Smith {
141397b48c8fSBarry Smith   PetscErrorCode    ierr;
1414ec8511deSBarry Smith   Mat_SeqDense      *l = (Mat_SeqDense*)A->data;
1415b9679d65SBarry Smith   PetscInt          m  = l->lda, n = A->cmap->n, i,j;
141697b48c8fSBarry Smith   PetscScalar       *slot,*bb;
141797b48c8fSBarry Smith   const PetscScalar *xx;
141855659b69SBarry Smith 
14193a40ed3dSBarry Smith   PetscFunctionBegin;
1420b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG)
1421b9679d65SBarry Smith   for (i=0; i<N; i++) {
1422b9679d65SBarry Smith     if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed");
1423b9679d65SBarry 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);
1424b9679d65SBarry Smith   }
1425b9679d65SBarry Smith #endif
1426b9679d65SBarry Smith 
142797b48c8fSBarry Smith   /* fix right hand side if needed */
142897b48c8fSBarry Smith   if (x && b) {
142997b48c8fSBarry Smith     ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr);
143097b48c8fSBarry Smith     ierr = VecGetArray(b,&bb);CHKERRQ(ierr);
14312205254eSKarl Rupp     for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]];
143297b48c8fSBarry Smith     ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr);
143397b48c8fSBarry Smith     ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr);
143497b48c8fSBarry Smith   }
143597b48c8fSBarry Smith 
14366f0a148fSBarry Smith   for (i=0; i<N; i++) {
14376f0a148fSBarry Smith     slot = l->v + rows[i];
1438b9679d65SBarry Smith     for (j=0; j<n; j++) { *slot = 0.0; slot += m;}
14396f0a148fSBarry Smith   }
1440f4df32b1SMatthew Knepley   if (diag != 0.0) {
1441b9679d65SBarry Smith     if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices");
14426f0a148fSBarry Smith     for (i=0; i<N; i++) {
1443b9679d65SBarry Smith       slot  = l->v + (m+1)*rows[i];
1444f4df32b1SMatthew Knepley       *slot = diag;
14456f0a148fSBarry Smith     }
14466f0a148fSBarry Smith   }
14473a40ed3dSBarry Smith   PetscFunctionReturn(0);
14486f0a148fSBarry Smith }
1449557bce09SLois Curfman McInnes 
14504a2ae208SSatish Balay #undef __FUNCT__
14518c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray_SeqDense"
14528c778c55SBarry Smith PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar *array[])
145364e87e97SBarry Smith {
1454c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
14553a40ed3dSBarry Smith 
14563a40ed3dSBarry Smith   PetscFunctionBegin;
1457e32f2f54SBarry 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");
145864e87e97SBarry Smith   *array = mat->v;
14593a40ed3dSBarry Smith   PetscFunctionReturn(0);
146064e87e97SBarry Smith }
14610754003eSLois Curfman McInnes 
14624a2ae208SSatish Balay #undef __FUNCT__
14638c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray_SeqDense"
14648c778c55SBarry Smith PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar *array[])
1465ff14e315SSatish Balay {
14663a40ed3dSBarry Smith   PetscFunctionBegin;
146709b544d4SBarry Smith   *array = 0; /* user cannot accidently use the array later */
14683a40ed3dSBarry Smith   PetscFunctionReturn(0);
1469ff14e315SSatish Balay }
14700754003eSLois Curfman McInnes 
14714a2ae208SSatish Balay #undef __FUNCT__
14728c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray"
1473dec5eb66SMatthew G Knepley /*@C
14748c778c55SBarry Smith    MatDenseGetArray - gives access to the array where the data for a SeqDense matrix is stored
147573a71a0fSBarry Smith 
147673a71a0fSBarry Smith    Not Collective
147773a71a0fSBarry Smith 
147873a71a0fSBarry Smith    Input Parameter:
147973a71a0fSBarry Smith .  mat - a MATSEQDENSE matrix
148073a71a0fSBarry Smith 
148173a71a0fSBarry Smith    Output Parameter:
148273a71a0fSBarry Smith .   array - pointer to the data
148373a71a0fSBarry Smith 
148473a71a0fSBarry Smith    Level: intermediate
148573a71a0fSBarry Smith 
14868c778c55SBarry Smith .seealso: MatDenseRestoreArray()
148773a71a0fSBarry Smith @*/
14888c778c55SBarry Smith PetscErrorCode  MatDenseGetArray(Mat A,PetscScalar **array)
148973a71a0fSBarry Smith {
149073a71a0fSBarry Smith   PetscErrorCode ierr;
149173a71a0fSBarry Smith 
149273a71a0fSBarry Smith   PetscFunctionBegin;
14938c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
149473a71a0fSBarry Smith   PetscFunctionReturn(0);
149573a71a0fSBarry Smith }
149673a71a0fSBarry Smith 
149773a71a0fSBarry Smith #undef __FUNCT__
14988c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray"
1499dec5eb66SMatthew G Knepley /*@C
15008c778c55SBarry Smith    MatDenseRestoreArray - returns access to the array where the data for a SeqDense matrix is stored obtained by MatDenseGetArray()
150173a71a0fSBarry Smith 
150273a71a0fSBarry Smith    Not Collective
150373a71a0fSBarry Smith 
150473a71a0fSBarry Smith    Input Parameters:
150573a71a0fSBarry Smith .  mat - a MATSEQDENSE matrix
150673a71a0fSBarry Smith .  array - pointer to the data
150773a71a0fSBarry Smith 
150873a71a0fSBarry Smith    Level: intermediate
150973a71a0fSBarry Smith 
15108c778c55SBarry Smith .seealso: MatDenseGetArray()
151173a71a0fSBarry Smith @*/
15128c778c55SBarry Smith PetscErrorCode  MatDenseRestoreArray(Mat A,PetscScalar **array)
151373a71a0fSBarry Smith {
151473a71a0fSBarry Smith   PetscErrorCode ierr;
151573a71a0fSBarry Smith 
151673a71a0fSBarry Smith   PetscFunctionBegin;
15178c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
151873a71a0fSBarry Smith   PetscFunctionReturn(0);
151973a71a0fSBarry Smith }
152073a71a0fSBarry Smith 
152173a71a0fSBarry Smith #undef __FUNCT__
15224a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense"
152313f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B)
15240754003eSLois Curfman McInnes {
1525c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
15266849ba73SBarry Smith   PetscErrorCode ierr;
15275d0c19d7SBarry Smith   PetscInt       i,j,nrows,ncols;
15285d0c19d7SBarry Smith   const PetscInt *irow,*icol;
152987828ca2SBarry Smith   PetscScalar    *av,*bv,*v = mat->v;
15300754003eSLois Curfman McInnes   Mat            newmat;
15310754003eSLois Curfman McInnes 
15323a40ed3dSBarry Smith   PetscFunctionBegin;
153378b31e54SBarry Smith   ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr);
153478b31e54SBarry Smith   ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr);
1535e03a110bSBarry Smith   ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr);
1536e03a110bSBarry Smith   ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr);
15370754003eSLois Curfman McInnes 
1538182d2002SSatish Balay   /* Check submatrixcall */
1539182d2002SSatish Balay   if (scall == MAT_REUSE_MATRIX) {
154013f74950SBarry Smith     PetscInt n_cols,n_rows;
1541182d2002SSatish Balay     ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr);
154221a2c019SBarry Smith     if (n_rows != nrows || n_cols != ncols) {
1543f746d493SDmitry Karpeev       /* resize the result matrix to match number of requested rows/columns */
1544c61587bbSBarry Smith       ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
154521a2c019SBarry Smith     }
1546182d2002SSatish Balay     newmat = *B;
1547182d2002SSatish Balay   } else {
15480754003eSLois Curfman McInnes     /* Create and fill new matrix */
1549ce94432eSBarry Smith     ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr);
1550f69a0ea3SMatthew Knepley     ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
15517adad957SLisandro Dalcin     ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
15520298fd71SBarry Smith     ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr);
1553182d2002SSatish Balay   }
1554182d2002SSatish Balay 
1555182d2002SSatish Balay   /* Now extract the data pointers and do the copy,column at a time */
1556182d2002SSatish Balay   bv = ((Mat_SeqDense*)newmat->data)->v;
1557182d2002SSatish Balay 
1558182d2002SSatish Balay   for (i=0; i<ncols; i++) {
15596de62eeeSBarry Smith     av = v + mat->lda*icol[i];
15602205254eSKarl Rupp     for (j=0; j<nrows; j++) *bv++ = av[irow[j]];
15610754003eSLois Curfman McInnes   }
1562182d2002SSatish Balay 
1563182d2002SSatish Balay   /* Assemble the matrices so that the correct flags are set */
15646d4a8577SBarry Smith   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
15656d4a8577SBarry Smith   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
15660754003eSLois Curfman McInnes 
15670754003eSLois Curfman McInnes   /* Free work space */
156878b31e54SBarry Smith   ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr);
156978b31e54SBarry Smith   ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr);
1570182d2002SSatish Balay   *B   = newmat;
15713a40ed3dSBarry Smith   PetscFunctionReturn(0);
15720754003eSLois Curfman McInnes }
15730754003eSLois Curfman McInnes 
15744a2ae208SSatish Balay #undef __FUNCT__
15754a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense"
157613f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[])
1577905e6a2fSBarry Smith {
15786849ba73SBarry Smith   PetscErrorCode ierr;
157913f74950SBarry Smith   PetscInt       i;
1580905e6a2fSBarry Smith 
15813a40ed3dSBarry Smith   PetscFunctionBegin;
1582905e6a2fSBarry Smith   if (scall == MAT_INITIAL_MATRIX) {
1583b0a32e0cSBarry Smith     ierr = PetscMalloc((n+1)*sizeof(Mat),B);CHKERRQ(ierr);
1584905e6a2fSBarry Smith   }
1585905e6a2fSBarry Smith 
1586905e6a2fSBarry Smith   for (i=0; i<n; i++) {
15876a6a5d1dSBarry Smith     ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr);
1588905e6a2fSBarry Smith   }
15893a40ed3dSBarry Smith   PetscFunctionReturn(0);
1590905e6a2fSBarry Smith }
1591905e6a2fSBarry Smith 
15924a2ae208SSatish Balay #undef __FUNCT__
1593c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense"
1594c0aa2d19SHong Zhang PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode)
1595c0aa2d19SHong Zhang {
1596c0aa2d19SHong Zhang   PetscFunctionBegin;
1597c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1598c0aa2d19SHong Zhang }
1599c0aa2d19SHong Zhang 
1600c0aa2d19SHong Zhang #undef __FUNCT__
1601c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense"
1602c0aa2d19SHong Zhang PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode)
1603c0aa2d19SHong Zhang {
1604c0aa2d19SHong Zhang   PetscFunctionBegin;
1605c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1606c0aa2d19SHong Zhang }
1607c0aa2d19SHong Zhang 
1608c0aa2d19SHong Zhang #undef __FUNCT__
16094a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense"
1610dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str)
16114b0e389bSBarry Smith {
16124b0e389bSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data;
16136849ba73SBarry Smith   PetscErrorCode ierr;
1614d0f46423SBarry Smith   PetscInt       lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j;
16153a40ed3dSBarry Smith 
16163a40ed3dSBarry Smith   PetscFunctionBegin;
161733f4a19fSKris Buschelman   /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */
161833f4a19fSKris Buschelman   if (A->ops->copy != B->ops->copy) {
1619cb5b572fSBarry Smith     ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr);
16203a40ed3dSBarry Smith     PetscFunctionReturn(0);
16213a40ed3dSBarry Smith   }
1622e32f2f54SBarry Smith   if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)");
1623a5ce6ee0Svictorle   if (lda1>m || lda2>m) {
16240dbb7854Svictorle     for (j=0; j<n; j++) {
1625a5ce6ee0Svictorle       ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr);
1626a5ce6ee0Svictorle     }
1627a5ce6ee0Svictorle   } else {
1628d0f46423SBarry Smith     ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1629a5ce6ee0Svictorle   }
1630273d9f13SBarry Smith   PetscFunctionReturn(0);
1631273d9f13SBarry Smith }
1632273d9f13SBarry Smith 
16334a2ae208SSatish Balay #undef __FUNCT__
16344994cf47SJed Brown #define __FUNCT__ "MatSetUp_SeqDense"
16354994cf47SJed Brown PetscErrorCode MatSetUp_SeqDense(Mat A)
1636273d9f13SBarry Smith {
1637dfbe8321SBarry Smith   PetscErrorCode ierr;
1638273d9f13SBarry Smith 
1639273d9f13SBarry Smith   PetscFunctionBegin;
1640273d9f13SBarry Smith   ierr =  MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr);
16413a40ed3dSBarry Smith   PetscFunctionReturn(0);
16424b0e389bSBarry Smith }
16434b0e389bSBarry Smith 
1644284134d9SBarry Smith #undef __FUNCT__
1645ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense"
1646ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A)
1647ba337c44SJed Brown {
1648ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1649ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1650ba337c44SJed Brown   PetscScalar  *aa = a->v;
1651ba337c44SJed Brown 
1652ba337c44SJed Brown   PetscFunctionBegin;
1653ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]);
1654ba337c44SJed Brown   PetscFunctionReturn(0);
1655ba337c44SJed Brown }
1656ba337c44SJed Brown 
1657ba337c44SJed Brown #undef __FUNCT__
1658ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense"
1659ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A)
1660ba337c44SJed Brown {
1661ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1662ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1663ba337c44SJed Brown   PetscScalar  *aa = a->v;
1664ba337c44SJed Brown 
1665ba337c44SJed Brown   PetscFunctionBegin;
1666ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]);
1667ba337c44SJed Brown   PetscFunctionReturn(0);
1668ba337c44SJed Brown }
1669ba337c44SJed Brown 
1670ba337c44SJed Brown #undef __FUNCT__
1671ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense"
1672ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A)
1673ba337c44SJed Brown {
1674ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1675ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1676ba337c44SJed Brown   PetscScalar  *aa = a->v;
1677ba337c44SJed Brown 
1678ba337c44SJed Brown   PetscFunctionBegin;
1679ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]);
1680ba337c44SJed Brown   PetscFunctionReturn(0);
1681ba337c44SJed Brown }
1682284134d9SBarry Smith 
1683a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/
1684a9fe9ddaSSatish Balay #undef __FUNCT__
1685a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense"
1686a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1687a9fe9ddaSSatish Balay {
1688a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1689a9fe9ddaSSatish Balay 
1690a9fe9ddaSSatish Balay   PetscFunctionBegin;
1691a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
16923ff4c91cSHong Zhang     ierr = PetscLogEventBegin(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1693a9fe9ddaSSatish Balay     ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
16943ff4c91cSHong Zhang     ierr = PetscLogEventEnd(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1695a9fe9ddaSSatish Balay   }
16963ff4c91cSHong Zhang   ierr = PetscLogEventBegin(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1697a9fe9ddaSSatish Balay   ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
16983ff4c91cSHong Zhang   ierr = PetscLogEventEnd(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1699a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1700a9fe9ddaSSatish Balay }
1701a9fe9ddaSSatish Balay 
1702a9fe9ddaSSatish Balay #undef __FUNCT__
1703a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense"
1704a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1705a9fe9ddaSSatish Balay {
1706ee16a9a1SHong Zhang   PetscErrorCode ierr;
1707d0f46423SBarry Smith   PetscInt       m=A->rmap->n,n=B->cmap->n;
1708ee16a9a1SHong Zhang   Mat            Cmat;
1709a9fe9ddaSSatish Balay 
1710ee16a9a1SHong Zhang   PetscFunctionBegin;
1711e32f2f54SBarry 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);
1712ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1713ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1714ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
17150298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr);
1716d73949e8SHong Zhang 
1717ee16a9a1SHong Zhang   *C = Cmat;
1718ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1719ee16a9a1SHong Zhang }
1720a9fe9ddaSSatish Balay 
172198a3b096SSatish Balay #undef __FUNCT__
1722a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense"
1723a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1724a9fe9ddaSSatish Balay {
1725a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1726a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1727a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
17280805154bSBarry Smith   PetscBLASInt   m,n,k;
1729a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1730c5df96a5SBarry Smith   PetscErrorCode ierr;
1731a9fe9ddaSSatish Balay 
1732a9fe9ddaSSatish Balay   PetscFunctionBegin;
1733c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
1734c5df96a5SBarry Smith   ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr);
1735c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr);
17368b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
1737a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1738a9fe9ddaSSatish Balay }
1739a9fe9ddaSSatish Balay 
1740a9fe9ddaSSatish Balay #undef __FUNCT__
174175648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqDense_SeqDense"
174275648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1743a9fe9ddaSSatish Balay {
1744a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1745a9fe9ddaSSatish Balay 
1746a9fe9ddaSSatish Balay   PetscFunctionBegin;
1747a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
17483ff4c91cSHong Zhang     ierr = PetscLogEventBegin(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
174975648e8dSHong Zhang     ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
17503ff4c91cSHong Zhang     ierr = PetscLogEventEnd(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1751a9fe9ddaSSatish Balay   }
17523ff4c91cSHong Zhang   ierr = PetscLogEventBegin(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr);
175375648e8dSHong Zhang   ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
17543ff4c91cSHong Zhang   ierr = PetscLogEventEnd(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1755a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1756a9fe9ddaSSatish Balay }
1757a9fe9ddaSSatish Balay 
1758a9fe9ddaSSatish Balay #undef __FUNCT__
175975648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqDense_SeqDense"
176075648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1761a9fe9ddaSSatish Balay {
1762ee16a9a1SHong Zhang   PetscErrorCode ierr;
1763d0f46423SBarry Smith   PetscInt       m=A->cmap->n,n=B->cmap->n;
1764ee16a9a1SHong Zhang   Mat            Cmat;
1765a9fe9ddaSSatish Balay 
1766ee16a9a1SHong Zhang   PetscFunctionBegin;
1767e32f2f54SBarry 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);
1768ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1769ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1770ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
17710298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr);
17722205254eSKarl Rupp 
1773ee16a9a1SHong Zhang   Cmat->assembled = PETSC_TRUE;
17742205254eSKarl Rupp 
1775ee16a9a1SHong Zhang   *C = Cmat;
1776ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1777ee16a9a1SHong Zhang }
1778a9fe9ddaSSatish Balay 
1779a9fe9ddaSSatish Balay #undef __FUNCT__
178075648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqDense_SeqDense"
178175648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1782a9fe9ddaSSatish Balay {
1783a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1784a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1785a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
17860805154bSBarry Smith   PetscBLASInt   m,n,k;
1787a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1788c5df96a5SBarry Smith   PetscErrorCode ierr;
1789a9fe9ddaSSatish Balay 
1790a9fe9ddaSSatish Balay   PetscFunctionBegin;
1791c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&m);CHKERRQ(ierr);
1792c5df96a5SBarry Smith   ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr);
1793c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr);
17942fbe02b9SBarry Smith   /*
17952fbe02b9SBarry Smith      Note the m and n arguments below are the number rows and columns of A', not A!
17962fbe02b9SBarry Smith   */
17978b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
1798a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1799a9fe9ddaSSatish Balay }
1800985db425SBarry Smith 
1801985db425SBarry Smith #undef __FUNCT__
1802985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense"
1803985db425SBarry Smith PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[])
1804985db425SBarry Smith {
1805985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1806985db425SBarry Smith   PetscErrorCode ierr;
1807d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1808985db425SBarry Smith   PetscScalar    *x;
1809985db425SBarry Smith   MatScalar      *aa = a->v;
1810985db425SBarry Smith 
1811985db425SBarry Smith   PetscFunctionBegin;
1812e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1813985db425SBarry Smith 
1814985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1815985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1816985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1817e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1818985db425SBarry Smith   for (i=0; i<m; i++) {
1819985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1820985db425SBarry Smith     for (j=1; j<n; j++) {
1821985db425SBarry Smith       if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1822985db425SBarry Smith     }
1823985db425SBarry Smith   }
1824985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1825985db425SBarry Smith   PetscFunctionReturn(0);
1826985db425SBarry Smith }
1827985db425SBarry Smith 
1828985db425SBarry Smith #undef __FUNCT__
1829985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense"
1830985db425SBarry Smith PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[])
1831985db425SBarry Smith {
1832985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1833985db425SBarry Smith   PetscErrorCode ierr;
1834d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1835985db425SBarry Smith   PetscScalar    *x;
1836985db425SBarry Smith   PetscReal      atmp;
1837985db425SBarry Smith   MatScalar      *aa = a->v;
1838985db425SBarry Smith 
1839985db425SBarry Smith   PetscFunctionBegin;
1840e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1841985db425SBarry Smith 
1842985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1843985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1844985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1845e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1846985db425SBarry Smith   for (i=0; i<m; i++) {
18479189402eSHong Zhang     x[i] = PetscAbsScalar(aa[i]);
1848985db425SBarry Smith     for (j=1; j<n; j++) {
1849985db425SBarry Smith       atmp = PetscAbsScalar(aa[i+m*j]);
1850985db425SBarry Smith       if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;}
1851985db425SBarry Smith     }
1852985db425SBarry Smith   }
1853985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1854985db425SBarry Smith   PetscFunctionReturn(0);
1855985db425SBarry Smith }
1856985db425SBarry Smith 
1857985db425SBarry Smith #undef __FUNCT__
1858985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense"
1859985db425SBarry Smith PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[])
1860985db425SBarry Smith {
1861985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1862985db425SBarry Smith   PetscErrorCode ierr;
1863d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1864985db425SBarry Smith   PetscScalar    *x;
1865985db425SBarry Smith   MatScalar      *aa = a->v;
1866985db425SBarry Smith 
1867985db425SBarry Smith   PetscFunctionBegin;
1868e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1869985db425SBarry Smith 
1870985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1871985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1872985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1873e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1874985db425SBarry Smith   for (i=0; i<m; i++) {
1875985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1876985db425SBarry Smith     for (j=1; j<n; j++) {
1877985db425SBarry Smith       if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1878985db425SBarry Smith     }
1879985db425SBarry Smith   }
1880985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1881985db425SBarry Smith   PetscFunctionReturn(0);
1882985db425SBarry Smith }
1883985db425SBarry Smith 
18848d0534beSBarry Smith #undef __FUNCT__
18858d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense"
18868d0534beSBarry Smith PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col)
18878d0534beSBarry Smith {
18888d0534beSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
18898d0534beSBarry Smith   PetscErrorCode ierr;
18908d0534beSBarry Smith   PetscScalar    *x;
18918d0534beSBarry Smith 
18928d0534beSBarry Smith   PetscFunctionBegin;
1893e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
18948d0534beSBarry Smith 
18958d0534beSBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1896d0f46423SBarry Smith   ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
18978d0534beSBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
18988d0534beSBarry Smith   PetscFunctionReturn(0);
18998d0534beSBarry Smith }
19008d0534beSBarry Smith 
19010716a85fSBarry Smith 
19020716a85fSBarry Smith #undef __FUNCT__
19030716a85fSBarry Smith #define __FUNCT__ "MatGetColumnNorms_SeqDense"
19040716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms)
19050716a85fSBarry Smith {
19060716a85fSBarry Smith   PetscErrorCode ierr;
19070716a85fSBarry Smith   PetscInt       i,j,m,n;
19080716a85fSBarry Smith   PetscScalar    *a;
19090716a85fSBarry Smith 
19100716a85fSBarry Smith   PetscFunctionBegin;
19110716a85fSBarry Smith   ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr);
19120716a85fSBarry Smith   ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr);
19138c778c55SBarry Smith   ierr = MatDenseGetArray(A,&a);CHKERRQ(ierr);
19140716a85fSBarry Smith   if (type == NORM_2) {
19150716a85fSBarry Smith     for (i=0; i<n; i++) {
19160716a85fSBarry Smith       for (j=0; j<m; j++) {
19170716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]*a[j]);
19180716a85fSBarry Smith       }
19190716a85fSBarry Smith       a += m;
19200716a85fSBarry Smith     }
19210716a85fSBarry Smith   } else if (type == NORM_1) {
19220716a85fSBarry Smith     for (i=0; i<n; i++) {
19230716a85fSBarry Smith       for (j=0; j<m; j++) {
19240716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]);
19250716a85fSBarry Smith       }
19260716a85fSBarry Smith       a += m;
19270716a85fSBarry Smith     }
19280716a85fSBarry Smith   } else if (type == NORM_INFINITY) {
19290716a85fSBarry Smith     for (i=0; i<n; i++) {
19300716a85fSBarry Smith       for (j=0; j<m; j++) {
19310716a85fSBarry Smith         norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]);
19320716a85fSBarry Smith       }
19330716a85fSBarry Smith       a += m;
19340716a85fSBarry Smith     }
1935ce94432eSBarry Smith   } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType");
19368c778c55SBarry Smith   ierr = MatDenseRestoreArray(A,&a);CHKERRQ(ierr);
19370716a85fSBarry Smith   if (type == NORM_2) {
19388f1a2a5eSBarry Smith     for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]);
19390716a85fSBarry Smith   }
19400716a85fSBarry Smith   PetscFunctionReturn(0);
19410716a85fSBarry Smith }
19420716a85fSBarry Smith 
194373a71a0fSBarry Smith #undef __FUNCT__
194473a71a0fSBarry Smith #define __FUNCT__ "MatSetRandom_SeqDense"
194573a71a0fSBarry Smith static PetscErrorCode  MatSetRandom_SeqDense(Mat x,PetscRandom rctx)
194673a71a0fSBarry Smith {
194773a71a0fSBarry Smith   PetscErrorCode ierr;
194873a71a0fSBarry Smith   PetscScalar    *a;
194973a71a0fSBarry Smith   PetscInt       m,n,i;
195073a71a0fSBarry Smith 
195173a71a0fSBarry Smith   PetscFunctionBegin;
195273a71a0fSBarry Smith   ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr);
19538c778c55SBarry Smith   ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr);
195473a71a0fSBarry Smith   for (i=0; i<m*n; i++) {
195573a71a0fSBarry Smith     ierr = PetscRandomGetValue(rctx,a+i);CHKERRQ(ierr);
195673a71a0fSBarry Smith   }
19578c778c55SBarry Smith   ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr);
195873a71a0fSBarry Smith   PetscFunctionReturn(0);
195973a71a0fSBarry Smith }
196073a71a0fSBarry Smith 
196173a71a0fSBarry Smith 
1962289bc588SBarry Smith /* -------------------------------------------------------------------*/
1963a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense,
1964905e6a2fSBarry Smith                                         MatGetRow_SeqDense,
1965905e6a2fSBarry Smith                                         MatRestoreRow_SeqDense,
1966905e6a2fSBarry Smith                                         MatMult_SeqDense,
196797304618SKris Buschelman                                 /*  4*/ MatMultAdd_SeqDense,
19687c922b88SBarry Smith                                         MatMultTranspose_SeqDense,
19697c922b88SBarry Smith                                         MatMultTransposeAdd_SeqDense,
1970db4efbfdSBarry Smith                                         0,
1971db4efbfdSBarry Smith                                         0,
1972db4efbfdSBarry Smith                                         0,
1973db4efbfdSBarry Smith                                 /* 10*/ 0,
1974905e6a2fSBarry Smith                                         MatLUFactor_SeqDense,
1975905e6a2fSBarry Smith                                         MatCholeskyFactor_SeqDense,
197641f059aeSBarry Smith                                         MatSOR_SeqDense,
1977ec8511deSBarry Smith                                         MatTranspose_SeqDense,
197897304618SKris Buschelman                                 /* 15*/ MatGetInfo_SeqDense,
1979905e6a2fSBarry Smith                                         MatEqual_SeqDense,
1980905e6a2fSBarry Smith                                         MatGetDiagonal_SeqDense,
1981905e6a2fSBarry Smith                                         MatDiagonalScale_SeqDense,
1982905e6a2fSBarry Smith                                         MatNorm_SeqDense,
1983c0aa2d19SHong Zhang                                 /* 20*/ MatAssemblyBegin_SeqDense,
1984c0aa2d19SHong Zhang                                         MatAssemblyEnd_SeqDense,
1985905e6a2fSBarry Smith                                         MatSetOption_SeqDense,
1986905e6a2fSBarry Smith                                         MatZeroEntries_SeqDense,
1987d519adbfSMatthew Knepley                                 /* 24*/ MatZeroRows_SeqDense,
1988db4efbfdSBarry Smith                                         0,
1989db4efbfdSBarry Smith                                         0,
1990db4efbfdSBarry Smith                                         0,
1991db4efbfdSBarry Smith                                         0,
19924994cf47SJed Brown                                 /* 29*/ MatSetUp_SeqDense,
1993273d9f13SBarry Smith                                         0,
1994905e6a2fSBarry Smith                                         0,
199573a71a0fSBarry Smith                                         0,
199673a71a0fSBarry Smith                                         0,
1997d519adbfSMatthew Knepley                                 /* 34*/ MatDuplicate_SeqDense,
1998a5ae1ecdSBarry Smith                                         0,
1999a5ae1ecdSBarry Smith                                         0,
2000a5ae1ecdSBarry Smith                                         0,
2001a5ae1ecdSBarry Smith                                         0,
2002d519adbfSMatthew Knepley                                 /* 39*/ MatAXPY_SeqDense,
2003a5ae1ecdSBarry Smith                                         MatGetSubMatrices_SeqDense,
2004a5ae1ecdSBarry Smith                                         0,
20054b0e389bSBarry Smith                                         MatGetValues_SeqDense,
2006a5ae1ecdSBarry Smith                                         MatCopy_SeqDense,
2007d519adbfSMatthew Knepley                                 /* 44*/ MatGetRowMax_SeqDense,
2008a5ae1ecdSBarry Smith                                         MatScale_SeqDense,
2009a5ae1ecdSBarry Smith                                         0,
2010a5ae1ecdSBarry Smith                                         0,
2011a5ae1ecdSBarry Smith                                         0,
201273a71a0fSBarry Smith                                 /* 49*/ MatSetRandom_SeqDense,
2013a5ae1ecdSBarry Smith                                         0,
2014a5ae1ecdSBarry Smith                                         0,
2015a5ae1ecdSBarry Smith                                         0,
2016a5ae1ecdSBarry Smith                                         0,
2017d519adbfSMatthew Knepley                                 /* 54*/ 0,
2018a5ae1ecdSBarry Smith                                         0,
2019a5ae1ecdSBarry Smith                                         0,
2020a5ae1ecdSBarry Smith                                         0,
2021a5ae1ecdSBarry Smith                                         0,
2022d519adbfSMatthew Knepley                                 /* 59*/ 0,
2023e03a110bSBarry Smith                                         MatDestroy_SeqDense,
2024e03a110bSBarry Smith                                         MatView_SeqDense,
2025357abbc8SBarry Smith                                         0,
202697304618SKris Buschelman                                         0,
2027d519adbfSMatthew Knepley                                 /* 64*/ 0,
202897304618SKris Buschelman                                         0,
202997304618SKris Buschelman                                         0,
203097304618SKris Buschelman                                         0,
203197304618SKris Buschelman                                         0,
2032d519adbfSMatthew Knepley                                 /* 69*/ MatGetRowMaxAbs_SeqDense,
203397304618SKris Buschelman                                         0,
203497304618SKris Buschelman                                         0,
203597304618SKris Buschelman                                         0,
203697304618SKris Buschelman                                         0,
2037d519adbfSMatthew Knepley                                 /* 74*/ 0,
203897304618SKris Buschelman                                         0,
203997304618SKris Buschelman                                         0,
204097304618SKris Buschelman                                         0,
204197304618SKris Buschelman                                         0,
2042d519adbfSMatthew Knepley                                 /* 79*/ 0,
204397304618SKris Buschelman                                         0,
204497304618SKris Buschelman                                         0,
204597304618SKris Buschelman                                         0,
20465bba2384SShri Abhyankar                                 /* 83*/ MatLoad_SeqDense,
2047865e5f61SKris Buschelman                                         0,
20481cbb95d3SBarry Smith                                         MatIsHermitian_SeqDense,
2049865e5f61SKris Buschelman                                         0,
2050865e5f61SKris Buschelman                                         0,
2051865e5f61SKris Buschelman                                         0,
2052d519adbfSMatthew Knepley                                 /* 89*/ MatMatMult_SeqDense_SeqDense,
2053a9fe9ddaSSatish Balay                                         MatMatMultSymbolic_SeqDense_SeqDense,
2054a9fe9ddaSSatish Balay                                         MatMatMultNumeric_SeqDense_SeqDense,
2055865e5f61SKris Buschelman                                         0,
2056865e5f61SKris Buschelman                                         0,
2057d519adbfSMatthew Knepley                                 /* 94*/ 0,
20585df89d91SHong Zhang                                         0,
20595df89d91SHong Zhang                                         0,
20605df89d91SHong Zhang                                         0,
2061284134d9SBarry Smith                                         0,
2062d519adbfSMatthew Knepley                                 /* 99*/ 0,
2063284134d9SBarry Smith                                         0,
2064284134d9SBarry Smith                                         0,
2065ba337c44SJed Brown                                         MatConjugate_SeqDense,
2066f73d5cc4SBarry Smith                                         0,
2067ba337c44SJed Brown                                 /*104*/ 0,
2068ba337c44SJed Brown                                         MatRealPart_SeqDense,
2069ba337c44SJed Brown                                         MatImaginaryPart_SeqDense,
2070985db425SBarry Smith                                         0,
2071985db425SBarry Smith                                         0,
207285e2c93fSHong Zhang                                 /*109*/ MatMatSolve_SeqDense,
2073985db425SBarry Smith                                         0,
20748d0534beSBarry Smith                                         MatGetRowMin_SeqDense,
2075aabbc4fbSShri Abhyankar                                         MatGetColumnVector_SeqDense,
2076aabbc4fbSShri Abhyankar                                         0,
2077aabbc4fbSShri Abhyankar                                 /*114*/ 0,
2078aabbc4fbSShri Abhyankar                                         0,
2079aabbc4fbSShri Abhyankar                                         0,
2080aabbc4fbSShri Abhyankar                                         0,
2081aabbc4fbSShri Abhyankar                                         0,
2082aabbc4fbSShri Abhyankar                                 /*119*/ 0,
2083aabbc4fbSShri Abhyankar                                         0,
2084aabbc4fbSShri Abhyankar                                         0,
20850716a85fSBarry Smith                                         0,
20860716a85fSBarry Smith                                         0,
20870716a85fSBarry Smith                                 /*124*/ 0,
20885df89d91SHong Zhang                                         MatGetColumnNorms_SeqDense,
20895df89d91SHong Zhang                                         0,
20905df89d91SHong Zhang                                         0,
20915df89d91SHong Zhang                                         0,
20925df89d91SHong Zhang                                 /*129*/ 0,
209375648e8dSHong Zhang                                         MatTransposeMatMult_SeqDense_SeqDense,
209475648e8dSHong Zhang                                         MatTransposeMatMultSymbolic_SeqDense_SeqDense,
209575648e8dSHong Zhang                                         MatTransposeMatMultNumeric_SeqDense_SeqDense,
20963964eb88SJed Brown                                         0,
20973964eb88SJed Brown                                 /*134*/ 0,
20983964eb88SJed Brown                                         0,
20993964eb88SJed Brown                                         0,
21003964eb88SJed Brown                                         0,
21013964eb88SJed Brown                                         0,
21023964eb88SJed Brown                                 /*139*/ 0,
2103*f9426fe0SMark Adams                                         0,
21043964eb88SJed Brown                                         0
2105985db425SBarry Smith };
210690ace30eSBarry Smith 
21074a2ae208SSatish Balay #undef __FUNCT__
21084a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense"
21094b828684SBarry Smith /*@C
2110fafbff53SBarry Smith    MatCreateSeqDense - Creates a sequential dense matrix that
2111d65003e9SLois Curfman McInnes    is stored in column major order (the usual Fortran 77 manner). Many
2112d65003e9SLois Curfman McInnes    of the matrix operations use the BLAS and LAPACK routines.
2113289bc588SBarry Smith 
2114db81eaa0SLois Curfman McInnes    Collective on MPI_Comm
2115db81eaa0SLois Curfman McInnes 
211620563c6bSBarry Smith    Input Parameters:
2117db81eaa0SLois Curfman McInnes +  comm - MPI communicator, set to PETSC_COMM_SELF
21180c775827SLois Curfman McInnes .  m - number of rows
211918f449edSLois Curfman McInnes .  n - number of columns
21200298fd71SBarry Smith -  data - optional location of matrix data in column major order.  Set data=NULL for PETSc
2121dfc5480cSLois Curfman McInnes    to control all matrix memory allocation.
212220563c6bSBarry Smith 
212320563c6bSBarry Smith    Output Parameter:
212444cd7ae7SLois Curfman McInnes .  A - the matrix
212520563c6bSBarry Smith 
2126b259b22eSLois Curfman McInnes    Notes:
212718f449edSLois Curfman McInnes    The data input variable is intended primarily for Fortran programmers
212818f449edSLois Curfman McInnes    who wish to allocate their own matrix memory space.  Most users should
21290298fd71SBarry Smith    set data=NULL.
213018f449edSLois Curfman McInnes 
2131027ccd11SLois Curfman McInnes    Level: intermediate
2132027ccd11SLois Curfman McInnes 
2133dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS
2134d65003e9SLois Curfman McInnes 
213569b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues()
213620563c6bSBarry Smith @*/
21377087cfbeSBarry Smith PetscErrorCode  MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A)
2138289bc588SBarry Smith {
2139dfbe8321SBarry Smith   PetscErrorCode ierr;
21403b2fbd54SBarry Smith 
21413a40ed3dSBarry Smith   PetscFunctionBegin;
2142f69a0ea3SMatthew Knepley   ierr = MatCreate(comm,A);CHKERRQ(ierr);
2143f69a0ea3SMatthew Knepley   ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr);
2144273d9f13SBarry Smith   ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr);
2145273d9f13SBarry Smith   ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr);
2146273d9f13SBarry Smith   PetscFunctionReturn(0);
2147273d9f13SBarry Smith }
2148273d9f13SBarry Smith 
21494a2ae208SSatish Balay #undef __FUNCT__
2150afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation"
2151273d9f13SBarry Smith /*@C
2152273d9f13SBarry Smith    MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements
2153273d9f13SBarry Smith 
2154273d9f13SBarry Smith    Collective on MPI_Comm
2155273d9f13SBarry Smith 
2156273d9f13SBarry Smith    Input Parameters:
2157273d9f13SBarry Smith +  A - the matrix
21580298fd71SBarry Smith -  data - the array (or NULL)
2159273d9f13SBarry Smith 
2160273d9f13SBarry Smith    Notes:
2161273d9f13SBarry Smith    The data input variable is intended primarily for Fortran programmers
2162273d9f13SBarry Smith    who wish to allocate their own matrix memory space.  Most users should
2163284134d9SBarry Smith    need not call this routine.
2164273d9f13SBarry Smith 
2165273d9f13SBarry Smith    Level: intermediate
2166273d9f13SBarry Smith 
2167273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS
2168273d9f13SBarry Smith 
216969b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA()
2170867c911aSBarry Smith 
2171273d9f13SBarry Smith @*/
21727087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation(Mat B,PetscScalar data[])
2173273d9f13SBarry Smith {
21744ac538c5SBarry Smith   PetscErrorCode ierr;
2175a23d5eceSKris Buschelman 
2176a23d5eceSKris Buschelman   PetscFunctionBegin;
21774ac538c5SBarry Smith   ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr);
2178a23d5eceSKris Buschelman   PetscFunctionReturn(0);
2179a23d5eceSKris Buschelman }
2180a23d5eceSKris Buschelman 
2181a23d5eceSKris Buschelman #undef __FUNCT__
2182afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense"
21837087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data)
2184a23d5eceSKris Buschelman {
2185273d9f13SBarry Smith   Mat_SeqDense   *b;
2186dfbe8321SBarry Smith   PetscErrorCode ierr;
2187273d9f13SBarry Smith 
2188273d9f13SBarry Smith   PetscFunctionBegin;
2189273d9f13SBarry Smith   B->preallocated = PETSC_TRUE;
2190a868139aSShri Abhyankar 
219134ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr);
219234ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr);
219334ef9618SShri Abhyankar 
2194273d9f13SBarry Smith   b       = (Mat_SeqDense*)B->data;
219586d161a7SShri Abhyankar   b->Mmax = B->rmap->n;
219686d161a7SShri Abhyankar   b->Nmax = B->cmap->n;
219786d161a7SShri Abhyankar   if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n;
219886d161a7SShri Abhyankar 
21999e8f95c4SLisandro Dalcin   if (!data) { /* petsc-allocated storage */
22009e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
22015afd5e0cSBarry Smith     ierr = PetscMalloc(b->lda*b->Nmax*sizeof(PetscScalar),&b->v);CHKERRQ(ierr);
2202284134d9SBarry Smith     ierr = PetscMemzero(b->v,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
22033bb1ff40SBarry Smith     ierr = PetscLogObjectMemory((PetscObject)B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
22042205254eSKarl Rupp 
22059e8f95c4SLisandro Dalcin     b->user_alloc = PETSC_FALSE;
2206273d9f13SBarry Smith   } else { /* user-allocated storage */
22079e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2208273d9f13SBarry Smith     b->v          = data;
2209273d9f13SBarry Smith     b->user_alloc = PETSC_TRUE;
2210273d9f13SBarry Smith   }
22110450473dSBarry Smith   B->assembled = PETSC_TRUE;
2212273d9f13SBarry Smith   PetscFunctionReturn(0);
2213273d9f13SBarry Smith }
2214273d9f13SBarry Smith 
22151b807ce4Svictorle #undef __FUNCT__
22161b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA"
22171b807ce4Svictorle /*@C
22181b807ce4Svictorle   MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array
22191b807ce4Svictorle 
22201b807ce4Svictorle   Input parameter:
22211b807ce4Svictorle + A - the matrix
22221b807ce4Svictorle - lda - the leading dimension
22231b807ce4Svictorle 
22241b807ce4Svictorle   Notes:
2225867c911aSBarry Smith   This routine is to be used in conjunction with MatSeqDenseSetPreallocation();
22261b807ce4Svictorle   it asserts that the preallocation has a leading dimension (the LDA parameter
22271b807ce4Svictorle   of Blas and Lapack fame) larger than M, the first dimension of the matrix.
22281b807ce4Svictorle 
22291b807ce4Svictorle   Level: intermediate
22301b807ce4Svictorle 
22311b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS
22321b807ce4Svictorle 
2233284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize()
2234867c911aSBarry Smith 
22351b807ce4Svictorle @*/
22367087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetLDA(Mat B,PetscInt lda)
22371b807ce4Svictorle {
22381b807ce4Svictorle   Mat_SeqDense *b = (Mat_SeqDense*)B->data;
223921a2c019SBarry Smith 
22401b807ce4Svictorle   PetscFunctionBegin;
2241e32f2f54SBarry 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);
22421b807ce4Svictorle   b->lda       = lda;
224321a2c019SBarry Smith   b->changelda = PETSC_FALSE;
224421a2c019SBarry Smith   b->Mmax      = PetscMax(b->Mmax,lda);
22451b807ce4Svictorle   PetscFunctionReturn(0);
22461b807ce4Svictorle }
22471b807ce4Svictorle 
22480bad9183SKris Buschelman /*MC
2249fafad747SKris Buschelman    MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices.
22500bad9183SKris Buschelman 
22510bad9183SKris Buschelman    Options Database Keys:
22520bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions()
22530bad9183SKris Buschelman 
22540bad9183SKris Buschelman   Level: beginner
22550bad9183SKris Buschelman 
225689665df3SBarry Smith .seealso: MatCreateSeqDense()
225789665df3SBarry Smith 
22580bad9183SKris Buschelman M*/
22590bad9183SKris Buschelman 
22604a2ae208SSatish Balay #undef __FUNCT__
22614a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense"
22628cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatCreate_SeqDense(Mat B)
2263273d9f13SBarry Smith {
2264273d9f13SBarry Smith   Mat_SeqDense   *b;
2265dfbe8321SBarry Smith   PetscErrorCode ierr;
22667c334f02SBarry Smith   PetscMPIInt    size;
2267273d9f13SBarry Smith 
2268273d9f13SBarry Smith   PetscFunctionBegin;
2269ce94432eSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr);
2270e32f2f54SBarry Smith   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1");
227155659b69SBarry Smith 
227238f2d2fdSLisandro Dalcin   ierr    = PetscNewLog(B,Mat_SeqDense,&b);CHKERRQ(ierr);
2273549d3d68SSatish Balay   ierr    = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr);
227444cd7ae7SLois Curfman McInnes   B->data = (void*)b;
227518f449edSLois Curfman McInnes 
227644cd7ae7SLois Curfman McInnes   b->pivots      = 0;
2277273d9f13SBarry Smith   b->roworiented = PETSC_TRUE;
2278273d9f13SBarry Smith   b->v           = 0;
227921a2c019SBarry Smith   b->changelda   = PETSC_FALSE;
22804e220ebcSLois Curfman McInnes 
2281bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr);
2282bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr);
2283b24902e0SBarry Smith 
2284bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr);
2285bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatGetFactor_petsc_C",MatGetFactor_seqdense_petsc);CHKERRQ(ierr);
2286bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr);
2287bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaij_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
2288bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
2289bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
22903bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaij_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
22913bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
22923bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaij_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
229317667f90SBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr);
22943a40ed3dSBarry Smith   PetscFunctionReturn(0);
2295289bc588SBarry Smith }
2296