xref: /petsc/src/mat/impls/dense/seq/dense.c (revision d5ea218e6e602d00c37aa0c56523f601b25ab1a0)
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 
11ca15aa20SStefano Zampini PetscErrorCode MatSeqDenseSymmetrize_Private(Mat A, PetscBool hermitian)
128c178816SStefano Zampini {
138c178816SStefano Zampini   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
148c178816SStefano Zampini   PetscInt       j, k, n = A->rmap->n;
15ca15aa20SStefano Zampini   PetscScalar    *v;
16ca15aa20SStefano Zampini   PetscErrorCode ierr;
178c178816SStefano Zampini 
188c178816SStefano Zampini   PetscFunctionBegin;
198c178816SStefano Zampini   if (A->rmap->n != A->cmap->n) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_SUP,"Cannot symmetrize a rectangular matrix");
20ca15aa20SStefano Zampini   ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr);
218c178816SStefano Zampini   if (!hermitian) {
228c178816SStefano Zampini     for (k=0;k<n;k++) {
238c178816SStefano Zampini       for (j=k;j<n;j++) {
24ca15aa20SStefano Zampini         v[j*mat->lda + k] = v[k*mat->lda + j];
258c178816SStefano Zampini       }
268c178816SStefano Zampini     }
278c178816SStefano Zampini   } else {
288c178816SStefano Zampini     for (k=0;k<n;k++) {
298c178816SStefano Zampini       for (j=k;j<n;j++) {
30ca15aa20SStefano Zampini         v[j*mat->lda + k] = PetscConj(v[k*mat->lda + j]);
318c178816SStefano Zampini       }
328c178816SStefano Zampini     }
338c178816SStefano Zampini   }
34ca15aa20SStefano Zampini   ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr);
358c178816SStefano Zampini   PetscFunctionReturn(0);
368c178816SStefano Zampini }
378c178816SStefano Zampini 
3805709791SSatish Balay PETSC_EXTERN PetscErrorCode MatSeqDenseInvertFactors_Private(Mat A)
398c178816SStefano Zampini {
408c178816SStefano Zampini   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
418c178816SStefano Zampini   PetscErrorCode ierr;
428c178816SStefano Zampini   PetscBLASInt   info,n;
438c178816SStefano Zampini 
448c178816SStefano Zampini   PetscFunctionBegin;
458c178816SStefano Zampini   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
468c178816SStefano Zampini   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
478c178816SStefano Zampini   if (A->factortype == MAT_FACTOR_LU) {
488c178816SStefano Zampini     if (!mat->pivots) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Pivots not present");
498c178816SStefano Zampini     if (!mat->fwork) {
508c178816SStefano Zampini       mat->lfwork = n;
518c178816SStefano Zampini       ierr = PetscMalloc1(mat->lfwork,&mat->fwork);CHKERRQ(ierr);
528c178816SStefano Zampini       ierr = PetscLogObjectMemory((PetscObject)A,mat->lfwork*sizeof(PetscBLASInt));CHKERRQ(ierr);
538c178816SStefano Zampini     }
5400121966SStefano Zampini     ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
558c178816SStefano Zampini     PetscStackCallBLAS("LAPACKgetri",LAPACKgetri_(&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&mat->lfwork,&info));
5600121966SStefano Zampini     ierr = PetscFPTrapPop();CHKERRQ(ierr);
57ca15aa20SStefano Zampini     ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr);
588c178816SStefano Zampini   } else if (A->factortype == MAT_FACTOR_CHOLESKY) {
598c178816SStefano Zampini     if (A->spd) {
6000121966SStefano Zampini       ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
618c178816SStefano Zampini       PetscStackCallBLAS("LAPACKpotri",LAPACKpotri_("L",&n,mat->v,&mat->lda,&info));
6200121966SStefano Zampini       ierr = PetscFPTrapPop();CHKERRQ(ierr);
638c178816SStefano Zampini       ierr = MatSeqDenseSymmetrize_Private(A,PETSC_TRUE);CHKERRQ(ierr);
648c178816SStefano Zampini #if defined(PETSC_USE_COMPLEX)
658c178816SStefano Zampini     } else if (A->hermitian) {
668c178816SStefano Zampini       if (!mat->pivots) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Pivots not present");
678c178816SStefano Zampini       if (!mat->fwork) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Fwork not present");
6800121966SStefano Zampini       ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
698c178816SStefano Zampini       PetscStackCallBLAS("LAPACKhetri",LAPACKhetri_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&info));
7000121966SStefano Zampini       ierr = PetscFPTrapPop();CHKERRQ(ierr);
718c178816SStefano Zampini       ierr = MatSeqDenseSymmetrize_Private(A,PETSC_TRUE);CHKERRQ(ierr);
728c178816SStefano Zampini #endif
738c178816SStefano Zampini     } else { /* symmetric case */
748c178816SStefano Zampini       if (!mat->pivots) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Pivots not present");
758c178816SStefano Zampini       if (!mat->fwork) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Fwork not present");
7600121966SStefano Zampini       ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
778c178816SStefano Zampini       PetscStackCallBLAS("LAPACKsytri",LAPACKsytri_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&info));
7800121966SStefano Zampini       ierr = PetscFPTrapPop();CHKERRQ(ierr);
798c178816SStefano Zampini       ierr = MatSeqDenseSymmetrize_Private(A,PETSC_FALSE);CHKERRQ(ierr);
808c178816SStefano Zampini     }
818c178816SStefano Zampini     if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad Inversion: zero pivot in row %D",(PetscInt)info-1);
82ca15aa20SStefano Zampini     ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr);
838c178816SStefano Zampini   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
848c178816SStefano Zampini 
858c178816SStefano Zampini   A->ops->solve             = NULL;
868c178816SStefano Zampini   A->ops->matsolve          = NULL;
878c178816SStefano Zampini   A->ops->solvetranspose    = NULL;
888c178816SStefano Zampini   A->ops->matsolvetranspose = NULL;
898c178816SStefano Zampini   A->ops->solveadd          = NULL;
908c178816SStefano Zampini   A->ops->solvetransposeadd = NULL;
918c178816SStefano Zampini   A->factortype             = MAT_FACTOR_NONE;
928c178816SStefano Zampini   ierr                      = PetscFree(A->solvertype);CHKERRQ(ierr);
938c178816SStefano Zampini   PetscFunctionReturn(0);
948c178816SStefano Zampini }
958c178816SStefano Zampini 
963f49a652SStefano Zampini PetscErrorCode MatZeroRowsColumns_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b)
973f49a652SStefano Zampini {
983f49a652SStefano Zampini   PetscErrorCode    ierr;
993f49a652SStefano Zampini   Mat_SeqDense      *l = (Mat_SeqDense*)A->data;
1003f49a652SStefano Zampini   PetscInt          m  = l->lda, n = A->cmap->n,r = A->rmap->n, i,j;
101ca15aa20SStefano Zampini   PetscScalar       *slot,*bb,*v;
1023f49a652SStefano Zampini   const PetscScalar *xx;
1033f49a652SStefano Zampini 
1043f49a652SStefano Zampini   PetscFunctionBegin;
10576bd3646SJed Brown   if (PetscDefined(USE_DEBUG)) {
1063f49a652SStefano Zampini     for (i=0; i<N; i++) {
1073f49a652SStefano Zampini       if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed");
1083f49a652SStefano Zampini       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);
1093f49a652SStefano Zampini       if (rows[i] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Col %D requested to be zeroed greater than or equal number of cols %D",rows[i],A->cmap->n);
1103f49a652SStefano Zampini     }
11176bd3646SJed Brown   }
112ca15aa20SStefano Zampini   if (!N) PetscFunctionReturn(0);
1133f49a652SStefano Zampini 
1143f49a652SStefano Zampini   /* fix right hand side if needed */
1153f49a652SStefano Zampini   if (x && b) {
1166c4d906cSStefano Zampini     Vec xt;
1176c4d906cSStefano Zampini 
1186c4d906cSStefano Zampini     if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices");
1196c4d906cSStefano Zampini     ierr = VecDuplicate(x,&xt);CHKERRQ(ierr);
1206c4d906cSStefano Zampini     ierr = VecCopy(x,xt);CHKERRQ(ierr);
1216c4d906cSStefano Zampini     ierr = VecScale(xt,-1.0);CHKERRQ(ierr);
1226c4d906cSStefano Zampini     ierr = MatMultAdd(A,xt,b,b);CHKERRQ(ierr);
1236c4d906cSStefano Zampini     ierr = VecDestroy(&xt);CHKERRQ(ierr);
1243f49a652SStefano Zampini     ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr);
1253f49a652SStefano Zampini     ierr = VecGetArray(b,&bb);CHKERRQ(ierr);
1263f49a652SStefano Zampini     for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]];
1273f49a652SStefano Zampini     ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr);
1283f49a652SStefano Zampini     ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr);
1293f49a652SStefano Zampini   }
1303f49a652SStefano Zampini 
131ca15aa20SStefano Zampini   ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr);
1323f49a652SStefano Zampini   for (i=0; i<N; i++) {
133ca15aa20SStefano Zampini     slot = v + rows[i]*m;
134580bdb30SBarry Smith     ierr = PetscArrayzero(slot,r);CHKERRQ(ierr);
1353f49a652SStefano Zampini   }
1363f49a652SStefano Zampini   for (i=0; i<N; i++) {
137ca15aa20SStefano Zampini     slot = v + rows[i];
1383f49a652SStefano Zampini     for (j=0; j<n; j++) { *slot = 0.0; slot += m;}
1393f49a652SStefano Zampini   }
1403f49a652SStefano Zampini   if (diag != 0.0) {
1413f49a652SStefano Zampini     if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices");
1423f49a652SStefano Zampini     for (i=0; i<N; i++) {
143ca15aa20SStefano Zampini       slot  = v + (m+1)*rows[i];
1443f49a652SStefano Zampini       *slot = diag;
1453f49a652SStefano Zampini     }
1463f49a652SStefano Zampini   }
147ca15aa20SStefano Zampini   ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr);
1483f49a652SStefano Zampini   PetscFunctionReturn(0);
1493f49a652SStefano Zampini }
1503f49a652SStefano Zampini 
151abc3b08eSStefano Zampini PetscErrorCode MatPtAPNumeric_SeqDense_SeqDense(Mat A,Mat P,Mat C)
152abc3b08eSStefano Zampini {
153abc3b08eSStefano Zampini   Mat_SeqDense   *c = (Mat_SeqDense*)(C->data);
154abc3b08eSStefano Zampini   PetscErrorCode ierr;
155abc3b08eSStefano Zampini 
156abc3b08eSStefano Zampini   PetscFunctionBegin;
157ca15aa20SStefano Zampini   if (c->ptapwork) {
158ca15aa20SStefano Zampini     ierr = (*C->ops->matmultnumeric)(A,P,c->ptapwork);CHKERRQ(ierr);
159ca15aa20SStefano Zampini     ierr = (*C->ops->transposematmultnumeric)(P,c->ptapwork,C);CHKERRQ(ierr);
1604222ddf1SHong Zhang   } else SETERRQ(PetscObjectComm((PetscObject)C),PETSC_ERR_SUP,"Must call MatPtAPSymbolic_SeqDense_SeqDense() first");
161abc3b08eSStefano Zampini   PetscFunctionReturn(0);
162abc3b08eSStefano Zampini }
163abc3b08eSStefano Zampini 
1644222ddf1SHong Zhang PetscErrorCode MatPtAPSymbolic_SeqDense_SeqDense(Mat A,Mat P,PetscReal fill,Mat C)
165abc3b08eSStefano Zampini {
166abc3b08eSStefano Zampini   Mat_SeqDense   *c;
1677a3c3d58SStefano Zampini   PetscBool      cisdense;
168abc3b08eSStefano Zampini   PetscErrorCode ierr;
169abc3b08eSStefano Zampini 
170abc3b08eSStefano Zampini   PetscFunctionBegin;
1714222ddf1SHong Zhang   ierr = MatSetSizes(C,P->cmap->n,P->cmap->n,P->cmap->N,P->cmap->N);CHKERRQ(ierr);
1727a3c3d58SStefano Zampini   ierr = PetscObjectTypeCompareAny((PetscObject)C,&cisdense,MATSEQDENSE,MATSEQDENSECUDA,"");CHKERRQ(ierr);
1737a3c3d58SStefano Zampini   if (!cisdense) {
1747a3c3d58SStefano Zampini     PetscBool flg;
1757a3c3d58SStefano Zampini 
1767a3c3d58SStefano Zampini     ierr = PetscObjectTypeCompare((PetscObject)P,((PetscObject)A)->type_name,&flg);CHKERRQ(ierr);
1774222ddf1SHong Zhang     ierr = MatSetType(C,flg ? ((PetscObject)A)->type_name : MATDENSE);CHKERRQ(ierr);
1787a3c3d58SStefano Zampini   }
1797a3c3d58SStefano Zampini   ierr = MatSetUp(C);CHKERRQ(ierr);
1804222ddf1SHong Zhang   c    = (Mat_SeqDense*)C->data;
181ca15aa20SStefano Zampini   ierr = MatCreate(PetscObjectComm((PetscObject)A),&c->ptapwork);CHKERRQ(ierr);
182ca15aa20SStefano Zampini   ierr = MatSetSizes(c->ptapwork,A->rmap->n,P->cmap->n,A->rmap->N,P->cmap->N);CHKERRQ(ierr);
1837a3c3d58SStefano Zampini   ierr = MatSetType(c->ptapwork,((PetscObject)C)->type_name);CHKERRQ(ierr);
1847a3c3d58SStefano Zampini   ierr = MatSetUp(c->ptapwork);CHKERRQ(ierr);
185abc3b08eSStefano Zampini   PetscFunctionReturn(0);
186abc3b08eSStefano Zampini }
187abc3b08eSStefano Zampini 
188cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqAIJ_SeqDense(Mat A,MatType newtype,MatReuse reuse,Mat *newmat)
189b49cda9fSStefano Zampini {
190a13144ffSStefano Zampini   Mat            B = NULL;
191b49cda9fSStefano Zampini   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)A->data;
192b49cda9fSStefano Zampini   Mat_SeqDense   *b;
193b49cda9fSStefano Zampini   PetscErrorCode ierr;
194b49cda9fSStefano Zampini   PetscInt       *ai=a->i,*aj=a->j,m=A->rmap->N,n=A->cmap->N,i;
195b49cda9fSStefano Zampini   MatScalar      *av=a->a;
196a13144ffSStefano Zampini   PetscBool      isseqdense;
197b49cda9fSStefano Zampini 
198b49cda9fSStefano Zampini   PetscFunctionBegin;
199a13144ffSStefano Zampini   if (reuse == MAT_REUSE_MATRIX) {
200a13144ffSStefano Zampini     ierr = PetscObjectTypeCompare((PetscObject)*newmat,MATSEQDENSE,&isseqdense);CHKERRQ(ierr);
201a32993e3SJed Brown     if (!isseqdense) SETERRQ1(PetscObjectComm((PetscObject)*newmat),PETSC_ERR_USER,"Cannot reuse matrix of type %s",((PetscObject)(*newmat))->type_name);
202a13144ffSStefano Zampini   }
203a13144ffSStefano Zampini   if (reuse != MAT_REUSE_MATRIX) {
204b49cda9fSStefano Zampini     ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr);
205b49cda9fSStefano Zampini     ierr = MatSetSizes(B,m,n,m,n);CHKERRQ(ierr);
206b49cda9fSStefano Zampini     ierr = MatSetType(B,MATSEQDENSE);CHKERRQ(ierr);
207b49cda9fSStefano Zampini     ierr = MatSeqDenseSetPreallocation(B,NULL);CHKERRQ(ierr);
208b49cda9fSStefano Zampini     b    = (Mat_SeqDense*)(B->data);
209a13144ffSStefano Zampini   } else {
210a13144ffSStefano Zampini     b    = (Mat_SeqDense*)((*newmat)->data);
211580bdb30SBarry Smith     ierr = PetscArrayzero(b->v,m*n);CHKERRQ(ierr);
212a13144ffSStefano Zampini   }
213b49cda9fSStefano Zampini   for (i=0; i<m; i++) {
214b49cda9fSStefano Zampini     PetscInt j;
215b49cda9fSStefano Zampini     for (j=0;j<ai[1]-ai[0];j++) {
216b49cda9fSStefano Zampini       b->v[*aj*m+i] = *av;
217b49cda9fSStefano Zampini       aj++;
218b49cda9fSStefano Zampini       av++;
219b49cda9fSStefano Zampini     }
220b49cda9fSStefano Zampini     ai++;
221b49cda9fSStefano Zampini   }
222b49cda9fSStefano Zampini 
223511c6705SHong Zhang   if (reuse == MAT_INPLACE_MATRIX) {
224a13144ffSStefano Zampini     ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
225a13144ffSStefano Zampini     ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
22628be2f97SBarry Smith     ierr = MatHeaderReplace(A,&B);CHKERRQ(ierr);
227b49cda9fSStefano Zampini   } else {
228a13144ffSStefano Zampini     if (B) *newmat = B;
229a13144ffSStefano Zampini     ierr = MatAssemblyBegin(*newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
230a13144ffSStefano Zampini     ierr = MatAssemblyEnd(*newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
231b49cda9fSStefano Zampini   }
232b49cda9fSStefano Zampini   PetscFunctionReturn(0);
233b49cda9fSStefano Zampini }
234b49cda9fSStefano Zampini 
235cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqDense_SeqAIJ(Mat A, MatType newtype,MatReuse reuse,Mat *newmat)
2366a63e612SBarry Smith {
2376a63e612SBarry Smith   Mat            B;
2386a63e612SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
2396a63e612SBarry Smith   PetscErrorCode ierr;
2409399e1b8SMatthew G. Knepley   PetscInt       i, j;
2419399e1b8SMatthew G. Knepley   PetscInt       *rows, *nnz;
2429399e1b8SMatthew G. Knepley   MatScalar      *aa = a->v, *vals;
2436a63e612SBarry Smith 
2446a63e612SBarry Smith   PetscFunctionBegin;
245ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr);
2466a63e612SBarry Smith   ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr);
2476a63e612SBarry Smith   ierr = MatSetType(B,MATSEQAIJ);CHKERRQ(ierr);
2489399e1b8SMatthew G. Knepley   ierr = PetscCalloc3(A->rmap->n,&rows,A->rmap->n,&nnz,A->rmap->n,&vals);CHKERRQ(ierr);
2499399e1b8SMatthew G. Knepley   for (j=0; j<A->cmap->n; j++) {
2509399e1b8SMatthew G. Knepley     for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) ++nnz[i];
2516a63e612SBarry Smith     aa += a->lda;
2526a63e612SBarry Smith   }
2539399e1b8SMatthew G. Knepley   ierr = MatSeqAIJSetPreallocation(B,PETSC_DETERMINE,nnz);CHKERRQ(ierr);
2549399e1b8SMatthew G. Knepley   aa = a->v;
2559399e1b8SMatthew G. Knepley   for (j=0; j<A->cmap->n; j++) {
2569399e1b8SMatthew G. Knepley     PetscInt numRows = 0;
2579399e1b8SMatthew G. Knepley     for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) {rows[numRows] = i; vals[numRows++] = aa[i];}
2589399e1b8SMatthew G. Knepley     ierr = MatSetValues(B,numRows,rows,1,&j,vals,INSERT_VALUES);CHKERRQ(ierr);
2599399e1b8SMatthew G. Knepley     aa  += a->lda;
2609399e1b8SMatthew G. Knepley   }
2619399e1b8SMatthew G. Knepley   ierr = PetscFree3(rows,nnz,vals);CHKERRQ(ierr);
2626a63e612SBarry Smith   ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2636a63e612SBarry Smith   ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2646a63e612SBarry Smith 
265511c6705SHong Zhang   if (reuse == MAT_INPLACE_MATRIX) {
26628be2f97SBarry Smith     ierr = MatHeaderReplace(A,&B);CHKERRQ(ierr);
2676a63e612SBarry Smith   } else {
2686a63e612SBarry Smith     *newmat = B;
2696a63e612SBarry Smith   }
2706a63e612SBarry Smith   PetscFunctionReturn(0);
2716a63e612SBarry Smith }
2726a63e612SBarry Smith 
273ca15aa20SStefano Zampini PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str)
2741987afe7SBarry Smith {
2751987afe7SBarry Smith   Mat_SeqDense      *x = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data;
276ca15aa20SStefano Zampini   const PetscScalar *xv;
277ca15aa20SStefano Zampini   PetscScalar       *yv;
2780805154bSBarry Smith   PetscBLASInt      N,m,ldax,lday,one = 1;
279efee365bSSatish Balay   PetscErrorCode    ierr;
2803a40ed3dSBarry Smith 
2813a40ed3dSBarry Smith   PetscFunctionBegin;
282ca15aa20SStefano Zampini   ierr = MatDenseGetArrayRead(X,&xv);CHKERRQ(ierr);
283ca15aa20SStefano Zampini   ierr = MatDenseGetArray(Y,&yv);CHKERRQ(ierr);
284c5df96a5SBarry Smith   ierr = PetscBLASIntCast(X->rmap->n*X->cmap->n,&N);CHKERRQ(ierr);
285c5df96a5SBarry Smith   ierr = PetscBLASIntCast(X->rmap->n,&m);CHKERRQ(ierr);
286c5df96a5SBarry Smith   ierr = PetscBLASIntCast(x->lda,&ldax);CHKERRQ(ierr);
287c5df96a5SBarry Smith   ierr = PetscBLASIntCast(y->lda,&lday);CHKERRQ(ierr);
288a5ce6ee0Svictorle   if (ldax>m || lday>m) {
289ca15aa20SStefano Zampini     PetscInt j;
290ca15aa20SStefano Zampini 
291d0f46423SBarry Smith     for (j=0; j<X->cmap->n; j++) {
292ca15aa20SStefano Zampini       PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&m,&alpha,xv+j*ldax,&one,yv+j*lday,&one));
293a5ce6ee0Svictorle     }
294a5ce6ee0Svictorle   } else {
295ca15aa20SStefano Zampini     PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&N,&alpha,xv,&one,yv,&one));
296a5ce6ee0Svictorle   }
297ca15aa20SStefano Zampini   ierr = MatDenseRestoreArrayRead(X,&xv);CHKERRQ(ierr);
298ca15aa20SStefano Zampini   ierr = MatDenseRestoreArray(Y,&yv);CHKERRQ(ierr);
2990450473dSBarry Smith   ierr = PetscLogFlops(PetscMax(2*N-1,0));CHKERRQ(ierr);
3003a40ed3dSBarry Smith   PetscFunctionReturn(0);
3011987afe7SBarry Smith }
3021987afe7SBarry Smith 
303e0877f53SBarry Smith static PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info)
304289bc588SBarry Smith {
305ca15aa20SStefano Zampini   PetscLogDouble N = A->rmap->n*A->cmap->n;
3063a40ed3dSBarry Smith 
3073a40ed3dSBarry Smith   PetscFunctionBegin;
3084e220ebcSLois Curfman McInnes   info->block_size        = 1.0;
309ca15aa20SStefano Zampini   info->nz_allocated      = N;
310ca15aa20SStefano Zampini   info->nz_used           = N;
311ca15aa20SStefano Zampini   info->nz_unneeded       = 0;
312ca15aa20SStefano Zampini   info->assemblies        = A->num_ass;
3134e220ebcSLois Curfman McInnes   info->mallocs           = 0;
3147adad957SLisandro Dalcin   info->memory            = ((PetscObject)A)->mem;
3154e220ebcSLois Curfman McInnes   info->fill_ratio_given  = 0;
3164e220ebcSLois Curfman McInnes   info->fill_ratio_needed = 0;
3174e220ebcSLois Curfman McInnes   info->factor_mallocs    = 0;
3183a40ed3dSBarry Smith   PetscFunctionReturn(0);
319289bc588SBarry Smith }
320289bc588SBarry Smith 
321637a0070SStefano Zampini PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha)
32280cd9d93SLois Curfman McInnes {
323273d9f13SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
324ca15aa20SStefano Zampini   PetscScalar    *v;
325efee365bSSatish Balay   PetscErrorCode ierr;
326c5df96a5SBarry Smith   PetscBLASInt   one = 1,j,nz,lda;
32780cd9d93SLois Curfman McInnes 
3283a40ed3dSBarry Smith   PetscFunctionBegin;
329ca15aa20SStefano Zampini   ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr);
330c5df96a5SBarry Smith   ierr = PetscBLASIntCast(a->lda,&lda);CHKERRQ(ierr);
331d0f46423SBarry Smith   if (lda>A->rmap->n) {
332c5df96a5SBarry Smith     ierr = PetscBLASIntCast(A->rmap->n,&nz);CHKERRQ(ierr);
333d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
334ca15aa20SStefano Zampini       PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&alpha,v+j*lda,&one));
335a5ce6ee0Svictorle     }
336a5ce6ee0Svictorle   } else {
337c5df96a5SBarry Smith     ierr = PetscBLASIntCast(A->rmap->n*A->cmap->n,&nz);CHKERRQ(ierr);
338ca15aa20SStefano Zampini     PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&alpha,v,&one));
339a5ce6ee0Svictorle   }
340efee365bSSatish Balay   ierr = PetscLogFlops(nz);CHKERRQ(ierr);
341ca15aa20SStefano Zampini   ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr);
3423a40ed3dSBarry Smith   PetscFunctionReturn(0);
34380cd9d93SLois Curfman McInnes }
34480cd9d93SLois Curfman McInnes 
345e0877f53SBarry Smith static PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscBool  *fl)
3461cbb95d3SBarry Smith {
3471cbb95d3SBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
348ca15aa20SStefano Zampini   PetscInt          i,j,m = A->rmap->n,N = a->lda;
349ca15aa20SStefano Zampini   const PetscScalar *v;
350ca15aa20SStefano Zampini   PetscErrorCode    ierr;
3511cbb95d3SBarry Smith 
3521cbb95d3SBarry Smith   PetscFunctionBegin;
3531cbb95d3SBarry Smith   *fl = PETSC_FALSE;
354d0f46423SBarry Smith   if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0);
355ca15aa20SStefano Zampini   ierr = MatDenseGetArrayRead(A,&v);CHKERRQ(ierr);
3561cbb95d3SBarry Smith   for (i=0; i<m; i++) {
357ca15aa20SStefano Zampini     for (j=i; j<m; j++) {
358637a0070SStefano Zampini       if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) {
359637a0070SStefano Zampini         goto restore;
3601cbb95d3SBarry Smith       }
3611cbb95d3SBarry Smith     }
362637a0070SStefano Zampini   }
3631cbb95d3SBarry Smith   *fl  = PETSC_TRUE;
364637a0070SStefano Zampini restore:
365637a0070SStefano Zampini   ierr = MatDenseRestoreArrayRead(A,&v);CHKERRQ(ierr);
366637a0070SStefano Zampini   PetscFunctionReturn(0);
367637a0070SStefano Zampini }
368637a0070SStefano Zampini 
369637a0070SStefano Zampini static PetscErrorCode MatIsSymmetric_SeqDense(Mat A,PetscReal rtol,PetscBool  *fl)
370637a0070SStefano Zampini {
371637a0070SStefano Zampini   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
372637a0070SStefano Zampini   PetscInt          i,j,m = A->rmap->n,N = a->lda;
373637a0070SStefano Zampini   const PetscScalar *v;
374637a0070SStefano Zampini   PetscErrorCode    ierr;
375637a0070SStefano Zampini 
376637a0070SStefano Zampini   PetscFunctionBegin;
377637a0070SStefano Zampini   *fl = PETSC_FALSE;
378637a0070SStefano Zampini   if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0);
379637a0070SStefano Zampini   ierr = MatDenseGetArrayRead(A,&v);CHKERRQ(ierr);
380637a0070SStefano Zampini   for (i=0; i<m; i++) {
381637a0070SStefano Zampini     for (j=i; j<m; j++) {
382637a0070SStefano Zampini       if (PetscAbsScalar(v[i+j*N] - v[j+i*N]) > rtol) {
383637a0070SStefano Zampini         goto restore;
384637a0070SStefano Zampini       }
385637a0070SStefano Zampini     }
386637a0070SStefano Zampini   }
387637a0070SStefano Zampini   *fl  = PETSC_TRUE;
388637a0070SStefano Zampini restore:
389637a0070SStefano Zampini   ierr = MatDenseRestoreArrayRead(A,&v);CHKERRQ(ierr);
3901cbb95d3SBarry Smith   PetscFunctionReturn(0);
3911cbb95d3SBarry Smith }
3921cbb95d3SBarry Smith 
393ca15aa20SStefano Zampini PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat newi,Mat A,MatDuplicateOption cpvalues)
394b24902e0SBarry Smith {
395ca15aa20SStefano Zampini   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
396b24902e0SBarry Smith   PetscErrorCode ierr;
397b24902e0SBarry Smith   PetscInt       lda = (PetscInt)mat->lda,j,m;
398b24902e0SBarry Smith 
399b24902e0SBarry Smith   PetscFunctionBegin;
400aa5ea44dSBarry Smith   ierr = PetscLayoutReference(A->rmap,&newi->rmap);CHKERRQ(ierr);
401aa5ea44dSBarry Smith   ierr = PetscLayoutReference(A->cmap,&newi->cmap);CHKERRQ(ierr);
4020298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(newi,NULL);CHKERRQ(ierr);
403b24902e0SBarry Smith   if (cpvalues == MAT_COPY_VALUES) {
404ca15aa20SStefano Zampini     const PetscScalar *av;
405ca15aa20SStefano Zampini     PetscScalar       *v;
406ca15aa20SStefano Zampini 
407ca15aa20SStefano Zampini     ierr = MatDenseGetArrayRead(A,&av);CHKERRQ(ierr);
408ca15aa20SStefano Zampini     ierr = MatDenseGetArray(newi,&v);CHKERRQ(ierr);
409d0f46423SBarry Smith     if (lda>A->rmap->n) {
410d0f46423SBarry Smith       m = A->rmap->n;
411d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
412ca15aa20SStefano Zampini         ierr = PetscArraycpy(v+j*m,av+j*lda,m);CHKERRQ(ierr);
413b24902e0SBarry Smith       }
414b24902e0SBarry Smith     } else {
415ca15aa20SStefano Zampini       ierr = PetscArraycpy(v,av,A->rmap->n*A->cmap->n);CHKERRQ(ierr);
416b24902e0SBarry Smith     }
417ca15aa20SStefano Zampini     ierr = MatDenseRestoreArray(newi,&v);CHKERRQ(ierr);
418ca15aa20SStefano Zampini     ierr = MatDenseRestoreArrayRead(A,&av);CHKERRQ(ierr);
419b24902e0SBarry Smith   }
420b24902e0SBarry Smith   PetscFunctionReturn(0);
421b24902e0SBarry Smith }
422b24902e0SBarry Smith 
423ca15aa20SStefano Zampini PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat)
42402cad45dSBarry Smith {
4256849ba73SBarry Smith   PetscErrorCode ierr;
42602cad45dSBarry Smith 
4273a40ed3dSBarry Smith   PetscFunctionBegin;
428ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),newmat);CHKERRQ(ierr);
429d0f46423SBarry Smith   ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
4305c9eb25fSBarry Smith   ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
431719d5645SBarry Smith   ierr = MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues);CHKERRQ(ierr);
432b24902e0SBarry Smith   PetscFunctionReturn(0);
433b24902e0SBarry Smith }
434b24902e0SBarry Smith 
435e0877f53SBarry Smith static PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
436289bc588SBarry Smith {
4374482741eSBarry Smith   MatFactorInfo  info;
438a093e273SMatthew Knepley   PetscErrorCode ierr;
4393a40ed3dSBarry Smith 
4403a40ed3dSBarry Smith   PetscFunctionBegin;
441c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
442ca15aa20SStefano Zampini   ierr = (*fact->ops->lufactor)(fact,0,0,&info);CHKERRQ(ierr);
4433a40ed3dSBarry Smith   PetscFunctionReturn(0);
444289bc588SBarry Smith }
4456ee01492SSatish Balay 
446e0877f53SBarry Smith static PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy)
447289bc588SBarry Smith {
448c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
4496849ba73SBarry Smith   PetscErrorCode    ierr;
450f1ceaac6SMatthew G. Knepley   const PetscScalar *x;
451f1ceaac6SMatthew G. Knepley   PetscScalar       *y;
452c5df96a5SBarry Smith   PetscBLASInt      one = 1,info,m;
45367e560aaSBarry Smith 
4543a40ed3dSBarry Smith   PetscFunctionBegin;
455c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
456f1ceaac6SMatthew G. Knepley   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
4571ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
458580bdb30SBarry Smith   ierr = PetscArraycpy(y,x,A->rmap->n);CHKERRQ(ierr);
459d5f3da31SBarry Smith   if (A->factortype == MAT_FACTOR_LU) {
46000121966SStefano Zampini     ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
4618b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
46200121966SStefano Zampini     ierr = PetscFPTrapPop();CHKERRQ(ierr);
463e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
464d5f3da31SBarry Smith   } else if (A->factortype == MAT_FACTOR_CHOLESKY) {
465a49dc2a2SStefano Zampini     if (A->spd) {
46600121966SStefano Zampini       ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
4678b83055fSJed Brown       PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
46800121966SStefano Zampini       ierr = PetscFPTrapPop();CHKERRQ(ierr);
469e32f2f54SBarry Smith       if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
470a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX)
471a49dc2a2SStefano Zampini     } else if (A->hermitian) {
47200121966SStefano Zampini       ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
473a49dc2a2SStefano Zampini       PetscStackCallBLAS("LAPACKhetrs",LAPACKhetrs_("L",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
47400121966SStefano Zampini       ierr = PetscFPTrapPop();CHKERRQ(ierr);
475a49dc2a2SStefano Zampini       if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"HETRS Bad solve");
476a49dc2a2SStefano Zampini #endif
477a49dc2a2SStefano Zampini     } else { /* symmetric case */
47800121966SStefano Zampini       ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
479a49dc2a2SStefano Zampini       PetscStackCallBLAS("LAPACKsytrs",LAPACKsytrs_("L",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
48000121966SStefano Zampini       ierr = PetscFPTrapPop();CHKERRQ(ierr);
481a49dc2a2SStefano Zampini       if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"SYTRS Bad solve");
482a49dc2a2SStefano Zampini     }
4832205254eSKarl Rupp   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
484f1ceaac6SMatthew G. Knepley   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
4851ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
486dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
4873a40ed3dSBarry Smith   PetscFunctionReturn(0);
488289bc588SBarry Smith }
4896ee01492SSatish Balay 
490e0877f53SBarry Smith static PetscErrorCode MatMatSolve_SeqDense(Mat A,Mat B,Mat X)
49185e2c93fSHong Zhang {
49285e2c93fSHong Zhang   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
49385e2c93fSHong Zhang   PetscErrorCode    ierr;
4941683a169SBarry Smith   const PetscScalar *b;
4951683a169SBarry Smith   PetscScalar       *x;
496efb80c78SLisandro Dalcin   PetscInt          n;
497783b601eSJed Brown   PetscBLASInt      nrhs,info,m;
49885e2c93fSHong Zhang 
49985e2c93fSHong Zhang   PetscFunctionBegin;
500c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
5010298fd71SBarry Smith   ierr = MatGetSize(B,NULL,&n);CHKERRQ(ierr);
502c5df96a5SBarry Smith   ierr = PetscBLASIntCast(n,&nrhs);CHKERRQ(ierr);
5031683a169SBarry Smith   ierr = MatDenseGetArrayRead(B,&b);CHKERRQ(ierr);
5048c778c55SBarry Smith   ierr = MatDenseGetArray(X,&x);CHKERRQ(ierr);
50585e2c93fSHong Zhang 
506580bdb30SBarry Smith   ierr = PetscArraycpy(x,b,m*nrhs);CHKERRQ(ierr);
50785e2c93fSHong Zhang 
50885e2c93fSHong Zhang   if (A->factortype == MAT_FACTOR_LU) {
50900121966SStefano Zampini     ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
5108b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info));
51100121966SStefano Zampini     ierr = PetscFPTrapPop();CHKERRQ(ierr);
51285e2c93fSHong Zhang     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
51385e2c93fSHong Zhang   } else if (A->factortype == MAT_FACTOR_CHOLESKY) {
514a49dc2a2SStefano Zampini     if (A->spd) {
51500121966SStefano Zampini       ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
5168b83055fSJed Brown       PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info));
51700121966SStefano Zampini       ierr = PetscFPTrapPop();CHKERRQ(ierr);
51885e2c93fSHong Zhang       if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
519a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX)
520a49dc2a2SStefano Zampini     } else if (A->hermitian) {
52100121966SStefano Zampini       ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
522a49dc2a2SStefano Zampini       PetscStackCallBLAS("LAPACKhetrs",LAPACKhetrs_("L",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info));
52300121966SStefano Zampini       ierr = PetscFPTrapPop();CHKERRQ(ierr);
524a49dc2a2SStefano Zampini       if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"HETRS Bad solve");
525a49dc2a2SStefano Zampini #endif
526a49dc2a2SStefano Zampini     } else { /* symmetric case */
52700121966SStefano Zampini       ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
528a49dc2a2SStefano Zampini       PetscStackCallBLAS("LAPACKsytrs",LAPACKsytrs_("L",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info));
52900121966SStefano Zampini       ierr = PetscFPTrapPop();CHKERRQ(ierr);
530a49dc2a2SStefano Zampini       if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"SYTRS Bad solve");
531a49dc2a2SStefano Zampini     }
5322205254eSKarl Rupp   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
53385e2c93fSHong Zhang 
5341683a169SBarry Smith   ierr = MatDenseRestoreArrayRead(B,&b);CHKERRQ(ierr);
5358c778c55SBarry Smith   ierr = MatDenseRestoreArray(X,&x);CHKERRQ(ierr);
53685e2c93fSHong Zhang   ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr);
53785e2c93fSHong Zhang   PetscFunctionReturn(0);
53885e2c93fSHong Zhang }
53985e2c93fSHong Zhang 
54000121966SStefano Zampini static PetscErrorCode MatConjugate_SeqDense(Mat);
54100121966SStefano Zampini 
542e0877f53SBarry Smith static PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy)
543da3a660dSBarry Smith {
544c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
545dfbe8321SBarry Smith   PetscErrorCode    ierr;
546f1ceaac6SMatthew G. Knepley   const PetscScalar *x;
547f1ceaac6SMatthew G. Knepley   PetscScalar       *y;
548c5df96a5SBarry Smith   PetscBLASInt      one = 1,info,m;
54967e560aaSBarry Smith 
5503a40ed3dSBarry Smith   PetscFunctionBegin;
551c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
552f1ceaac6SMatthew G. Knepley   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
5531ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
554580bdb30SBarry Smith   ierr = PetscArraycpy(y,x,A->rmap->n);CHKERRQ(ierr);
5558208b9aeSStefano Zampini   if (A->factortype == MAT_FACTOR_LU) {
55600121966SStefano Zampini     ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
5578b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
55800121966SStefano Zampini     ierr = PetscFPTrapPop();CHKERRQ(ierr);
559e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve");
5608208b9aeSStefano Zampini   } else if (A->factortype == MAT_FACTOR_CHOLESKY) {
561a49dc2a2SStefano Zampini     if (A->spd) {
56200121966SStefano Zampini #if defined(PETSC_USE_COMPLEX)
56300121966SStefano Zampini       ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr);
56400121966SStefano Zampini #endif
56500121966SStefano Zampini       ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
5668b83055fSJed Brown       PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
56700121966SStefano Zampini       ierr = PetscFPTrapPop();CHKERRQ(ierr);
56800121966SStefano Zampini #if defined(PETSC_USE_COMPLEX)
56900121966SStefano Zampini       ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr);
57000121966SStefano Zampini #endif
571a49dc2a2SStefano Zampini       if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
572a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX)
573a49dc2a2SStefano Zampini     } else if (A->hermitian) {
57400121966SStefano Zampini       ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr);
57500121966SStefano Zampini       ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
57600121966SStefano Zampini       PetscStackCallBLAS("LAPACKhetrs",LAPACKhetrs_("L",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
57700121966SStefano Zampini       ierr = PetscFPTrapPop();CHKERRQ(ierr);
57800121966SStefano Zampini       ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr);
579ae7cfcebSSatish Balay #endif
580a49dc2a2SStefano Zampini     } else { /* symmetric case */
58100121966SStefano Zampini       ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
582a49dc2a2SStefano Zampini       PetscStackCallBLAS("LAPACKsytrs",LAPACKsytrs_("L",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
58300121966SStefano Zampini       ierr = PetscFPTrapPop();CHKERRQ(ierr);
584a49dc2a2SStefano Zampini       if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"SYTRS Bad solve");
585da3a660dSBarry Smith     }
586a49dc2a2SStefano Zampini   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
587f1ceaac6SMatthew G. Knepley   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
5881ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
589dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
5903a40ed3dSBarry Smith   PetscFunctionReturn(0);
591da3a660dSBarry Smith }
5926ee01492SSatish Balay 
593db4efbfdSBarry Smith /* ---------------------------------------------------------------*/
594db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots,
595db4efbfdSBarry Smith    rather than put it in the Mat->row slot.*/
596ca15aa20SStefano Zampini PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo)
597db4efbfdSBarry Smith {
598db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
599db4efbfdSBarry Smith   PetscErrorCode ierr;
600db4efbfdSBarry Smith   PetscBLASInt   n,m,info;
601db4efbfdSBarry Smith 
602db4efbfdSBarry Smith   PetscFunctionBegin;
603c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
604c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
605db4efbfdSBarry Smith   if (!mat->pivots) {
6068208b9aeSStefano Zampini     ierr = PetscMalloc1(A->rmap->n,&mat->pivots);CHKERRQ(ierr);
6073bb1ff40SBarry Smith     ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr);
608db4efbfdSBarry Smith   }
609db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
6108e57ea43SSatish Balay   ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
6118b83055fSJed Brown   PetscStackCallBLAS("LAPACKgetrf",LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info));
6128e57ea43SSatish Balay   ierr = PetscFPTrapPop();CHKERRQ(ierr);
6138e57ea43SSatish Balay 
614e32f2f54SBarry Smith   if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization");
615e32f2f54SBarry Smith   if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization");
6168208b9aeSStefano Zampini 
617db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
6188208b9aeSStefano Zampini   A->ops->matsolve          = MatMatSolve_SeqDense;
619db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
620d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_LU;
621db4efbfdSBarry Smith 
622f6224b95SHong Zhang   ierr = PetscFree(A->solvertype);CHKERRQ(ierr);
623f6224b95SHong Zhang   ierr = PetscStrallocpy(MATSOLVERPETSC,&A->solvertype);CHKERRQ(ierr);
624f6224b95SHong Zhang 
625dc0b31edSSatish Balay   ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr);
626db4efbfdSBarry Smith   PetscFunctionReturn(0);
627db4efbfdSBarry Smith }
628db4efbfdSBarry Smith 
629a49dc2a2SStefano Zampini /* Cholesky as L*L^T or L*D*L^T and the symmetric/hermitian complex variants */
630ca15aa20SStefano Zampini PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo)
631db4efbfdSBarry Smith {
632db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
633db4efbfdSBarry Smith   PetscErrorCode ierr;
634c5df96a5SBarry Smith   PetscBLASInt   info,n;
635db4efbfdSBarry Smith 
636db4efbfdSBarry Smith   PetscFunctionBegin;
637c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
638db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
639a49dc2a2SStefano Zampini   if (A->spd) {
64000121966SStefano Zampini     ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
6418b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrf",LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info));
64200121966SStefano Zampini     ierr = PetscFPTrapPop();CHKERRQ(ierr);
643a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX)
644a49dc2a2SStefano Zampini   } else if (A->hermitian) {
645a49dc2a2SStefano Zampini     if (!mat->pivots) {
646a49dc2a2SStefano Zampini       ierr = PetscMalloc1(A->rmap->n,&mat->pivots);CHKERRQ(ierr);
647a49dc2a2SStefano Zampini       ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr);
648a49dc2a2SStefano Zampini     }
649a49dc2a2SStefano Zampini     if (!mat->fwork) {
650a49dc2a2SStefano Zampini       PetscScalar dummy;
651a49dc2a2SStefano Zampini 
652a49dc2a2SStefano Zampini       mat->lfwork = -1;
65300121966SStefano Zampini       ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
654a49dc2a2SStefano Zampini       PetscStackCallBLAS("LAPACKhetrf",LAPACKhetrf_("L",&n,mat->v,&mat->lda,mat->pivots,&dummy,&mat->lfwork,&info));
65500121966SStefano Zampini       ierr = PetscFPTrapPop();CHKERRQ(ierr);
656a49dc2a2SStefano Zampini       mat->lfwork = (PetscInt)PetscRealPart(dummy);
657a49dc2a2SStefano Zampini       ierr = PetscMalloc1(mat->lfwork,&mat->fwork);CHKERRQ(ierr);
658a49dc2a2SStefano Zampini       ierr = PetscLogObjectMemory((PetscObject)A,mat->lfwork*sizeof(PetscBLASInt));CHKERRQ(ierr);
659a49dc2a2SStefano Zampini     }
66000121966SStefano Zampini     ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
661a49dc2a2SStefano Zampini     PetscStackCallBLAS("LAPACKhetrf",LAPACKhetrf_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&mat->lfwork,&info));
66200121966SStefano Zampini     ierr = PetscFPTrapPop();CHKERRQ(ierr);
663a49dc2a2SStefano Zampini #endif
664a49dc2a2SStefano Zampini   } else { /* symmetric case */
665a49dc2a2SStefano Zampini     if (!mat->pivots) {
666a49dc2a2SStefano Zampini       ierr = PetscMalloc1(A->rmap->n,&mat->pivots);CHKERRQ(ierr);
667a49dc2a2SStefano Zampini       ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr);
668a49dc2a2SStefano Zampini     }
669a49dc2a2SStefano Zampini     if (!mat->fwork) {
670a49dc2a2SStefano Zampini       PetscScalar dummy;
671a49dc2a2SStefano Zampini 
672a49dc2a2SStefano Zampini       mat->lfwork = -1;
67300121966SStefano Zampini       ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
674a49dc2a2SStefano Zampini       PetscStackCallBLAS("LAPACKsytrf",LAPACKsytrf_("L",&n,mat->v,&mat->lda,mat->pivots,&dummy,&mat->lfwork,&info));
67500121966SStefano Zampini       ierr = PetscFPTrapPop();CHKERRQ(ierr);
676a49dc2a2SStefano Zampini       mat->lfwork = (PetscInt)PetscRealPart(dummy);
677a49dc2a2SStefano Zampini       ierr = PetscMalloc1(mat->lfwork,&mat->fwork);CHKERRQ(ierr);
678a49dc2a2SStefano Zampini       ierr = PetscLogObjectMemory((PetscObject)A,mat->lfwork*sizeof(PetscBLASInt));CHKERRQ(ierr);
679a49dc2a2SStefano Zampini     }
68000121966SStefano Zampini     ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
681a49dc2a2SStefano Zampini     PetscStackCallBLAS("LAPACKsytrf",LAPACKsytrf_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&mat->lfwork,&info));
68200121966SStefano Zampini     ierr = PetscFPTrapPop();CHKERRQ(ierr);
683a49dc2a2SStefano Zampini   }
684e32f2f54SBarry Smith   if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1);
6858208b9aeSStefano Zampini 
686db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
6878208b9aeSStefano Zampini   A->ops->matsolve          = MatMatSolve_SeqDense;
688db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
689d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_CHOLESKY;
6902205254eSKarl Rupp 
691f6224b95SHong Zhang   ierr = PetscFree(A->solvertype);CHKERRQ(ierr);
692f6224b95SHong Zhang   ierr = PetscStrallocpy(MATSOLVERPETSC,&A->solvertype);CHKERRQ(ierr);
693f6224b95SHong Zhang 
694eb3f19e4SBarry Smith   ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr);
695db4efbfdSBarry Smith   PetscFunctionReturn(0);
696db4efbfdSBarry Smith }
697db4efbfdSBarry Smith 
6980481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
699db4efbfdSBarry Smith {
700db4efbfdSBarry Smith   PetscErrorCode ierr;
701db4efbfdSBarry Smith   MatFactorInfo  info;
702db4efbfdSBarry Smith 
703db4efbfdSBarry Smith   PetscFunctionBegin;
704db4efbfdSBarry Smith   info.fill = 1.0;
7052205254eSKarl Rupp 
706c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
707ca15aa20SStefano Zampini   ierr = (*fact->ops->choleskyfactor)(fact,0,&info);CHKERRQ(ierr);
708db4efbfdSBarry Smith   PetscFunctionReturn(0);
709db4efbfdSBarry Smith }
710db4efbfdSBarry Smith 
711ca15aa20SStefano Zampini PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info)
712db4efbfdSBarry Smith {
713db4efbfdSBarry Smith   PetscFunctionBegin;
714c3ef05f6SHong Zhang   fact->assembled                  = PETSC_TRUE;
7151bbcc794SSatish Balay   fact->preallocated               = PETSC_TRUE;
716719d5645SBarry Smith   fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense;
717bd443b22SStefano Zampini   fact->ops->solve                 = MatSolve_SeqDense;
718bd443b22SStefano Zampini   fact->ops->matsolve              = MatMatSolve_SeqDense;
719bd443b22SStefano Zampini   fact->ops->solvetranspose        = MatSolveTranspose_SeqDense;
720db4efbfdSBarry Smith   PetscFunctionReturn(0);
721db4efbfdSBarry Smith }
722db4efbfdSBarry Smith 
723ca15aa20SStefano Zampini PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info)
724db4efbfdSBarry Smith {
725db4efbfdSBarry Smith   PetscFunctionBegin;
726b66fe19dSMatthew G Knepley   fact->preallocated           = PETSC_TRUE;
727c3ef05f6SHong Zhang   fact->assembled              = PETSC_TRUE;
728719d5645SBarry Smith   fact->ops->lufactornumeric   = MatLUFactorNumeric_SeqDense;
729bd443b22SStefano Zampini   fact->ops->solve             = MatSolve_SeqDense;
730bd443b22SStefano Zampini   fact->ops->matsolve          = MatMatSolve_SeqDense;
731bd443b22SStefano Zampini   fact->ops->solvetranspose    = MatSolveTranspose_SeqDense;
732db4efbfdSBarry Smith   PetscFunctionReturn(0);
733db4efbfdSBarry Smith }
734db4efbfdSBarry Smith 
735ca15aa20SStefano Zampini /* uses LAPACK */
736cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact)
737db4efbfdSBarry Smith {
738db4efbfdSBarry Smith   PetscErrorCode ierr;
739db4efbfdSBarry Smith 
740db4efbfdSBarry Smith   PetscFunctionBegin;
741ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),fact);CHKERRQ(ierr);
742db4efbfdSBarry Smith   ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
743ca15aa20SStefano Zampini   ierr = MatSetType(*fact,MATDENSE);CHKERRQ(ierr);
744db4efbfdSBarry Smith   if (ftype == MAT_FACTOR_LU) {
745db4efbfdSBarry Smith     (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense;
746db4efbfdSBarry Smith   } else {
747db4efbfdSBarry Smith     (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense;
748db4efbfdSBarry Smith   }
749d5f3da31SBarry Smith   (*fact)->factortype = ftype;
75000c67f3bSHong Zhang 
75100c67f3bSHong Zhang   ierr = PetscFree((*fact)->solvertype);CHKERRQ(ierr);
75200c67f3bSHong Zhang   ierr = PetscStrallocpy(MATSOLVERPETSC,&(*fact)->solvertype);CHKERRQ(ierr);
753db4efbfdSBarry Smith   PetscFunctionReturn(0);
754db4efbfdSBarry Smith }
755db4efbfdSBarry Smith 
756289bc588SBarry Smith /* ------------------------------------------------------------------*/
757e0877f53SBarry Smith static PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx)
758289bc588SBarry Smith {
759c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
760d9ca1df4SBarry Smith   PetscScalar       *x,*v = mat->v,zero = 0.0,xt;
761d9ca1df4SBarry Smith   const PetscScalar *b;
762dfbe8321SBarry Smith   PetscErrorCode    ierr;
763d0f46423SBarry Smith   PetscInt          m = A->rmap->n,i;
764c5df96a5SBarry Smith   PetscBLASInt      o = 1,bm;
765289bc588SBarry Smith 
7663a40ed3dSBarry Smith   PetscFunctionBegin;
767ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA)
768c70f7ee4SJunchao Zhang   if (A->offloadmask == PETSC_OFFLOAD_GPU) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Not implemented");
769ca15aa20SStefano Zampini #endif
770422a814eSBarry Smith   if (shift == -1) shift = 0.0; /* negative shift indicates do not error on zero diagonal; this code never zeros on zero diagonal */
771c5df96a5SBarry Smith   ierr = PetscBLASIntCast(m,&bm);CHKERRQ(ierr);
772289bc588SBarry Smith   if (flag & SOR_ZERO_INITIAL_GUESS) {
7733bffc371SBarry Smith     /* this is a hack fix, should have another version without the second BLASdotu */
7742dcb1b2aSMatthew Knepley     ierr = VecSet(xx,zero);CHKERRQ(ierr);
775289bc588SBarry Smith   }
7761ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
777d9ca1df4SBarry Smith   ierr = VecGetArrayRead(bb,&b);CHKERRQ(ierr);
778b965ef7fSBarry Smith   its  = its*lits;
779e32f2f54SBarry 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);
780289bc588SBarry Smith   while (its--) {
781fccaa45eSBarry Smith     if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) {
782289bc588SBarry Smith       for (i=0; i<m; i++) {
7833bffc371SBarry Smith         PetscStackCallBLAS("BLASdotu",xt   = b[i] - BLASdotu_(&bm,v+i,&bm,x,&o));
78455a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
785289bc588SBarry Smith       }
786289bc588SBarry Smith     }
787fccaa45eSBarry Smith     if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) {
788289bc588SBarry Smith       for (i=m-1; i>=0; i--) {
7893bffc371SBarry Smith         PetscStackCallBLAS("BLASdotu",xt   = b[i] - BLASdotu_(&bm,v+i,&bm,x,&o));
79055a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
791289bc588SBarry Smith       }
792289bc588SBarry Smith     }
793289bc588SBarry Smith   }
794d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(bb,&b);CHKERRQ(ierr);
7951ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
7963a40ed3dSBarry Smith   PetscFunctionReturn(0);
797289bc588SBarry Smith }
798289bc588SBarry Smith 
799289bc588SBarry Smith /* -----------------------------------------------------------------*/
800ca15aa20SStefano Zampini PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy)
801289bc588SBarry Smith {
802c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
803d9ca1df4SBarry Smith   const PetscScalar *v   = mat->v,*x;
804d9ca1df4SBarry Smith   PetscScalar       *y;
805dfbe8321SBarry Smith   PetscErrorCode    ierr;
8060805154bSBarry Smith   PetscBLASInt      m, n,_One=1;
807ea709b57SSatish Balay   PetscScalar       _DOne=1.0,_DZero=0.0;
8083a40ed3dSBarry Smith 
8093a40ed3dSBarry Smith   PetscFunctionBegin;
810c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
811c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
812d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
8132bf066beSStefano Zampini   ierr = VecGetArrayWrite(yy,&y);CHKERRQ(ierr);
8145ac36cfcSBarry Smith   if (!A->rmap->n || !A->cmap->n) {
8155ac36cfcSBarry Smith     PetscBLASInt i;
8165ac36cfcSBarry Smith     for (i=0; i<n; i++) y[i] = 0.0;
8175ac36cfcSBarry Smith   } else {
8188b83055fSJed Brown     PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One));
8195ac36cfcSBarry Smith     ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
8205ac36cfcSBarry Smith   }
821d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
8222bf066beSStefano Zampini   ierr = VecRestoreArrayWrite(yy,&y);CHKERRQ(ierr);
8233a40ed3dSBarry Smith   PetscFunctionReturn(0);
824289bc588SBarry Smith }
825800995b7SMatthew Knepley 
826ca15aa20SStefano Zampini PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy)
827289bc588SBarry Smith {
828c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
829d9ca1df4SBarry Smith   PetscScalar       *y,_DOne=1.0,_DZero=0.0;
830dfbe8321SBarry Smith   PetscErrorCode    ierr;
8310805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
832d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
8333a40ed3dSBarry Smith 
8343a40ed3dSBarry Smith   PetscFunctionBegin;
835c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
836c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
837d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
8382bf066beSStefano Zampini   ierr = VecGetArrayWrite(yy,&y);CHKERRQ(ierr);
8395ac36cfcSBarry Smith   if (!A->rmap->n || !A->cmap->n) {
8405ac36cfcSBarry Smith     PetscBLASInt i;
8415ac36cfcSBarry Smith     for (i=0; i<m; i++) y[i] = 0.0;
8425ac36cfcSBarry Smith   } else {
8438b83055fSJed Brown     PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One));
8445ac36cfcSBarry Smith     ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr);
8455ac36cfcSBarry Smith   }
846d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
8472bf066beSStefano Zampini   ierr = VecRestoreArrayWrite(yy,&y);CHKERRQ(ierr);
8483a40ed3dSBarry Smith   PetscFunctionReturn(0);
849289bc588SBarry Smith }
8506ee01492SSatish Balay 
851ca15aa20SStefano Zampini PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
852289bc588SBarry Smith {
853c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
854d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
855d9ca1df4SBarry Smith   PetscScalar       *y,_DOne=1.0;
856dfbe8321SBarry Smith   PetscErrorCode    ierr;
8570805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
8583a40ed3dSBarry Smith 
8593a40ed3dSBarry Smith   PetscFunctionBegin;
860c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
861c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
862d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
863600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
864d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
8651ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
8668b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
867d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
8681ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
869dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
8703a40ed3dSBarry Smith   PetscFunctionReturn(0);
871289bc588SBarry Smith }
8726ee01492SSatish Balay 
873ca15aa20SStefano Zampini PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
874289bc588SBarry Smith {
875c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
876d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
877d9ca1df4SBarry Smith   PetscScalar       *y;
878dfbe8321SBarry Smith   PetscErrorCode    ierr;
8790805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
88087828ca2SBarry Smith   PetscScalar       _DOne=1.0;
8813a40ed3dSBarry Smith 
8823a40ed3dSBarry Smith   PetscFunctionBegin;
883c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
884c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
885d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
886600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
887d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
8881ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
8898b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
890d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
8911ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
892dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
8933a40ed3dSBarry Smith   PetscFunctionReturn(0);
894289bc588SBarry Smith }
895289bc588SBarry Smith 
896289bc588SBarry Smith /* -----------------------------------------------------------------*/
897e0877f53SBarry Smith static PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
898289bc588SBarry Smith {
899c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
9006849ba73SBarry Smith   PetscErrorCode ierr;
90113f74950SBarry Smith   PetscInt       i;
90267e560aaSBarry Smith 
9033a40ed3dSBarry Smith   PetscFunctionBegin;
904d0f46423SBarry Smith   *ncols = A->cmap->n;
905289bc588SBarry Smith   if (cols) {
906854ce69bSBarry Smith     ierr = PetscMalloc1(A->cmap->n+1,cols);CHKERRQ(ierr);
907d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) (*cols)[i] = i;
908289bc588SBarry Smith   }
909289bc588SBarry Smith   if (vals) {
910ca15aa20SStefano Zampini     const PetscScalar *v;
911ca15aa20SStefano Zampini 
912ca15aa20SStefano Zampini     ierr = MatDenseGetArrayRead(A,&v);CHKERRQ(ierr);
913854ce69bSBarry Smith     ierr = PetscMalloc1(A->cmap->n+1,vals);CHKERRQ(ierr);
914ca15aa20SStefano Zampini     v   += row;
915d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;}
916ca15aa20SStefano Zampini     ierr = MatDenseRestoreArrayRead(A,&v);CHKERRQ(ierr);
917289bc588SBarry Smith   }
9183a40ed3dSBarry Smith   PetscFunctionReturn(0);
919289bc588SBarry Smith }
9206ee01492SSatish Balay 
921e0877f53SBarry Smith static PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
922289bc588SBarry Smith {
923dfbe8321SBarry Smith   PetscErrorCode ierr;
9246e111a19SKarl Rupp 
925606d414cSSatish Balay   PetscFunctionBegin;
926606d414cSSatish Balay   if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);}
927606d414cSSatish Balay   if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); }
9283a40ed3dSBarry Smith   PetscFunctionReturn(0);
929289bc588SBarry Smith }
930289bc588SBarry Smith /* ----------------------------------------------------------------*/
931e0877f53SBarry Smith static PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv)
932289bc588SBarry Smith {
933c0bbcb79SLois Curfman McInnes   Mat_SeqDense     *mat = (Mat_SeqDense*)A->data;
934ca15aa20SStefano Zampini   PetscScalar      *av;
93513f74950SBarry Smith   PetscInt         i,j,idx=0;
936ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA)
937c70f7ee4SJunchao Zhang   PetscOffloadMask oldf;
938ca15aa20SStefano Zampini #endif
939ca15aa20SStefano Zampini   PetscErrorCode   ierr;
940d6dfbf8fSBarry Smith 
9413a40ed3dSBarry Smith   PetscFunctionBegin;
942ca15aa20SStefano Zampini   ierr = MatDenseGetArray(A,&av);CHKERRQ(ierr);
943289bc588SBarry Smith   if (!mat->roworiented) {
944dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
945289bc588SBarry Smith       for (j=0; j<n; j++) {
946cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
947cf9c20a2SJed Brown         if (PetscUnlikelyDebug(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);
948289bc588SBarry Smith         for (i=0; i<m; i++) {
949cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
950cf9c20a2SJed Brown           if (PetscUnlikelyDebug(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);
951ca15aa20SStefano Zampini           av[indexn[j]*mat->lda + indexm[i]] = v[idx++];
952289bc588SBarry Smith         }
953289bc588SBarry Smith       }
9543a40ed3dSBarry Smith     } else {
955289bc588SBarry Smith       for (j=0; j<n; j++) {
956cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
957cf9c20a2SJed Brown         if (PetscUnlikelyDebug(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);
958289bc588SBarry Smith         for (i=0; i<m; i++) {
959cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
960cf9c20a2SJed Brown           if (PetscUnlikelyDebug(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);
961ca15aa20SStefano Zampini           av[indexn[j]*mat->lda + indexm[i]] += v[idx++];
962289bc588SBarry Smith         }
963289bc588SBarry Smith       }
964289bc588SBarry Smith     }
9653a40ed3dSBarry Smith   } else {
966dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
967e8d4e0b9SBarry Smith       for (i=0; i<m; i++) {
968cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
969cf9c20a2SJed Brown         if (PetscUnlikelyDebug(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);
970e8d4e0b9SBarry Smith         for (j=0; j<n; j++) {
971cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
972cf9c20a2SJed Brown           if (PetscUnlikelyDebug(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);
973ca15aa20SStefano Zampini           av[indexn[j]*mat->lda + indexm[i]] = v[idx++];
974e8d4e0b9SBarry Smith         }
975e8d4e0b9SBarry Smith       }
9763a40ed3dSBarry Smith     } else {
977289bc588SBarry Smith       for (i=0; i<m; i++) {
978cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
979cf9c20a2SJed Brown         if (PetscUnlikelyDebug(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);
980289bc588SBarry Smith         for (j=0; j<n; j++) {
981cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
982cf9c20a2SJed Brown           if (PetscUnlikelyDebug(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);
983ca15aa20SStefano Zampini           av[indexn[j]*mat->lda + indexm[i]] += v[idx++];
984289bc588SBarry Smith         }
985289bc588SBarry Smith       }
986289bc588SBarry Smith     }
987e8d4e0b9SBarry Smith   }
988ca15aa20SStefano Zampini   /* hack to prevent unneeded copy to the GPU while returning the array */
989ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA)
990c70f7ee4SJunchao Zhang   oldf = A->offloadmask;
991c70f7ee4SJunchao Zhang   A->offloadmask = PETSC_OFFLOAD_GPU;
992ca15aa20SStefano Zampini #endif
993ca15aa20SStefano Zampini   ierr = MatDenseRestoreArray(A,&av);CHKERRQ(ierr);
994ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA)
995c70f7ee4SJunchao Zhang   A->offloadmask = (oldf == PETSC_OFFLOAD_UNALLOCATED ? PETSC_OFFLOAD_UNALLOCATED : PETSC_OFFLOAD_CPU);
996ca15aa20SStefano Zampini #endif
9973a40ed3dSBarry Smith   PetscFunctionReturn(0);
998289bc588SBarry Smith }
999e8d4e0b9SBarry Smith 
1000e0877f53SBarry Smith static PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[])
1001ae80bb75SLois Curfman McInnes {
1002ae80bb75SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
1003ca15aa20SStefano Zampini   const PetscScalar *vv;
100413f74950SBarry Smith   PetscInt          i,j;
1005ca15aa20SStefano Zampini   PetscErrorCode    ierr;
1006ae80bb75SLois Curfman McInnes 
10073a40ed3dSBarry Smith   PetscFunctionBegin;
1008ca15aa20SStefano Zampini   ierr = MatDenseGetArrayRead(A,&vv);CHKERRQ(ierr);
1009ae80bb75SLois Curfman McInnes   /* row-oriented output */
1010ae80bb75SLois Curfman McInnes   for (i=0; i<m; i++) {
101197e567efSBarry Smith     if (indexm[i] < 0) {v += n;continue;}
1012e32f2f54SBarry 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);
1013ae80bb75SLois Curfman McInnes     for (j=0; j<n; j++) {
10146f31f424SBarry Smith       if (indexn[j] < 0) {v++; continue;}
1015e32f2f54SBarry 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);
1016ca15aa20SStefano Zampini       *v++ = vv[indexn[j]*mat->lda + indexm[i]];
1017ae80bb75SLois Curfman McInnes     }
1018ae80bb75SLois Curfman McInnes   }
1019ca15aa20SStefano Zampini   ierr = MatDenseRestoreArrayRead(A,&vv);CHKERRQ(ierr);
10203a40ed3dSBarry Smith   PetscFunctionReturn(0);
1021ae80bb75SLois Curfman McInnes }
1022ae80bb75SLois Curfman McInnes 
1023289bc588SBarry Smith /* -----------------------------------------------------------------*/
1024289bc588SBarry Smith 
10258491ab44SLisandro Dalcin PetscErrorCode MatView_Dense_Binary(Mat mat,PetscViewer viewer)
1026aabbc4fbSShri Abhyankar {
1027aabbc4fbSShri Abhyankar   PetscErrorCode    ierr;
10288491ab44SLisandro Dalcin   PetscBool         skipHeader;
10298491ab44SLisandro Dalcin   PetscViewerFormat format;
10308491ab44SLisandro Dalcin   PetscInt          header[4],M,N,m,lda,i,j,k;
10318491ab44SLisandro Dalcin   const PetscScalar *v;
10328491ab44SLisandro Dalcin   PetscScalar       *vwork;
1033aabbc4fbSShri Abhyankar 
1034aabbc4fbSShri Abhyankar   PetscFunctionBegin;
10358491ab44SLisandro Dalcin   ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr);
10368491ab44SLisandro Dalcin   ierr = PetscViewerBinaryGetSkipHeader(viewer,&skipHeader);CHKERRQ(ierr);
10378491ab44SLisandro Dalcin   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
10388491ab44SLisandro Dalcin   if (skipHeader) format = PETSC_VIEWER_NATIVE;
1039aabbc4fbSShri Abhyankar 
10408491ab44SLisandro Dalcin   ierr = MatGetSize(mat,&M,&N);CHKERRQ(ierr);
10418491ab44SLisandro Dalcin 
10428491ab44SLisandro Dalcin   /* write matrix header */
10438491ab44SLisandro Dalcin   header[0] = MAT_FILE_CLASSID; header[1] = M; header[2] = N;
10448491ab44SLisandro Dalcin   header[3] = (format == PETSC_VIEWER_NATIVE) ? MATRIX_BINARY_FORMAT_DENSE : M*N;
10458491ab44SLisandro Dalcin   if (!skipHeader) {ierr = PetscViewerBinaryWrite(viewer,header,4,PETSC_INT);CHKERRQ(ierr);}
10468491ab44SLisandro Dalcin 
10478491ab44SLisandro Dalcin   ierr = MatGetLocalSize(mat,&m,NULL);CHKERRQ(ierr);
10488491ab44SLisandro Dalcin   if (format != PETSC_VIEWER_NATIVE) {
10498491ab44SLisandro Dalcin     PetscInt nnz = m*N, *iwork;
10508491ab44SLisandro Dalcin     /* store row lengths for each row */
10518491ab44SLisandro Dalcin     ierr = PetscMalloc1(nnz,&iwork);CHKERRQ(ierr);
10528491ab44SLisandro Dalcin     for (i=0; i<m; i++) iwork[i] = N;
10538491ab44SLisandro Dalcin     ierr = PetscViewerBinaryWriteAll(viewer,iwork,m,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_INT);CHKERRQ(ierr);
10548491ab44SLisandro Dalcin     /* store column indices (zero start index) */
10558491ab44SLisandro Dalcin     for (k=0, i=0; i<m; i++)
10568491ab44SLisandro Dalcin       for (j=0; j<N; j++, k++)
10578491ab44SLisandro Dalcin         iwork[k] = j;
10588491ab44SLisandro Dalcin     ierr = PetscViewerBinaryWriteAll(viewer,iwork,nnz,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_INT);CHKERRQ(ierr);
10598491ab44SLisandro Dalcin     ierr = PetscFree(iwork);CHKERRQ(ierr);
10608491ab44SLisandro Dalcin   }
10618491ab44SLisandro Dalcin   /* store matrix values as a dense matrix in row major order */
10628491ab44SLisandro Dalcin   ierr = PetscMalloc1(m*N,&vwork);CHKERRQ(ierr);
10638491ab44SLisandro Dalcin   ierr = MatDenseGetArrayRead(mat,&v);CHKERRQ(ierr);
10648491ab44SLisandro Dalcin   ierr = MatDenseGetLDA(mat,&lda);CHKERRQ(ierr);
10658491ab44SLisandro Dalcin   for (k=0, i=0; i<m; i++)
10668491ab44SLisandro Dalcin     for (j=0; j<N; j++, k++)
10678491ab44SLisandro Dalcin       vwork[k] = v[i+lda*j];
10688491ab44SLisandro Dalcin   ierr = MatDenseRestoreArrayRead(mat,&v);CHKERRQ(ierr);
10698491ab44SLisandro Dalcin   ierr = PetscViewerBinaryWriteAll(viewer,vwork,m*N,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_SCALAR);CHKERRQ(ierr);
10708491ab44SLisandro Dalcin   ierr = PetscFree(vwork);CHKERRQ(ierr);
10718491ab44SLisandro Dalcin   PetscFunctionReturn(0);
10728491ab44SLisandro Dalcin }
10738491ab44SLisandro Dalcin 
10748491ab44SLisandro Dalcin PetscErrorCode MatLoad_Dense_Binary(Mat mat,PetscViewer viewer)
10758491ab44SLisandro Dalcin {
10768491ab44SLisandro Dalcin   PetscErrorCode ierr;
10778491ab44SLisandro Dalcin   PetscBool      skipHeader;
10788491ab44SLisandro Dalcin   PetscInt       header[4],M,N,m,nz,lda,i,j,k;
10798491ab44SLisandro Dalcin   PetscInt       rows,cols;
10808491ab44SLisandro Dalcin   PetscScalar    *v,*vwork;
10818491ab44SLisandro Dalcin 
10828491ab44SLisandro Dalcin   PetscFunctionBegin;
10838491ab44SLisandro Dalcin   ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr);
10848491ab44SLisandro Dalcin   ierr = PetscViewerBinaryGetSkipHeader(viewer,&skipHeader);CHKERRQ(ierr);
10858491ab44SLisandro Dalcin 
10868491ab44SLisandro Dalcin   if (!skipHeader) {
10878491ab44SLisandro Dalcin     ierr = PetscViewerBinaryRead(viewer,header,4,NULL,PETSC_INT);CHKERRQ(ierr);
10888491ab44SLisandro Dalcin     if (header[0] != MAT_FILE_CLASSID) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"Not a matrix object in file");
10898491ab44SLisandro Dalcin     M = header[1]; N = header[2];
10908491ab44SLisandro Dalcin     if (M < 0) SETERRQ1(PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"Matrix row size (%D) in file is negative",M);
10918491ab44SLisandro Dalcin     if (N < 0) SETERRQ1(PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"Matrix column size (%D) in file is negative",N);
10928491ab44SLisandro Dalcin     nz = header[3];
10938491ab44SLisandro Dalcin     if (nz != MATRIX_BINARY_FORMAT_DENSE && nz < 0) SETERRQ1(PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"Unknown matrix format %D in file",nz);
1094aabbc4fbSShri Abhyankar   } else {
10958491ab44SLisandro Dalcin     ierr = MatGetSize(mat,&M,&N);CHKERRQ(ierr);
10968491ab44SLisandro Dalcin     if (M < 0 || N < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Matrix binary file header was skipped, thus the user must specify the global sizes of input matrix");
10978491ab44SLisandro Dalcin     nz = MATRIX_BINARY_FORMAT_DENSE;
1098e6324fbbSBarry Smith   }
1099aabbc4fbSShri Abhyankar 
11008491ab44SLisandro Dalcin   /* setup global sizes if not set */
11018491ab44SLisandro Dalcin   if (mat->rmap->N < 0) mat->rmap->N = M;
11028491ab44SLisandro Dalcin   if (mat->cmap->N < 0) mat->cmap->N = N;
11038491ab44SLisandro Dalcin   ierr = MatSetUp(mat);CHKERRQ(ierr);
11048491ab44SLisandro Dalcin   /* check if global sizes are correct */
11058491ab44SLisandro Dalcin   ierr = MatGetSize(mat,&rows,&cols);CHKERRQ(ierr);
11068491ab44SLisandro Dalcin   if (M != rows || N != cols) SETERRQ4(PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED, "Matrix in file of different sizes (%d, %d) than the input matrix (%d, %d)",M,N,rows,cols);
1107aabbc4fbSShri Abhyankar 
11088491ab44SLisandro Dalcin   ierr = MatGetSize(mat,NULL,&N);CHKERRQ(ierr);
11098491ab44SLisandro Dalcin   ierr = MatGetLocalSize(mat,&m,NULL);CHKERRQ(ierr);
11108491ab44SLisandro Dalcin   ierr = MatDenseGetArray(mat,&v);CHKERRQ(ierr);
11118491ab44SLisandro Dalcin   ierr = MatDenseGetLDA(mat,&lda);CHKERRQ(ierr);
11128491ab44SLisandro Dalcin   if (nz == MATRIX_BINARY_FORMAT_DENSE) {  /* matrix in file is dense format */
11138491ab44SLisandro Dalcin     PetscInt nnz = m*N;
11148491ab44SLisandro Dalcin     /* read in matrix values */
11158491ab44SLisandro Dalcin     ierr = PetscMalloc1(nnz,&vwork);CHKERRQ(ierr);
11168491ab44SLisandro Dalcin     ierr = PetscViewerBinaryReadAll(viewer,vwork,nnz,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_SCALAR);CHKERRQ(ierr);
11178491ab44SLisandro Dalcin     /* store values in column major order */
11188491ab44SLisandro Dalcin     for (j=0; j<N; j++)
11198491ab44SLisandro Dalcin       for (i=0; i<m; i++)
11208491ab44SLisandro Dalcin         v[i+lda*j] = vwork[i*N+j];
11218491ab44SLisandro Dalcin     ierr = PetscFree(vwork);CHKERRQ(ierr);
11228491ab44SLisandro Dalcin   } else { /* matrix in file is sparse format */
11238491ab44SLisandro Dalcin     PetscInt nnz = 0, *rlens, *icols;
11248491ab44SLisandro Dalcin     /* read in row lengths */
11258491ab44SLisandro Dalcin     ierr = PetscMalloc1(m,&rlens);CHKERRQ(ierr);
11268491ab44SLisandro Dalcin     ierr = PetscViewerBinaryReadAll(viewer,rlens,m,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_INT);CHKERRQ(ierr);
11278491ab44SLisandro Dalcin     for (i=0; i<m; i++) nnz += rlens[i];
11288491ab44SLisandro Dalcin     /* read in column indices and values */
11298491ab44SLisandro Dalcin     ierr = PetscMalloc2(nnz,&icols,nnz,&vwork);CHKERRQ(ierr);
11308491ab44SLisandro Dalcin     ierr = PetscViewerBinaryReadAll(viewer,icols,nnz,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_INT);CHKERRQ(ierr);
11318491ab44SLisandro Dalcin     ierr = PetscViewerBinaryReadAll(viewer,vwork,nnz,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_SCALAR);CHKERRQ(ierr);
11328491ab44SLisandro Dalcin     /* store values in column major order */
11338491ab44SLisandro Dalcin     for (k=0, i=0; i<m; i++)
11348491ab44SLisandro Dalcin       for (j=0; j<rlens[i]; j++, k++)
11358491ab44SLisandro Dalcin         v[i+lda*icols[k]] = vwork[k];
11368491ab44SLisandro Dalcin     ierr = PetscFree(rlens);CHKERRQ(ierr);
11378491ab44SLisandro Dalcin     ierr = PetscFree2(icols,vwork);CHKERRQ(ierr);
1138aabbc4fbSShri Abhyankar   }
11398491ab44SLisandro Dalcin   ierr = MatDenseRestoreArray(mat,&v);CHKERRQ(ierr);
11408491ab44SLisandro Dalcin   ierr = MatAssemblyBegin(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
11418491ab44SLisandro Dalcin   ierr = MatAssemblyEnd(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1142aabbc4fbSShri Abhyankar   PetscFunctionReturn(0);
1143aabbc4fbSShri Abhyankar }
1144aabbc4fbSShri Abhyankar 
1145eb91f321SVaclav Hapla PetscErrorCode MatLoad_SeqDense(Mat newMat, PetscViewer viewer)
1146eb91f321SVaclav Hapla {
1147eb91f321SVaclav Hapla   PetscBool      isbinary, ishdf5;
1148eb91f321SVaclav Hapla   PetscErrorCode ierr;
1149eb91f321SVaclav Hapla 
1150eb91f321SVaclav Hapla   PetscFunctionBegin;
1151eb91f321SVaclav Hapla   PetscValidHeaderSpecific(newMat,MAT_CLASSID,1);
1152eb91f321SVaclav Hapla   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
1153eb91f321SVaclav Hapla   /* force binary viewer to load .info file if it has not yet done so */
1154eb91f321SVaclav Hapla   ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr);
1155eb91f321SVaclav Hapla   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
1156eb91f321SVaclav Hapla   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERHDF5,  &ishdf5);CHKERRQ(ierr);
1157eb91f321SVaclav Hapla   if (isbinary) {
11588491ab44SLisandro Dalcin     ierr = MatLoad_Dense_Binary(newMat,viewer);CHKERRQ(ierr);
1159eb91f321SVaclav Hapla   } else if (ishdf5) {
1160eb91f321SVaclav Hapla #if defined(PETSC_HAVE_HDF5)
1161eb91f321SVaclav Hapla     ierr = MatLoad_Dense_HDF5(newMat,viewer);CHKERRQ(ierr);
1162eb91f321SVaclav Hapla #else
1163eb91f321SVaclav Hapla     SETERRQ(PetscObjectComm((PetscObject)newMat),PETSC_ERR_SUP,"HDF5 not supported in this build.\nPlease reconfigure using --download-hdf5");
1164eb91f321SVaclav Hapla #endif
1165eb91f321SVaclav Hapla   } else {
1166eb91f321SVaclav Hapla     SETERRQ2(PetscObjectComm((PetscObject)newMat),PETSC_ERR_SUP,"Viewer type %s not yet supported for reading %s matrices",((PetscObject)viewer)->type_name,((PetscObject)newMat)->type_name);
1167eb91f321SVaclav Hapla   }
1168eb91f321SVaclav Hapla   PetscFunctionReturn(0);
1169eb91f321SVaclav Hapla }
1170eb91f321SVaclav Hapla 
11716849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer)
1172289bc588SBarry Smith {
1173932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
1174dfbe8321SBarry Smith   PetscErrorCode    ierr;
117513f74950SBarry Smith   PetscInt          i,j;
11762dcb1b2aSMatthew Knepley   const char        *name;
1177ca15aa20SStefano Zampini   PetscScalar       *v,*av;
1178f3ef73ceSBarry Smith   PetscViewerFormat format;
11795f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX)
1180ace3abfcSBarry Smith   PetscBool         allreal = PETSC_TRUE;
11815f481a85SSatish Balay #endif
1182932b0c3eSLois Curfman McInnes 
11833a40ed3dSBarry Smith   PetscFunctionBegin;
1184ca15aa20SStefano Zampini   ierr = MatDenseGetArrayRead(A,(const PetscScalar**)&av);CHKERRQ(ierr);
1185b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1186456192e2SBarry Smith   if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
11873a40ed3dSBarry Smith     PetscFunctionReturn(0);  /* do nothing for now */
1188fb9695e5SSatish Balay   } else if (format == PETSC_VIEWER_ASCII_COMMON) {
1189d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
1190d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
1191ca15aa20SStefano Zampini       v    = av + i;
119277431f27SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr);
1193d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1194aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
1195329f5518SBarry Smith         if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) {
119657622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g + %g i) ",j,(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr);
1197329f5518SBarry Smith         } else if (PetscRealPart(*v)) {
119857622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)PetscRealPart(*v));CHKERRQ(ierr);
11996831982aSBarry Smith         }
120080cd9d93SLois Curfman McInnes #else
12016831982aSBarry Smith         if (*v) {
120257622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)*v);CHKERRQ(ierr);
12036831982aSBarry Smith         }
120480cd9d93SLois Curfman McInnes #endif
12051b807ce4Svictorle         v += a->lda;
120680cd9d93SLois Curfman McInnes       }
1207b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
120880cd9d93SLois Curfman McInnes     }
1209d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
12103a40ed3dSBarry Smith   } else {
1211d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
1212aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
121347989497SBarry Smith     /* determine if matrix has all real values */
1214ca15aa20SStefano Zampini     v = av;
1215d0f46423SBarry Smith     for (i=0; i<A->rmap->n*A->cmap->n; i++) {
1216ffac6cdbSBarry Smith       if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break;}
121747989497SBarry Smith     }
121847989497SBarry Smith #endif
1219fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
12203a7fca6bSBarry Smith       ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr);
1221d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr);
1222d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
1223fb9695e5SSatish Balay       ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr);
1224ffac6cdbSBarry Smith     }
1225ffac6cdbSBarry Smith 
1226d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
1227ca15aa20SStefano Zampini       v = av + i;
1228d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1229aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
123047989497SBarry Smith         if (allreal) {
1231c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr);
123247989497SBarry Smith         } else {
1233c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr);
123447989497SBarry Smith         }
1235289bc588SBarry Smith #else
1236c61cd2faSJed Brown         ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr);
1237289bc588SBarry Smith #endif
12381b807ce4Svictorle         v += a->lda;
1239289bc588SBarry Smith       }
1240b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
1241289bc588SBarry Smith     }
1242fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
1243b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr);
1244ffac6cdbSBarry Smith     }
1245d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
1246da3a660dSBarry Smith   }
1247ca15aa20SStefano Zampini   ierr = MatDenseRestoreArrayRead(A,(const PetscScalar**)&av);CHKERRQ(ierr);
1248b0a32e0cSBarry Smith   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
12493a40ed3dSBarry Smith   PetscFunctionReturn(0);
1250289bc588SBarry Smith }
1251289bc588SBarry Smith 
12529804daf3SBarry Smith #include <petscdraw.h>
1253e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa)
1254f1af5d2fSBarry Smith {
1255f1af5d2fSBarry Smith   Mat               A  = (Mat) Aa;
12566849ba73SBarry Smith   PetscErrorCode    ierr;
1257383922c3SLisandro Dalcin   PetscInt          m  = A->rmap->n,n = A->cmap->n,i,j;
1258383922c3SLisandro Dalcin   int               color = PETSC_DRAW_WHITE;
1259ca15aa20SStefano Zampini   const PetscScalar *v;
1260b0a32e0cSBarry Smith   PetscViewer       viewer;
1261b05fc000SLisandro Dalcin   PetscReal         xl,yl,xr,yr,x_l,x_r,y_l,y_r;
1262f3ef73ceSBarry Smith   PetscViewerFormat format;
1263f1af5d2fSBarry Smith 
1264f1af5d2fSBarry Smith   PetscFunctionBegin;
1265f1af5d2fSBarry Smith   ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr);
1266b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1267b0a32e0cSBarry Smith   ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr);
1268f1af5d2fSBarry Smith 
1269f1af5d2fSBarry Smith   /* Loop over matrix elements drawing boxes */
1270ca15aa20SStefano Zampini   ierr = MatDenseGetArrayRead(A,&v);CHKERRQ(ierr);
1271fb9695e5SSatish Balay   if (format != PETSC_VIEWER_DRAW_CONTOUR) {
1272383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
1273f1af5d2fSBarry Smith     /* Blue for negative and Red for positive */
1274f1af5d2fSBarry Smith     for (j = 0; j < n; j++) {
1275383922c3SLisandro Dalcin       x_l = j; x_r = x_l + 1.0;
1276f1af5d2fSBarry Smith       for (i = 0; i < m; i++) {
1277f1af5d2fSBarry Smith         y_l = m - i - 1.0;
1278f1af5d2fSBarry Smith         y_r = y_l + 1.0;
1279ca15aa20SStefano Zampini         if (PetscRealPart(v[j*m+i]) >  0.) color = PETSC_DRAW_RED;
1280ca15aa20SStefano Zampini         else if (PetscRealPart(v[j*m+i]) <  0.) color = PETSC_DRAW_BLUE;
1281ca15aa20SStefano Zampini         else continue;
1282b0a32e0cSBarry Smith         ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1283f1af5d2fSBarry Smith       }
1284f1af5d2fSBarry Smith     }
1285383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
1286f1af5d2fSBarry Smith   } else {
1287f1af5d2fSBarry Smith     /* use contour shading to indicate magnitude of values */
1288f1af5d2fSBarry Smith     /* first determine max of all nonzero values */
1289b05fc000SLisandro Dalcin     PetscReal minv = 0.0, maxv = 0.0;
1290b05fc000SLisandro Dalcin     PetscDraw popup;
1291b05fc000SLisandro Dalcin 
1292f1af5d2fSBarry Smith     for (i=0; i < m*n; i++) {
1293f1af5d2fSBarry Smith       if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]);
1294f1af5d2fSBarry Smith     }
1295383922c3SLisandro Dalcin     if (minv >= maxv) maxv = minv + PETSC_SMALL;
1296b0a32e0cSBarry Smith     ierr = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr);
129745f3bb6eSLisandro Dalcin     ierr = PetscDrawScalePopup(popup,minv,maxv);CHKERRQ(ierr);
1298383922c3SLisandro Dalcin 
1299383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
1300f1af5d2fSBarry Smith     for (j=0; j<n; j++) {
1301f1af5d2fSBarry Smith       x_l = j;
1302f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1303f1af5d2fSBarry Smith       for (i=0; i<m; i++) {
1304f1af5d2fSBarry Smith         y_l   = m - i - 1.0;
1305f1af5d2fSBarry Smith         y_r   = y_l + 1.0;
1306b05fc000SLisandro Dalcin         color = PetscDrawRealToColor(PetscAbsScalar(v[j*m+i]),minv,maxv);
1307b0a32e0cSBarry Smith         ierr  = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1308f1af5d2fSBarry Smith       }
1309f1af5d2fSBarry Smith     }
1310383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
1311f1af5d2fSBarry Smith   }
1312ca15aa20SStefano Zampini   ierr = MatDenseRestoreArrayRead(A,&v);CHKERRQ(ierr);
1313f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1314f1af5d2fSBarry Smith }
1315f1af5d2fSBarry Smith 
1316e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer)
1317f1af5d2fSBarry Smith {
1318b0a32e0cSBarry Smith   PetscDraw      draw;
1319ace3abfcSBarry Smith   PetscBool      isnull;
1320329f5518SBarry Smith   PetscReal      xr,yr,xl,yl,h,w;
1321dfbe8321SBarry Smith   PetscErrorCode ierr;
1322f1af5d2fSBarry Smith 
1323f1af5d2fSBarry Smith   PetscFunctionBegin;
1324b0a32e0cSBarry Smith   ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
1325b0a32e0cSBarry Smith   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
1326abc0a331SBarry Smith   if (isnull) PetscFunctionReturn(0);
1327f1af5d2fSBarry Smith 
1328d0f46423SBarry Smith   xr   = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0;
1329f1af5d2fSBarry Smith   xr  += w;          yr += h;        xl = -w;     yl = -h;
1330b0a32e0cSBarry Smith   ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr);
1331832b7cebSLisandro Dalcin   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr);
1332b0a32e0cSBarry Smith   ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr);
13330298fd71SBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr);
1334832b7cebSLisandro Dalcin   ierr = PetscDrawSave(draw);CHKERRQ(ierr);
1335f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1336f1af5d2fSBarry Smith }
1337f1af5d2fSBarry Smith 
1338dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer)
1339932b0c3eSLois Curfman McInnes {
1340dfbe8321SBarry Smith   PetscErrorCode ierr;
1341ace3abfcSBarry Smith   PetscBool      iascii,isbinary,isdraw;
1342932b0c3eSLois Curfman McInnes 
13433a40ed3dSBarry Smith   PetscFunctionBegin;
1344251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
1345251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
1346251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
13470f5bd95cSBarry Smith 
1348c45a1595SBarry Smith   if (iascii) {
1349c45a1595SBarry Smith     ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr);
13500f5bd95cSBarry Smith   } else if (isbinary) {
1351637a0070SStefano Zampini     ierr = MatView_Dense_Binary(A,viewer);CHKERRQ(ierr);
1352f1af5d2fSBarry Smith   } else if (isdraw) {
1353f1af5d2fSBarry Smith     ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr);
1354932b0c3eSLois Curfman McInnes   }
13553a40ed3dSBarry Smith   PetscFunctionReturn(0);
1356932b0c3eSLois Curfman McInnes }
1357289bc588SBarry Smith 
1358637a0070SStefano Zampini static PetscErrorCode MatDensePlaceArray_SeqDense(Mat A,const PetscScalar *array)
1359d3042a70SBarry Smith {
1360d3042a70SBarry Smith   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1361d3042a70SBarry Smith 
1362d3042a70SBarry Smith   PetscFunctionBegin;
13636947451fSStefano Zampini   if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec first");
1364*d5ea218eSStefano Zampini   if (a->unplacedarray) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreArray first");
1365d3042a70SBarry Smith   a->unplacedarray       = a->v;
1366d3042a70SBarry Smith   a->unplaced_user_alloc = a->user_alloc;
1367d3042a70SBarry Smith   a->v                   = (PetscScalar*) array;
1368637a0070SStefano Zampini   a->user_alloc          = PETSC_TRUE;
1369ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA)
1370c70f7ee4SJunchao Zhang   A->offloadmask = PETSC_OFFLOAD_CPU;
1371ca15aa20SStefano Zampini #endif
1372d3042a70SBarry Smith   PetscFunctionReturn(0);
1373d3042a70SBarry Smith }
1374d3042a70SBarry Smith 
1375d3042a70SBarry Smith static PetscErrorCode MatDenseResetArray_SeqDense(Mat A)
1376d3042a70SBarry Smith {
1377d3042a70SBarry Smith   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1378d3042a70SBarry Smith 
1379d3042a70SBarry Smith   PetscFunctionBegin;
13806947451fSStefano Zampini   if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec first");
1381d3042a70SBarry Smith   a->v             = a->unplacedarray;
1382d3042a70SBarry Smith   a->user_alloc    = a->unplaced_user_alloc;
1383d3042a70SBarry Smith   a->unplacedarray = NULL;
1384ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA)
1385c70f7ee4SJunchao Zhang   A->offloadmask = PETSC_OFFLOAD_CPU;
1386ca15aa20SStefano Zampini #endif
1387d3042a70SBarry Smith   PetscFunctionReturn(0);
1388d3042a70SBarry Smith }
1389d3042a70SBarry Smith 
1390*d5ea218eSStefano Zampini static PetscErrorCode MatDenseReplaceArray_SeqDense(Mat A,const PetscScalar *array)
1391*d5ea218eSStefano Zampini {
1392*d5ea218eSStefano Zampini   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1393*d5ea218eSStefano Zampini   PetscErrorCode ierr;
1394*d5ea218eSStefano Zampini 
1395*d5ea218eSStefano Zampini   PetscFunctionBegin;
1396*d5ea218eSStefano Zampini   if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec first");
1397*d5ea218eSStefano Zampini   if (!a->user_alloc) { ierr = PetscFree(a->v);CHKERRQ(ierr); }
1398*d5ea218eSStefano Zampini   a->v           = (PetscScalar*) array;
1399*d5ea218eSStefano Zampini   a->user_alloc  = PETSC_FALSE;
1400*d5ea218eSStefano Zampini #if defined(PETSC_HAVE_CUDA)
1401*d5ea218eSStefano Zampini   A->offloadmask = PETSC_OFFLOAD_CPU;
1402*d5ea218eSStefano Zampini #endif
1403*d5ea218eSStefano Zampini   PetscFunctionReturn(0);
1404*d5ea218eSStefano Zampini }
1405*d5ea218eSStefano Zampini 
1406ca15aa20SStefano Zampini PetscErrorCode MatDestroy_SeqDense(Mat mat)
1407289bc588SBarry Smith {
1408ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)mat->data;
1409dfbe8321SBarry Smith   PetscErrorCode ierr;
141090f02eecSBarry Smith 
14113a40ed3dSBarry Smith   PetscFunctionBegin;
1412aa482453SBarry Smith #if defined(PETSC_USE_LOG)
1413d0f46423SBarry Smith   PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n);
1414a5a9c739SBarry Smith #endif
141505b42c5fSBarry Smith   ierr = PetscFree(l->pivots);CHKERRQ(ierr);
1416a49dc2a2SStefano Zampini   ierr = PetscFree(l->fwork);CHKERRQ(ierr);
1417abc3b08eSStefano Zampini   ierr = MatDestroy(&l->ptapwork);CHKERRQ(ierr);
14186857c123SSatish Balay   if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);}
1419637a0070SStefano Zampini   if (!l->unplaced_user_alloc) {ierr = PetscFree(l->unplacedarray);CHKERRQ(ierr);}
14206947451fSStefano Zampini   ierr = VecDestroy(&l->cvec);CHKERRQ(ierr);
1421bf0cc555SLisandro Dalcin   ierr = PetscFree(mat->data);CHKERRQ(ierr);
1422dbd8c25aSHong Zhang 
1423dbd8c25aSHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr);
142449a6ff4bSBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetLDA_C",NULL);CHKERRQ(ierr);
1425bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL);CHKERRQ(ierr);
142652c5f739Sprj-   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL);CHKERRQ(ierr);
1427d3042a70SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDensePlaceArray_C",NULL);CHKERRQ(ierr);
1428d3042a70SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseResetArray_C",NULL);CHKERRQ(ierr);
1429*d5ea218eSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseReplaceArray_C",NULL);CHKERRQ(ierr);
143052c5f739Sprj-   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArrayRead_C",NULL);CHKERRQ(ierr);
143152c5f739Sprj-   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArrayRead_C",NULL);CHKERRQ(ierr);
14326947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArrayWrite_C",NULL);CHKERRQ(ierr);
14336947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArrayWrite_C",NULL);CHKERRQ(ierr);
14348baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL);CHKERRQ(ierr);
14358baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
14368baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL);CHKERRQ(ierr);
14378baccfbdSHong Zhang #endif
14382bf066beSStefano Zampini #if defined(PETSC_HAVE_CUDA)
14392bf066beSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqdensecuda_C",NULL);CHKERRQ(ierr);
14404222ddf1SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqdensecuda_seqdensecuda_C",NULL);CHKERRQ(ierr);
14414222ddf1SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqdensecuda_seqdense_C",NULL);CHKERRQ(ierr);
14424222ddf1SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqaijcusparse_seqdense_C",NULL);CHKERRQ(ierr);
14432bf066beSStefano Zampini #endif
1444bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL);CHKERRQ(ierr);
14454222ddf1SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
14464222ddf1SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqdense_seqdense_C",NULL);CHKERRQ(ierr);
1447bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1448bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
14494222ddf1SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqbaij_seqdense_C",NULL);CHKERRQ(ierr);
1450a001520aSPierre Jolivet   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqbaij_seqdense_C",NULL);CHKERRQ(ierr);
1451a001520aSPierre Jolivet   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqbaij_seqdense_C",NULL);CHKERRQ(ierr);
14524222ddf1SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqsbaij_seqdense_C",NULL);CHKERRQ(ierr);
1453c2916339SPierre Jolivet   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqsbaij_seqdense_C",NULL);CHKERRQ(ierr);
1454c2916339SPierre Jolivet   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqsbaij_seqdense_C",NULL);CHKERRQ(ierr);
145552c5f739Sprj-   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaijperm_seqdense_C",NULL);CHKERRQ(ierr);
145652c5f739Sprj-   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaijperm_seqdense_C",NULL);CHKERRQ(ierr);
145752c5f739Sprj-   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaijsell_seqdense_C",NULL);CHKERRQ(ierr);
145852c5f739Sprj-   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaijsell_seqdense_C",NULL);CHKERRQ(ierr);
145952c5f739Sprj-   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaijmkl_seqdense_C",NULL);CHKERRQ(ierr);
146052c5f739Sprj-   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaijmkl_seqdense_C",NULL);CHKERRQ(ierr);
146152c5f739Sprj-   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_nest_seqdense_C",NULL);CHKERRQ(ierr);
146252c5f739Sprj-   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_nest_seqdense_C",NULL);CHKERRQ(ierr);
146352c5f739Sprj- 
14643bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
14653bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
146652c5f739Sprj-   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaijperm_seqdense_C",NULL);CHKERRQ(ierr);
146752c5f739Sprj-   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaijperm_seqdense_C",NULL);CHKERRQ(ierr);
146852c5f739Sprj-   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaijsell_seqdense_C",NULL);CHKERRQ(ierr);
146952c5f739Sprj-   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaijsell_seqdense_C",NULL);CHKERRQ(ierr);
147052c5f739Sprj-   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaijmkl_seqdense_C",NULL);CHKERRQ(ierr);
147152c5f739Sprj-   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaijmkl_seqdense_C",NULL);CHKERRQ(ierr);
147286aefd0dSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumn_C",NULL);CHKERRQ(ierr);
147386aefd0dSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumn_C",NULL);CHKERRQ(ierr);
14746947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumnVec_C",NULL);CHKERRQ(ierr);
14756947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumnVec_C",NULL);CHKERRQ(ierr);
14766947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumnVecRead_C",NULL);CHKERRQ(ierr);
14776947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumnVecRead_C",NULL);CHKERRQ(ierr);
14786947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumnVecWrite_C",NULL);CHKERRQ(ierr);
14796947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumnVecWrite_C",NULL);CHKERRQ(ierr);
14803a40ed3dSBarry Smith   PetscFunctionReturn(0);
1481289bc588SBarry Smith }
1482289bc588SBarry Smith 
1483e0877f53SBarry Smith static PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout)
1484289bc588SBarry Smith {
1485c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
14866849ba73SBarry Smith   PetscErrorCode ierr;
148713f74950SBarry Smith   PetscInt       k,j,m,n,M;
148887828ca2SBarry Smith   PetscScalar    *v,tmp;
148948b35521SBarry Smith 
14903a40ed3dSBarry Smith   PetscFunctionBegin;
1491ca15aa20SStefano Zampini   m = A->rmap->n; M = mat->lda; n = A->cmap->n;
14922847e3fdSStefano Zampini   if (reuse == MAT_INPLACE_MATRIX && m == n) { /* in place transpose */
1493ca15aa20SStefano Zampini     ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr);
1494d3e5ee88SLois Curfman McInnes     for (j=0; j<m; j++) {
1495289bc588SBarry Smith       for (k=0; k<j; k++) {
14961b807ce4Svictorle         tmp        = v[j + k*M];
14971b807ce4Svictorle         v[j + k*M] = v[k + j*M];
14981b807ce4Svictorle         v[k + j*M] = tmp;
1499289bc588SBarry Smith       }
1500289bc588SBarry Smith     }
1501ca15aa20SStefano Zampini     ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr);
15023a40ed3dSBarry Smith   } else { /* out-of-place transpose */
1503d3e5ee88SLois Curfman McInnes     Mat          tmat;
1504ec8511deSBarry Smith     Mat_SeqDense *tmatd;
150587828ca2SBarry Smith     PetscScalar  *v2;
1506af36a384SStefano Zampini     PetscInt     M2;
1507ea709b57SSatish Balay 
15082847e3fdSStefano Zampini     if (reuse != MAT_REUSE_MATRIX) {
1509ce94432eSBarry Smith       ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr);
1510d0f46423SBarry Smith       ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr);
15117adad957SLisandro Dalcin       ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
15120298fd71SBarry Smith       ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr);
1513ca15aa20SStefano Zampini     } else tmat = *matout;
1514ca15aa20SStefano Zampini 
1515ca15aa20SStefano Zampini     ierr  = MatDenseGetArrayRead(A,(const PetscScalar**)&v);CHKERRQ(ierr);
1516ca15aa20SStefano Zampini     ierr  = MatDenseGetArray(tmat,&v2);CHKERRQ(ierr);
1517ec8511deSBarry Smith     tmatd = (Mat_SeqDense*)tmat->data;
1518ca15aa20SStefano Zampini     M2    = tmatd->lda;
1519d3e5ee88SLois Curfman McInnes     for (j=0; j<n; j++) {
1520af36a384SStefano Zampini       for (k=0; k<m; k++) v2[j + k*M2] = v[k + j*M];
1521d3e5ee88SLois Curfman McInnes     }
1522ca15aa20SStefano Zampini     ierr = MatDenseRestoreArray(tmat,&v2);CHKERRQ(ierr);
1523ca15aa20SStefano Zampini     ierr = MatDenseRestoreArrayRead(A,(const PetscScalar**)&v);CHKERRQ(ierr);
15246d4a8577SBarry Smith     ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
15256d4a8577SBarry Smith     ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
15262847e3fdSStefano Zampini     if (reuse == MAT_INITIAL_MATRIX || reuse == MAT_REUSE_MATRIX) *matout = tmat;
15272847e3fdSStefano Zampini     else {
15282847e3fdSStefano Zampini       ierr = MatHeaderMerge(A,&tmat);CHKERRQ(ierr);
15292847e3fdSStefano Zampini     }
153048b35521SBarry Smith   }
15313a40ed3dSBarry Smith   PetscFunctionReturn(0);
1532289bc588SBarry Smith }
1533289bc588SBarry Smith 
1534e0877f53SBarry Smith static PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool  *flg)
1535289bc588SBarry Smith {
1536c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat1 = (Mat_SeqDense*)A1->data;
1537c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat2 = (Mat_SeqDense*)A2->data;
1538ca15aa20SStefano Zampini   PetscInt          i;
1539ca15aa20SStefano Zampini   const PetscScalar *v1,*v2;
1540ca15aa20SStefano Zampini   PetscErrorCode    ierr;
15419ea5d5aeSSatish Balay 
15423a40ed3dSBarry Smith   PetscFunctionBegin;
1543d0f46423SBarry Smith   if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1544d0f46423SBarry Smith   if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1545ca15aa20SStefano Zampini   ierr = MatDenseGetArrayRead(A1,&v1);CHKERRQ(ierr);
1546ca15aa20SStefano Zampini   ierr = MatDenseGetArrayRead(A2,&v2);CHKERRQ(ierr);
1547ca15aa20SStefano Zampini   for (i=0; i<A1->cmap->n; i++) {
1548ca15aa20SStefano Zampini     ierr = PetscArraycmp(v1,v2,A1->rmap->n,flg);CHKERRQ(ierr);
1549ca15aa20SStefano Zampini     if (*flg == PETSC_FALSE) PetscFunctionReturn(0);
1550ca15aa20SStefano Zampini     v1 += mat1->lda;
1551ca15aa20SStefano Zampini     v2 += mat2->lda;
15521b807ce4Svictorle   }
1553ca15aa20SStefano Zampini   ierr = MatDenseRestoreArrayRead(A1,&v1);CHKERRQ(ierr);
1554ca15aa20SStefano Zampini   ierr = MatDenseRestoreArrayRead(A2,&v2);CHKERRQ(ierr);
155577c4ece6SBarry Smith   *flg = PETSC_TRUE;
15563a40ed3dSBarry Smith   PetscFunctionReturn(0);
1557289bc588SBarry Smith }
1558289bc588SBarry Smith 
1559e0877f53SBarry Smith static PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v)
1560289bc588SBarry Smith {
1561c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
156213f74950SBarry Smith   PetscInt          i,n,len;
1563ca15aa20SStefano Zampini   PetscScalar       *x;
1564ca15aa20SStefano Zampini   const PetscScalar *vv;
1565ca15aa20SStefano Zampini   PetscErrorCode    ierr;
156644cd7ae7SLois Curfman McInnes 
15673a40ed3dSBarry Smith   PetscFunctionBegin;
15687a97a34bSBarry Smith   ierr = VecGetSize(v,&n);CHKERRQ(ierr);
15691ebc52fbSHong Zhang   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1570d0f46423SBarry Smith   len  = PetscMin(A->rmap->n,A->cmap->n);
1571ca15aa20SStefano Zampini   ierr = MatDenseGetArrayRead(A,&vv);CHKERRQ(ierr);
1572e32f2f54SBarry Smith   if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec");
157344cd7ae7SLois Curfman McInnes   for (i=0; i<len; i++) {
1574ca15aa20SStefano Zampini     x[i] = vv[i*mat->lda + i];
1575289bc588SBarry Smith   }
1576ca15aa20SStefano Zampini   ierr = MatDenseRestoreArrayRead(A,&vv);CHKERRQ(ierr);
15771ebc52fbSHong Zhang   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
15783a40ed3dSBarry Smith   PetscFunctionReturn(0);
1579289bc588SBarry Smith }
1580289bc588SBarry Smith 
1581e0877f53SBarry Smith static PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr)
1582289bc588SBarry Smith {
1583c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
1584f1ceaac6SMatthew G. Knepley   const PetscScalar *l,*r;
1585ca15aa20SStefano Zampini   PetscScalar       x,*v,*vv;
1586dfbe8321SBarry Smith   PetscErrorCode    ierr;
1587d0f46423SBarry Smith   PetscInt          i,j,m = A->rmap->n,n = A->cmap->n;
158855659b69SBarry Smith 
15893a40ed3dSBarry Smith   PetscFunctionBegin;
1590ca15aa20SStefano Zampini   ierr = MatDenseGetArray(A,&vv);CHKERRQ(ierr);
159128988994SBarry Smith   if (ll) {
15927a97a34bSBarry Smith     ierr = VecGetSize(ll,&m);CHKERRQ(ierr);
1593f1ceaac6SMatthew G. Knepley     ierr = VecGetArrayRead(ll,&l);CHKERRQ(ierr);
1594e32f2f54SBarry Smith     if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size");
1595da3a660dSBarry Smith     for (i=0; i<m; i++) {
1596da3a660dSBarry Smith       x = l[i];
1597ca15aa20SStefano Zampini       v = vv + i;
1598b43bac26SStefano Zampini       for (j=0; j<n; j++) { (*v) *= x; v+= mat->lda;}
1599da3a660dSBarry Smith     }
1600f1ceaac6SMatthew G. Knepley     ierr = VecRestoreArrayRead(ll,&l);CHKERRQ(ierr);
1601eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr);
1602da3a660dSBarry Smith   }
160328988994SBarry Smith   if (rr) {
16047a97a34bSBarry Smith     ierr = VecGetSize(rr,&n);CHKERRQ(ierr);
1605f1ceaac6SMatthew G. Knepley     ierr = VecGetArrayRead(rr,&r);CHKERRQ(ierr);
1606e32f2f54SBarry Smith     if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size");
1607da3a660dSBarry Smith     for (i=0; i<n; i++) {
1608da3a660dSBarry Smith       x = r[i];
1609ca15aa20SStefano Zampini       v = vv + i*mat->lda;
16102205254eSKarl Rupp       for (j=0; j<m; j++) (*v++) *= x;
1611da3a660dSBarry Smith     }
1612f1ceaac6SMatthew G. Knepley     ierr = VecRestoreArrayRead(rr,&r);CHKERRQ(ierr);
1613eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr);
1614da3a660dSBarry Smith   }
1615ca15aa20SStefano Zampini   ierr = MatDenseRestoreArray(A,&vv);CHKERRQ(ierr);
16163a40ed3dSBarry Smith   PetscFunctionReturn(0);
1617289bc588SBarry Smith }
1618289bc588SBarry Smith 
1619ca15aa20SStefano Zampini PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm)
1620289bc588SBarry Smith {
1621c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
1622ca15aa20SStefano Zampini   PetscScalar       *v,*vv;
1623329f5518SBarry Smith   PetscReal         sum  = 0.0;
1624d0f46423SBarry Smith   PetscInt          lda  =mat->lda,m=A->rmap->n,i,j;
1625efee365bSSatish Balay   PetscErrorCode    ierr;
162655659b69SBarry Smith 
16273a40ed3dSBarry Smith   PetscFunctionBegin;
1628ca15aa20SStefano Zampini   ierr = MatDenseGetArrayRead(A,(const PetscScalar**)&vv);CHKERRQ(ierr);
1629ca15aa20SStefano Zampini   v    = vv;
1630289bc588SBarry Smith   if (type == NORM_FROBENIUS) {
1631a5ce6ee0Svictorle     if (lda>m) {
1632d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1633ca15aa20SStefano Zampini         v = vv+j*lda;
1634a5ce6ee0Svictorle         for (i=0; i<m; i++) {
1635a5ce6ee0Svictorle           sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1636a5ce6ee0Svictorle         }
1637a5ce6ee0Svictorle       }
1638a5ce6ee0Svictorle     } else {
1639570b7f6dSBarry Smith #if defined(PETSC_USE_REAL___FP16)
1640570b7f6dSBarry Smith       PetscBLASInt one = 1,cnt = A->cmap->n*A->rmap->n;
1641570b7f6dSBarry Smith       *nrm = BLASnrm2_(&cnt,v,&one);
1642570b7f6dSBarry Smith     }
1643570b7f6dSBarry Smith #else
1644d0f46423SBarry Smith       for (i=0; i<A->cmap->n*A->rmap->n; i++) {
1645329f5518SBarry Smith         sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1646289bc588SBarry Smith       }
1647a5ce6ee0Svictorle     }
16488f1a2a5eSBarry Smith     *nrm = PetscSqrtReal(sum);
1649570b7f6dSBarry Smith #endif
1650dc0b31edSSatish Balay     ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
16513a40ed3dSBarry Smith   } else if (type == NORM_1) {
1652064f8208SBarry Smith     *nrm = 0.0;
1653d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1654ca15aa20SStefano Zampini       v   = vv + j*mat->lda;
1655289bc588SBarry Smith       sum = 0.0;
1656d0f46423SBarry Smith       for (i=0; i<A->rmap->n; i++) {
165733a8263dSBarry Smith         sum += PetscAbsScalar(*v);  v++;
1658289bc588SBarry Smith       }
1659064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1660289bc588SBarry Smith     }
1661eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
16623a40ed3dSBarry Smith   } else if (type == NORM_INFINITY) {
1663064f8208SBarry Smith     *nrm = 0.0;
1664d0f46423SBarry Smith     for (j=0; j<A->rmap->n; j++) {
1665ca15aa20SStefano Zampini       v   = vv + j;
1666289bc588SBarry Smith       sum = 0.0;
1667d0f46423SBarry Smith       for (i=0; i<A->cmap->n; i++) {
16681b807ce4Svictorle         sum += PetscAbsScalar(*v); v += mat->lda;
1669289bc588SBarry Smith       }
1670064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1671289bc588SBarry Smith     }
1672eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
1673e7e72b3dSBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm");
1674ca15aa20SStefano Zampini   ierr = MatDenseRestoreArrayRead(A,(const PetscScalar**)&vv);CHKERRQ(ierr);
16753a40ed3dSBarry Smith   PetscFunctionReturn(0);
1676289bc588SBarry Smith }
1677289bc588SBarry Smith 
1678e0877f53SBarry Smith static PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg)
1679289bc588SBarry Smith {
1680c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *aij = (Mat_SeqDense*)A->data;
168163ba0a88SBarry Smith   PetscErrorCode ierr;
168267e560aaSBarry Smith 
16833a40ed3dSBarry Smith   PetscFunctionBegin;
1684b5a2b587SKris Buschelman   switch (op) {
1685b5a2b587SKris Buschelman   case MAT_ROW_ORIENTED:
16864e0d8c25SBarry Smith     aij->roworiented = flg;
1687b5a2b587SKris Buschelman     break;
1688512a5fc5SBarry Smith   case MAT_NEW_NONZERO_LOCATIONS:
1689b5a2b587SKris Buschelman   case MAT_NEW_NONZERO_LOCATION_ERR:
16903971808eSMatthew Knepley   case MAT_NEW_NONZERO_ALLOCATION_ERR:
16914e0d8c25SBarry Smith   case MAT_NEW_DIAGONALS:
169213fa8e87SLisandro Dalcin   case MAT_KEEP_NONZERO_PATTERN:
1693b5a2b587SKris Buschelman   case MAT_IGNORE_OFF_PROC_ENTRIES:
1694b5a2b587SKris Buschelman   case MAT_USE_HASH_TABLE:
16950f8fb01aSBarry Smith   case MAT_IGNORE_ZERO_ENTRIES:
16965021d80fSJed Brown   case MAT_IGNORE_LOWER_TRIANGULAR:
1697071fcb05SBarry Smith   case MAT_SORTED_FULL:
16985021d80fSJed Brown     ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr);
16995021d80fSJed Brown     break;
17005021d80fSJed Brown   case MAT_SPD:
170177e54ba9SKris Buschelman   case MAT_SYMMETRIC:
170277e54ba9SKris Buschelman   case MAT_STRUCTURALLY_SYMMETRIC:
17039a4540c5SBarry Smith   case MAT_HERMITIAN:
17049a4540c5SBarry Smith   case MAT_SYMMETRY_ETERNAL:
17055021d80fSJed Brown     /* These options are handled directly by MatSetOption() */
170677e54ba9SKris Buschelman     break;
1707b5a2b587SKris Buschelman   default:
1708e32f2f54SBarry Smith     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]);
17093a40ed3dSBarry Smith   }
17103a40ed3dSBarry Smith   PetscFunctionReturn(0);
1711289bc588SBarry Smith }
1712289bc588SBarry Smith 
1713e0877f53SBarry Smith static PetscErrorCode MatZeroEntries_SeqDense(Mat A)
17146f0a148fSBarry Smith {
1715ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)A->data;
17166849ba73SBarry Smith   PetscErrorCode ierr;
1717d0f46423SBarry Smith   PetscInt       lda=l->lda,m=A->rmap->n,j;
1718ca15aa20SStefano Zampini   PetscScalar    *v;
17193a40ed3dSBarry Smith 
17203a40ed3dSBarry Smith   PetscFunctionBegin;
1721ca15aa20SStefano Zampini   ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr);
1722a5ce6ee0Svictorle   if (lda>m) {
1723d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1724ca15aa20SStefano Zampini       ierr = PetscArrayzero(v+j*lda,m);CHKERRQ(ierr);
1725a5ce6ee0Svictorle     }
1726a5ce6ee0Svictorle   } else {
1727ca15aa20SStefano Zampini     ierr = PetscArrayzero(v,A->rmap->n*A->cmap->n);CHKERRQ(ierr);
1728a5ce6ee0Svictorle   }
1729ca15aa20SStefano Zampini   ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr);
17303a40ed3dSBarry Smith   PetscFunctionReturn(0);
17316f0a148fSBarry Smith }
17326f0a148fSBarry Smith 
1733e0877f53SBarry Smith static PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b)
17346f0a148fSBarry Smith {
173597b48c8fSBarry Smith   PetscErrorCode    ierr;
1736ec8511deSBarry Smith   Mat_SeqDense      *l = (Mat_SeqDense*)A->data;
1737b9679d65SBarry Smith   PetscInt          m  = l->lda, n = A->cmap->n, i,j;
1738ca15aa20SStefano Zampini   PetscScalar       *slot,*bb,*v;
173997b48c8fSBarry Smith   const PetscScalar *xx;
174055659b69SBarry Smith 
17413a40ed3dSBarry Smith   PetscFunctionBegin;
174276bd3646SJed Brown   if (PetscDefined(USE_DEBUG)) {
1743b9679d65SBarry Smith     for (i=0; i<N; i++) {
1744b9679d65SBarry Smith       if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed");
1745b9679d65SBarry 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);
1746b9679d65SBarry Smith     }
174776bd3646SJed Brown   }
1748ca15aa20SStefano Zampini   if (!N) PetscFunctionReturn(0);
1749b9679d65SBarry Smith 
175097b48c8fSBarry Smith   /* fix right hand side if needed */
175197b48c8fSBarry Smith   if (x && b) {
175297b48c8fSBarry Smith     ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr);
175397b48c8fSBarry Smith     ierr = VecGetArray(b,&bb);CHKERRQ(ierr);
17542205254eSKarl Rupp     for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]];
175597b48c8fSBarry Smith     ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr);
175697b48c8fSBarry Smith     ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr);
175797b48c8fSBarry Smith   }
175897b48c8fSBarry Smith 
1759ca15aa20SStefano Zampini   ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr);
17606f0a148fSBarry Smith   for (i=0; i<N; i++) {
1761ca15aa20SStefano Zampini     slot = v + rows[i];
1762b9679d65SBarry Smith     for (j=0; j<n; j++) { *slot = 0.0; slot += m;}
17636f0a148fSBarry Smith   }
1764f4df32b1SMatthew Knepley   if (diag != 0.0) {
1765b9679d65SBarry Smith     if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices");
17666f0a148fSBarry Smith     for (i=0; i<N; i++) {
1767ca15aa20SStefano Zampini       slot  = v + (m+1)*rows[i];
1768f4df32b1SMatthew Knepley       *slot = diag;
17696f0a148fSBarry Smith     }
17706f0a148fSBarry Smith   }
1771ca15aa20SStefano Zampini   ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr);
17723a40ed3dSBarry Smith   PetscFunctionReturn(0);
17736f0a148fSBarry Smith }
1774557bce09SLois Curfman McInnes 
177549a6ff4bSBarry Smith static PetscErrorCode MatDenseGetLDA_SeqDense(Mat A,PetscInt *lda)
177649a6ff4bSBarry Smith {
177749a6ff4bSBarry Smith   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
177849a6ff4bSBarry Smith 
177949a6ff4bSBarry Smith   PetscFunctionBegin;
178049a6ff4bSBarry Smith   *lda = mat->lda;
178149a6ff4bSBarry Smith   PetscFunctionReturn(0);
178249a6ff4bSBarry Smith }
178349a6ff4bSBarry Smith 
1784637a0070SStefano Zampini PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar **array)
178564e87e97SBarry Smith {
1786c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
17873a40ed3dSBarry Smith 
17883a40ed3dSBarry Smith   PetscFunctionBegin;
178964e87e97SBarry Smith   *array = mat->v;
17903a40ed3dSBarry Smith   PetscFunctionReturn(0);
179164e87e97SBarry Smith }
17920754003eSLois Curfman McInnes 
1793637a0070SStefano Zampini PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar **array)
1794ff14e315SSatish Balay {
17953a40ed3dSBarry Smith   PetscFunctionBegin;
1796637a0070SStefano Zampini   *array = NULL;
17973a40ed3dSBarry Smith   PetscFunctionReturn(0);
1798ff14e315SSatish Balay }
17990754003eSLois Curfman McInnes 
1800dec5eb66SMatthew G Knepley /*@C
180149a6ff4bSBarry Smith    MatDenseGetLDA - gets the leading dimension of the array returned from MatDenseGetArray()
180249a6ff4bSBarry Smith 
180349a6ff4bSBarry Smith    Logically Collective on Mat
180449a6ff4bSBarry Smith 
180549a6ff4bSBarry Smith    Input Parameter:
180649a6ff4bSBarry Smith .  mat - a MATSEQDENSE or MATMPIDENSE matrix
180749a6ff4bSBarry Smith 
180849a6ff4bSBarry Smith    Output Parameter:
180949a6ff4bSBarry Smith .   lda - the leading dimension
181049a6ff4bSBarry Smith 
181149a6ff4bSBarry Smith    Level: intermediate
181249a6ff4bSBarry Smith 
181349a6ff4bSBarry Smith .seealso: MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead(), MatSeqDenseSetLDA()
181449a6ff4bSBarry Smith @*/
181549a6ff4bSBarry Smith PetscErrorCode  MatDenseGetLDA(Mat A,PetscInt *lda)
181649a6ff4bSBarry Smith {
181749a6ff4bSBarry Smith   PetscErrorCode ierr;
181849a6ff4bSBarry Smith 
181949a6ff4bSBarry Smith   PetscFunctionBegin;
1820*d5ea218eSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
1821*d5ea218eSStefano Zampini   PetscValidPointer(lda,2);
182249a6ff4bSBarry Smith   ierr = PetscUseMethod(A,"MatDenseGetLDA_C",(Mat,PetscInt*),(A,lda));CHKERRQ(ierr);
182349a6ff4bSBarry Smith   PetscFunctionReturn(0);
182449a6ff4bSBarry Smith }
182549a6ff4bSBarry Smith 
182649a6ff4bSBarry Smith /*@C
18276947451fSStefano Zampini    MatDenseGetArray - gives read-write access to the array where the data for a dense matrix is stored
182873a71a0fSBarry Smith 
18298572280aSBarry Smith    Logically Collective on Mat
183073a71a0fSBarry Smith 
183173a71a0fSBarry Smith    Input Parameter:
18326947451fSStefano Zampini .  mat - a dense matrix
183373a71a0fSBarry Smith 
183473a71a0fSBarry Smith    Output Parameter:
183573a71a0fSBarry Smith .   array - pointer to the data
183673a71a0fSBarry Smith 
183773a71a0fSBarry Smith    Level: intermediate
183873a71a0fSBarry Smith 
18396947451fSStefano Zampini .seealso: MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead(), MatDenseGetArrayWrite(), MatDenseRestoreArrayWrite()
184073a71a0fSBarry Smith @*/
18418c778c55SBarry Smith PetscErrorCode  MatDenseGetArray(Mat A,PetscScalar **array)
184273a71a0fSBarry Smith {
184373a71a0fSBarry Smith   PetscErrorCode ierr;
184473a71a0fSBarry Smith 
184573a71a0fSBarry Smith   PetscFunctionBegin;
1846*d5ea218eSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
1847*d5ea218eSStefano Zampini   PetscValidPointer(array,2);
18488c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
184973a71a0fSBarry Smith   PetscFunctionReturn(0);
185073a71a0fSBarry Smith }
185173a71a0fSBarry Smith 
1852dec5eb66SMatthew G Knepley /*@C
1853579dbff0SBarry Smith    MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray()
185473a71a0fSBarry Smith 
18558572280aSBarry Smith    Logically Collective on Mat
18568572280aSBarry Smith 
18578572280aSBarry Smith    Input Parameters:
18586947451fSStefano Zampini +  mat - a dense matrix
1859a2b725a8SWilliam Gropp -  array - pointer to the data
18608572280aSBarry Smith 
18618572280aSBarry Smith    Level: intermediate
18628572280aSBarry Smith 
18636947451fSStefano Zampini .seealso: MatDenseGetArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead(), MatDenseGetArrayWrite(), MatDenseRestoreArrayWrite()
18648572280aSBarry Smith @*/
18658572280aSBarry Smith PetscErrorCode  MatDenseRestoreArray(Mat A,PetscScalar **array)
18668572280aSBarry Smith {
18678572280aSBarry Smith   PetscErrorCode ierr;
18688572280aSBarry Smith 
18698572280aSBarry Smith   PetscFunctionBegin;
1870*d5ea218eSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
1871*d5ea218eSStefano Zampini   PetscValidPointer(array,2);
18728572280aSBarry Smith   ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
18738572280aSBarry Smith   ierr = PetscObjectStateIncrease((PetscObject)A);CHKERRQ(ierr);
1874637a0070SStefano Zampini #if defined(PETSC_HAVE_CUDA)
1875637a0070SStefano Zampini   A->offloadmask = PETSC_OFFLOAD_CPU;
1876637a0070SStefano Zampini #endif
18778572280aSBarry Smith   PetscFunctionReturn(0);
18788572280aSBarry Smith }
18798572280aSBarry Smith 
18808572280aSBarry Smith /*@C
18816947451fSStefano Zampini    MatDenseGetArrayRead - gives read-only access to the array where the data for a dense matrix is stored
18828572280aSBarry Smith 
18838572280aSBarry Smith    Not Collective
18848572280aSBarry Smith 
18858572280aSBarry Smith    Input Parameter:
18866947451fSStefano Zampini .  mat - a dense matrix
18878572280aSBarry Smith 
18888572280aSBarry Smith    Output Parameter:
18898572280aSBarry Smith .   array - pointer to the data
18908572280aSBarry Smith 
18918572280aSBarry Smith    Level: intermediate
18928572280aSBarry Smith 
18936947451fSStefano Zampini .seealso: MatDenseRestoreArrayRead(), MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayWrite(), MatDenseRestoreArrayWrite()
18948572280aSBarry Smith @*/
18958572280aSBarry Smith PetscErrorCode  MatDenseGetArrayRead(Mat A,const PetscScalar **array)
18968572280aSBarry Smith {
18978572280aSBarry Smith   PetscErrorCode ierr;
18988572280aSBarry Smith 
18998572280aSBarry Smith   PetscFunctionBegin;
1900*d5ea218eSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
1901*d5ea218eSStefano Zampini   PetscValidPointer(array,2);
19028572280aSBarry Smith   ierr = PetscUseMethod(A,"MatDenseGetArrayRead_C",(Mat,const PetscScalar**),(A,array));CHKERRQ(ierr);
19038572280aSBarry Smith   PetscFunctionReturn(0);
19048572280aSBarry Smith }
19058572280aSBarry Smith 
19068572280aSBarry Smith /*@C
19076947451fSStefano Zampini    MatDenseRestoreArrayRead - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArrayRead()
19088572280aSBarry Smith 
190973a71a0fSBarry Smith    Not Collective
191073a71a0fSBarry Smith 
191173a71a0fSBarry Smith    Input Parameters:
19126947451fSStefano Zampini +  mat - a dense matrix
1913a2b725a8SWilliam Gropp -  array - pointer to the data
191473a71a0fSBarry Smith 
191573a71a0fSBarry Smith    Level: intermediate
191673a71a0fSBarry Smith 
19176947451fSStefano Zampini .seealso: MatDenseGetArrayRead(), MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayWrite(), MatDenseRestoreArrayWrite()
191873a71a0fSBarry Smith @*/
19198572280aSBarry Smith PetscErrorCode  MatDenseRestoreArrayRead(Mat A,const PetscScalar **array)
192073a71a0fSBarry Smith {
192173a71a0fSBarry Smith   PetscErrorCode ierr;
192273a71a0fSBarry Smith 
192373a71a0fSBarry Smith   PetscFunctionBegin;
1924*d5ea218eSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
1925*d5ea218eSStefano Zampini   PetscValidPointer(array,2);
19268572280aSBarry Smith   ierr = PetscUseMethod(A,"MatDenseRestoreArrayRead_C",(Mat,const PetscScalar**),(A,array));CHKERRQ(ierr);
192773a71a0fSBarry Smith   PetscFunctionReturn(0);
192873a71a0fSBarry Smith }
192973a71a0fSBarry Smith 
19306947451fSStefano Zampini /*@C
19316947451fSStefano Zampini    MatDenseGetArrayWrite - gives write-only access to the array where the data for a dense matrix is stored
19326947451fSStefano Zampini 
19336947451fSStefano Zampini    Not Collective
19346947451fSStefano Zampini 
19356947451fSStefano Zampini    Input Parameter:
19366947451fSStefano Zampini .  mat - a dense matrix
19376947451fSStefano Zampini 
19386947451fSStefano Zampini    Output Parameter:
19396947451fSStefano Zampini .   array - pointer to the data
19406947451fSStefano Zampini 
19416947451fSStefano Zampini    Level: intermediate
19426947451fSStefano Zampini 
19436947451fSStefano Zampini .seealso: MatDenseRestoreArrayWrite(), MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead()
19446947451fSStefano Zampini @*/
19456947451fSStefano Zampini PetscErrorCode  MatDenseGetArrayWrite(Mat A,PetscScalar **array)
19466947451fSStefano Zampini {
19476947451fSStefano Zampini   PetscErrorCode ierr;
19486947451fSStefano Zampini 
19496947451fSStefano Zampini   PetscFunctionBegin;
1950*d5ea218eSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
1951*d5ea218eSStefano Zampini   PetscValidPointer(array,2);
19526947451fSStefano Zampini   ierr = PetscUseMethod(A,"MatDenseGetArrayWrite_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
19536947451fSStefano Zampini   PetscFunctionReturn(0);
19546947451fSStefano Zampini }
19556947451fSStefano Zampini 
19566947451fSStefano Zampini /*@C
19576947451fSStefano Zampini    MatDenseRestoreArrayWrite - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArrayWrite()
19586947451fSStefano Zampini 
19596947451fSStefano Zampini    Not Collective
19606947451fSStefano Zampini 
19616947451fSStefano Zampini    Input Parameters:
19626947451fSStefano Zampini +  mat - a dense matrix
19636947451fSStefano Zampini -  array - pointer to the data
19646947451fSStefano Zampini 
19656947451fSStefano Zampini    Level: intermediate
19666947451fSStefano Zampini 
19676947451fSStefano Zampini .seealso: MatDenseGetArrayWrite(), MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead()
19686947451fSStefano Zampini @*/
19696947451fSStefano Zampini PetscErrorCode  MatDenseRestoreArrayWrite(Mat A,PetscScalar **array)
19706947451fSStefano Zampini {
19716947451fSStefano Zampini   PetscErrorCode ierr;
19726947451fSStefano Zampini 
19736947451fSStefano Zampini   PetscFunctionBegin;
1974*d5ea218eSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
1975*d5ea218eSStefano Zampini   PetscValidPointer(array,2);
19766947451fSStefano Zampini   ierr = PetscUseMethod(A,"MatDenseRestoreArrayWrite_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
19776947451fSStefano Zampini   ierr = PetscObjectStateIncrease((PetscObject)A);CHKERRQ(ierr);
19786947451fSStefano Zampini #if defined(PETSC_HAVE_CUDA)
19796947451fSStefano Zampini   A->offloadmask = PETSC_OFFLOAD_CPU;
19806947451fSStefano Zampini #endif
19816947451fSStefano Zampini   PetscFunctionReturn(0);
19826947451fSStefano Zampini }
19836947451fSStefano Zampini 
19847dae84e0SHong Zhang static PetscErrorCode MatCreateSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B)
19850754003eSLois Curfman McInnes {
1986c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
19876849ba73SBarry Smith   PetscErrorCode ierr;
1988ca15aa20SStefano Zampini   PetscInt       i,j,nrows,ncols,blda;
19895d0c19d7SBarry Smith   const PetscInt *irow,*icol;
199087828ca2SBarry Smith   PetscScalar    *av,*bv,*v = mat->v;
19910754003eSLois Curfman McInnes   Mat            newmat;
19920754003eSLois Curfman McInnes 
19933a40ed3dSBarry Smith   PetscFunctionBegin;
199478b31e54SBarry Smith   ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr);
199578b31e54SBarry Smith   ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr);
1996e03a110bSBarry Smith   ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr);
1997e03a110bSBarry Smith   ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr);
19980754003eSLois Curfman McInnes 
1999182d2002SSatish Balay   /* Check submatrixcall */
2000182d2002SSatish Balay   if (scall == MAT_REUSE_MATRIX) {
200113f74950SBarry Smith     PetscInt n_cols,n_rows;
2002182d2002SSatish Balay     ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr);
200321a2c019SBarry Smith     if (n_rows != nrows || n_cols != ncols) {
2004f746d493SDmitry Karpeev       /* resize the result matrix to match number of requested rows/columns */
2005c61587bbSBarry Smith       ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
200621a2c019SBarry Smith     }
2007182d2002SSatish Balay     newmat = *B;
2008182d2002SSatish Balay   } else {
20090754003eSLois Curfman McInnes     /* Create and fill new matrix */
2010ce94432eSBarry Smith     ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr);
2011f69a0ea3SMatthew Knepley     ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
20127adad957SLisandro Dalcin     ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
20130298fd71SBarry Smith     ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr);
2014182d2002SSatish Balay   }
2015182d2002SSatish Balay 
2016182d2002SSatish Balay   /* Now extract the data pointers and do the copy,column at a time */
2017ca15aa20SStefano Zampini   ierr = MatDenseGetArray(newmat,&bv);CHKERRQ(ierr);
2018ca15aa20SStefano Zampini   ierr = MatDenseGetLDA(newmat,&blda);CHKERRQ(ierr);
2019182d2002SSatish Balay   for (i=0; i<ncols; i++) {
20206de62eeeSBarry Smith     av = v + mat->lda*icol[i];
2021ca15aa20SStefano Zampini     for (j=0; j<nrows; j++) bv[j] = av[irow[j]];
2022ca15aa20SStefano Zampini     bv += blda;
20230754003eSLois Curfman McInnes   }
2024ca15aa20SStefano Zampini   ierr = MatDenseRestoreArray(newmat,&bv);CHKERRQ(ierr);
2025182d2002SSatish Balay 
2026182d2002SSatish Balay   /* Assemble the matrices so that the correct flags are set */
20276d4a8577SBarry Smith   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
20286d4a8577SBarry Smith   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
20290754003eSLois Curfman McInnes 
20300754003eSLois Curfman McInnes   /* Free work space */
203178b31e54SBarry Smith   ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr);
203278b31e54SBarry Smith   ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr);
2033182d2002SSatish Balay   *B   = newmat;
20343a40ed3dSBarry Smith   PetscFunctionReturn(0);
20350754003eSLois Curfman McInnes }
20360754003eSLois Curfman McInnes 
20377dae84e0SHong Zhang static PetscErrorCode MatCreateSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[])
2038905e6a2fSBarry Smith {
20396849ba73SBarry Smith   PetscErrorCode ierr;
204013f74950SBarry Smith   PetscInt       i;
2041905e6a2fSBarry Smith 
20423a40ed3dSBarry Smith   PetscFunctionBegin;
2043905e6a2fSBarry Smith   if (scall == MAT_INITIAL_MATRIX) {
2044df750dc8SHong Zhang     ierr = PetscCalloc1(n+1,B);CHKERRQ(ierr);
2045905e6a2fSBarry Smith   }
2046905e6a2fSBarry Smith 
2047905e6a2fSBarry Smith   for (i=0; i<n; i++) {
20487dae84e0SHong Zhang     ierr = MatCreateSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr);
2049905e6a2fSBarry Smith   }
20503a40ed3dSBarry Smith   PetscFunctionReturn(0);
2051905e6a2fSBarry Smith }
2052905e6a2fSBarry Smith 
2053e0877f53SBarry Smith static PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode)
2054c0aa2d19SHong Zhang {
2055c0aa2d19SHong Zhang   PetscFunctionBegin;
2056c0aa2d19SHong Zhang   PetscFunctionReturn(0);
2057c0aa2d19SHong Zhang }
2058c0aa2d19SHong Zhang 
2059e0877f53SBarry Smith static PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode)
2060c0aa2d19SHong Zhang {
2061c0aa2d19SHong Zhang   PetscFunctionBegin;
2062c0aa2d19SHong Zhang   PetscFunctionReturn(0);
2063c0aa2d19SHong Zhang }
2064c0aa2d19SHong Zhang 
2065e0877f53SBarry Smith static PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str)
20664b0e389bSBarry Smith {
20674b0e389bSBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data;
20686849ba73SBarry Smith   PetscErrorCode    ierr;
2069ca15aa20SStefano Zampini   const PetscScalar *va;
2070ca15aa20SStefano Zampini   PetscScalar       *vb;
2071d0f46423SBarry Smith   PetscInt          lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j;
20723a40ed3dSBarry Smith 
20733a40ed3dSBarry Smith   PetscFunctionBegin;
207433f4a19fSKris Buschelman   /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */
207533f4a19fSKris Buschelman   if (A->ops->copy != B->ops->copy) {
2076cb5b572fSBarry Smith     ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr);
20773a40ed3dSBarry Smith     PetscFunctionReturn(0);
20783a40ed3dSBarry Smith   }
2079e32f2f54SBarry Smith   if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)");
2080ca15aa20SStefano Zampini   ierr = MatDenseGetArrayRead(A,&va);CHKERRQ(ierr);
2081ca15aa20SStefano Zampini   ierr = MatDenseGetArray(B,&vb);CHKERRQ(ierr);
2082a5ce6ee0Svictorle   if (lda1>m || lda2>m) {
20830dbb7854Svictorle     for (j=0; j<n; j++) {
2084ca15aa20SStefano Zampini       ierr = PetscArraycpy(vb+j*lda2,va+j*lda1,m);CHKERRQ(ierr);
2085a5ce6ee0Svictorle     }
2086a5ce6ee0Svictorle   } else {
2087ca15aa20SStefano Zampini     ierr = PetscArraycpy(vb,va,A->rmap->n*A->cmap->n);CHKERRQ(ierr);
2088a5ce6ee0Svictorle   }
2089ca15aa20SStefano Zampini   ierr = MatDenseRestoreArray(B,&vb);CHKERRQ(ierr);
2090ca15aa20SStefano Zampini   ierr = MatDenseRestoreArrayRead(A,&va);CHKERRQ(ierr);
2091ca15aa20SStefano Zampini   ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2092ca15aa20SStefano Zampini   ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2093273d9f13SBarry Smith   PetscFunctionReturn(0);
2094273d9f13SBarry Smith }
2095273d9f13SBarry Smith 
2096e0877f53SBarry Smith static PetscErrorCode MatSetUp_SeqDense(Mat A)
2097273d9f13SBarry Smith {
2098dfbe8321SBarry Smith   PetscErrorCode ierr;
2099273d9f13SBarry Smith 
2100273d9f13SBarry Smith   PetscFunctionBegin;
210118992e5dSStefano Zampini   ierr = PetscLayoutSetUp(A->rmap);CHKERRQ(ierr);
210218992e5dSStefano Zampini   ierr = PetscLayoutSetUp(A->cmap);CHKERRQ(ierr);
210318992e5dSStefano Zampini   if (!A->preallocated) {
2104273d9f13SBarry Smith     ierr = MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr);
210518992e5dSStefano Zampini   }
21063a40ed3dSBarry Smith   PetscFunctionReturn(0);
21074b0e389bSBarry Smith }
21084b0e389bSBarry Smith 
2109ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A)
2110ba337c44SJed Brown {
2111ba337c44SJed Brown   PetscInt       i,nz = A->rmap->n*A->cmap->n;
2112ca15aa20SStefano Zampini   PetscScalar    *aa;
2113ca15aa20SStefano Zampini   PetscErrorCode ierr;
2114ba337c44SJed Brown 
2115ba337c44SJed Brown   PetscFunctionBegin;
2116ca15aa20SStefano Zampini   ierr = MatDenseGetArray(A,&aa);CHKERRQ(ierr);
2117ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]);
2118ca15aa20SStefano Zampini   ierr = MatDenseRestoreArray(A,&aa);CHKERRQ(ierr);
2119ba337c44SJed Brown   PetscFunctionReturn(0);
2120ba337c44SJed Brown }
2121ba337c44SJed Brown 
2122ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A)
2123ba337c44SJed Brown {
2124ba337c44SJed Brown   PetscInt       i,nz = A->rmap->n*A->cmap->n;
2125ca15aa20SStefano Zampini   PetscScalar    *aa;
2126ca15aa20SStefano Zampini   PetscErrorCode ierr;
2127ba337c44SJed Brown 
2128ba337c44SJed Brown   PetscFunctionBegin;
2129ca15aa20SStefano Zampini   ierr = MatDenseGetArray(A,&aa);CHKERRQ(ierr);
2130ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]);
2131ca15aa20SStefano Zampini   ierr = MatDenseRestoreArray(A,&aa);CHKERRQ(ierr);
2132ba337c44SJed Brown   PetscFunctionReturn(0);
2133ba337c44SJed Brown }
2134ba337c44SJed Brown 
2135ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A)
2136ba337c44SJed Brown {
2137ba337c44SJed Brown   PetscInt       i,nz = A->rmap->n*A->cmap->n;
2138ca15aa20SStefano Zampini   PetscScalar    *aa;
2139ca15aa20SStefano Zampini   PetscErrorCode ierr;
2140ba337c44SJed Brown 
2141ba337c44SJed Brown   PetscFunctionBegin;
2142ca15aa20SStefano Zampini   ierr = MatDenseGetArray(A,&aa);CHKERRQ(ierr);
2143ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]);
2144ca15aa20SStefano Zampini   ierr = MatDenseRestoreArray(A,&aa);CHKERRQ(ierr);
2145ba337c44SJed Brown   PetscFunctionReturn(0);
2146ba337c44SJed Brown }
2147284134d9SBarry Smith 
2148a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/
21494222ddf1SHong Zhang PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat C)
2150a9fe9ddaSSatish Balay {
2151ee16a9a1SHong Zhang   PetscErrorCode ierr;
2152d0f46423SBarry Smith   PetscInt       m=A->rmap->n,n=B->cmap->n;
21537a3c3d58SStefano Zampini   PetscBool      cisdense;
2154a9fe9ddaSSatish Balay 
2155ee16a9a1SHong Zhang   PetscFunctionBegin;
21564222ddf1SHong Zhang   ierr = MatSetSizes(C,m,n,m,n);CHKERRQ(ierr);
21577a3c3d58SStefano Zampini   ierr = PetscObjectTypeCompareAny((PetscObject)C,&cisdense,MATSEQDENSE,MATSEQDENSECUDA,"");CHKERRQ(ierr);
21587a3c3d58SStefano Zampini   if (!cisdense) {
21597a3c3d58SStefano Zampini     PetscBool flg;
21607a3c3d58SStefano Zampini 
2161ca15aa20SStefano Zampini     ierr = PetscObjectTypeCompare((PetscObject)B,((PetscObject)A)->type_name,&flg);CHKERRQ(ierr);
21624222ddf1SHong Zhang     ierr = MatSetType(C,flg ? ((PetscObject)A)->type_name : MATDENSE);CHKERRQ(ierr);
21637a3c3d58SStefano Zampini   }
216418992e5dSStefano Zampini   ierr = MatSetUp(C);CHKERRQ(ierr);
2165ee16a9a1SHong Zhang   PetscFunctionReturn(0);
2166ee16a9a1SHong Zhang }
2167a9fe9ddaSSatish Balay 
2168a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
2169a9fe9ddaSSatish Balay {
217052c5f739Sprj-   Mat_SeqDense       *a,*b=(Mat_SeqDense*)B->data,*c=(Mat_SeqDense*)C->data;
21710805154bSBarry Smith   PetscBLASInt       m,n,k;
2172ca15aa20SStefano Zampini   const PetscScalar *av,*bv;
2173ca15aa20SStefano Zampini   PetscScalar       *cv;
2174a9fe9ddaSSatish Balay   PetscScalar       _DOne=1.0,_DZero=0.0;
2175fd4e9aacSBarry Smith   PetscBool         flg;
2176c2916339SPierre Jolivet   PetscErrorCode    (*numeric)(Mat,Mat,Mat)=NULL;
2177c2916339SPierre Jolivet   PetscErrorCode    ierr;
2178a9fe9ddaSSatish Balay 
2179a9fe9ddaSSatish Balay   PetscFunctionBegin;
2180fd4e9aacSBarry Smith   /* Handle case where where user provided the final C matrix rather than calling MatMatMult() with MAT_INITIAL_MATRIX*/
2181fd4e9aacSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&flg);CHKERRQ(ierr);
2182c2916339SPierre Jolivet   if (flg) numeric = MatMatMultNumeric_SeqAIJ_SeqDense;
2183a001520aSPierre Jolivet   ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQBAIJ,&flg);CHKERRQ(ierr);
2184c2916339SPierre Jolivet   if (flg) numeric = MatMatMultNumeric_SeqBAIJ_SeqDense;
2185c2916339SPierre Jolivet   ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQSBAIJ,&flg);CHKERRQ(ierr);
2186c2916339SPierre Jolivet   if (flg) numeric = MatMatMultNumeric_SeqSBAIJ_SeqDense;
218752c5f739Sprj-   ierr = PetscObjectTypeCompare((PetscObject)A,MATNEST,&flg);CHKERRQ(ierr);
2188c2916339SPierre Jolivet   if (flg) numeric = MatMatMultNumeric_Nest_Dense;
2189c2916339SPierre Jolivet   if (numeric) {
2190c2916339SPierre Jolivet     C->ops->matmultnumeric = numeric;
2191c2916339SPierre Jolivet     ierr = (*numeric)(A,B,C);CHKERRQ(ierr);
219252c5f739Sprj-     PetscFunctionReturn(0);
219352c5f739Sprj-   }
219452c5f739Sprj-   a = (Mat_SeqDense*)A->data;
21958208b9aeSStefano Zampini   ierr = PetscBLASIntCast(C->rmap->n,&m);CHKERRQ(ierr);
21968208b9aeSStefano Zampini   ierr = PetscBLASIntCast(C->cmap->n,&n);CHKERRQ(ierr);
2197c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr);
219849d0e964SStefano Zampini   if (!m || !n || !k) PetscFunctionReturn(0);
2199ca15aa20SStefano Zampini   ierr = MatDenseGetArrayRead(A,&av);CHKERRQ(ierr);
2200ca15aa20SStefano Zampini   ierr = MatDenseGetArrayRead(B,&bv);CHKERRQ(ierr);
2201ca15aa20SStefano Zampini   ierr = MatDenseGetArray(C,&cv);CHKERRQ(ierr);
2202ca15aa20SStefano Zampini   PetscStackCallBLAS("BLASgemm",BLASgemm_("N","N",&m,&n,&k,&_DOne,av,&a->lda,bv,&b->lda,&_DZero,cv,&c->lda));
2203ca15aa20SStefano Zampini   ierr = PetscLogFlops(1.0*m*n*k + 1.0*m*n*(k-1));CHKERRQ(ierr);
2204ca15aa20SStefano Zampini   ierr = MatDenseRestoreArrayRead(A,&av);CHKERRQ(ierr);
2205ca15aa20SStefano Zampini   ierr = MatDenseRestoreArrayRead(B,&bv);CHKERRQ(ierr);
2206ca15aa20SStefano Zampini   ierr = MatDenseRestoreArray(C,&cv);CHKERRQ(ierr);
2207a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
2208a9fe9ddaSSatish Balay }
2209a9fe9ddaSSatish Balay 
22104222ddf1SHong Zhang PetscErrorCode MatMatTransposeMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat C)
221169f65d41SStefano Zampini {
221269f65d41SStefano Zampini   PetscErrorCode ierr;
221369f65d41SStefano Zampini   PetscInt       m=A->rmap->n,n=B->rmap->n;
22147a3c3d58SStefano Zampini   PetscBool      cisdense;
221569f65d41SStefano Zampini 
221669f65d41SStefano Zampini   PetscFunctionBegin;
22174222ddf1SHong Zhang   ierr = MatSetSizes(C,m,n,m,n);CHKERRQ(ierr);
22187a3c3d58SStefano Zampini   ierr = PetscObjectTypeCompareAny((PetscObject)C,&cisdense,MATSEQDENSE,MATSEQDENSECUDA,"");CHKERRQ(ierr);
22197a3c3d58SStefano Zampini   if (!cisdense) {
22207a3c3d58SStefano Zampini     PetscBool flg;
22217a3c3d58SStefano Zampini 
2222ca15aa20SStefano Zampini     ierr = PetscObjectTypeCompare((PetscObject)B,((PetscObject)A)->type_name,&flg);CHKERRQ(ierr);
22234222ddf1SHong Zhang     ierr = MatSetType(C,flg ? ((PetscObject)A)->type_name : MATDENSE);CHKERRQ(ierr);
22247a3c3d58SStefano Zampini   }
222518992e5dSStefano Zampini   ierr = MatSetUp(C);CHKERRQ(ierr);
222669f65d41SStefano Zampini   PetscFunctionReturn(0);
222769f65d41SStefano Zampini }
222869f65d41SStefano Zampini 
222969f65d41SStefano Zampini PetscErrorCode MatMatTransposeMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
223069f65d41SStefano Zampini {
223169f65d41SStefano Zampini   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
223269f65d41SStefano Zampini   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
223369f65d41SStefano Zampini   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
223469f65d41SStefano Zampini   PetscBLASInt   m,n,k;
223569f65d41SStefano Zampini   PetscScalar    _DOne=1.0,_DZero=0.0;
223669f65d41SStefano Zampini   PetscErrorCode ierr;
223769f65d41SStefano Zampini 
223869f65d41SStefano Zampini   PetscFunctionBegin;
223949d0e964SStefano Zampini   ierr = PetscBLASIntCast(C->rmap->n,&m);CHKERRQ(ierr);
224049d0e964SStefano Zampini   ierr = PetscBLASIntCast(C->cmap->n,&n);CHKERRQ(ierr);
224169f65d41SStefano Zampini   ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr);
224249d0e964SStefano Zampini   if (!m || !n || !k) PetscFunctionReturn(0);
224369f65d41SStefano Zampini   PetscStackCallBLAS("BLASgemm",BLASgemm_("N","T",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
2244ca15aa20SStefano Zampini   ierr = PetscLogFlops(1.0*m*n*k + 1.0*m*n*(k-1));CHKERRQ(ierr);
224569f65d41SStefano Zampini   PetscFunctionReturn(0);
224669f65d41SStefano Zampini }
224769f65d41SStefano Zampini 
22484222ddf1SHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat C)
2249a9fe9ddaSSatish Balay {
2250ee16a9a1SHong Zhang   PetscErrorCode ierr;
2251d0f46423SBarry Smith   PetscInt       m=A->cmap->n,n=B->cmap->n;
22527a3c3d58SStefano Zampini   PetscBool      cisdense;
2253a9fe9ddaSSatish Balay 
2254ee16a9a1SHong Zhang   PetscFunctionBegin;
22554222ddf1SHong Zhang   ierr = MatSetSizes(C,m,n,m,n);CHKERRQ(ierr);
22567a3c3d58SStefano Zampini   ierr = PetscObjectTypeCompareAny((PetscObject)C,&cisdense,MATSEQDENSE,MATSEQDENSECUDA,"");CHKERRQ(ierr);
22577a3c3d58SStefano Zampini   if (!cisdense) {
22587a3c3d58SStefano Zampini     PetscBool flg;
22597a3c3d58SStefano Zampini 
2260ca15aa20SStefano Zampini     ierr = PetscObjectTypeCompare((PetscObject)B,((PetscObject)A)->type_name,&flg);CHKERRQ(ierr);
22614222ddf1SHong Zhang     ierr = MatSetType(C,flg ? ((PetscObject)A)->type_name : MATDENSE);CHKERRQ(ierr);
22627a3c3d58SStefano Zampini   }
226318992e5dSStefano Zampini   ierr = MatSetUp(C);CHKERRQ(ierr);
2264ee16a9a1SHong Zhang   PetscFunctionReturn(0);
2265ee16a9a1SHong Zhang }
2266a9fe9ddaSSatish Balay 
226775648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
2268a9fe9ddaSSatish Balay {
2269a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
2270a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
2271a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
22720805154bSBarry Smith   PetscBLASInt   m,n,k;
2273a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
2274c5df96a5SBarry Smith   PetscErrorCode ierr;
2275a9fe9ddaSSatish Balay 
2276a9fe9ddaSSatish Balay   PetscFunctionBegin;
22778208b9aeSStefano Zampini   ierr = PetscBLASIntCast(C->rmap->n,&m);CHKERRQ(ierr);
22788208b9aeSStefano Zampini   ierr = PetscBLASIntCast(C->cmap->n,&n);CHKERRQ(ierr);
2279c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr);
228049d0e964SStefano Zampini   if (!m || !n || !k) PetscFunctionReturn(0);
22815ca1cc5dSStefano Zampini   PetscStackCallBLAS("BLASgemm",BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
2282ca15aa20SStefano Zampini   ierr = PetscLogFlops(1.0*m*n*k + 1.0*m*n*(k-1));CHKERRQ(ierr);
2283a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
2284a9fe9ddaSSatish Balay }
2285985db425SBarry Smith 
22864222ddf1SHong Zhang /* ----------------------------------------------- */
22874222ddf1SHong Zhang static PetscErrorCode MatProductSetFromOptions_SeqDense_AB(Mat C)
22884222ddf1SHong Zhang {
22894222ddf1SHong Zhang   PetscFunctionBegin;
22904222ddf1SHong Zhang   C->ops->matmultsymbolic = MatMatMultSymbolic_SeqDense_SeqDense;
22914222ddf1SHong Zhang   C->ops->productsymbolic = MatProductSymbolic_AB;
22924222ddf1SHong Zhang   /* dense mat may not call MatProductSymbolic(), thus set C->ops->productnumeric here */
22934222ddf1SHong Zhang   C->ops->productnumeric  = MatProductNumeric_AB;
22944222ddf1SHong Zhang   PetscFunctionReturn(0);
22954222ddf1SHong Zhang }
22964222ddf1SHong Zhang 
22974222ddf1SHong Zhang static PetscErrorCode MatProductSetFromOptions_SeqDense_AtB(Mat C)
22984222ddf1SHong Zhang {
22994222ddf1SHong Zhang   PetscFunctionBegin;
23004222ddf1SHong Zhang   C->ops->transposematmultsymbolic = MatTransposeMatMultSymbolic_SeqDense_SeqDense;
23014222ddf1SHong Zhang   C->ops->productsymbolic          = MatProductSymbolic_AtB;
23024222ddf1SHong Zhang   C->ops->productnumeric           = MatProductNumeric_AtB;
23034222ddf1SHong Zhang   PetscFunctionReturn(0);
23044222ddf1SHong Zhang }
23054222ddf1SHong Zhang 
23064222ddf1SHong Zhang static PetscErrorCode MatProductSetFromOptions_SeqDense_ABt(Mat C)
23074222ddf1SHong Zhang {
23084222ddf1SHong Zhang   PetscFunctionBegin;
23094222ddf1SHong Zhang   C->ops->mattransposemultsymbolic = MatMatTransposeMultSymbolic_SeqDense_SeqDense;
23104222ddf1SHong Zhang   C->ops->productsymbolic          = MatProductSymbolic_ABt;
23114222ddf1SHong Zhang   C->ops->productnumeric           = MatProductNumeric_ABt;
23124222ddf1SHong Zhang   PetscFunctionReturn(0);
23134222ddf1SHong Zhang }
23144222ddf1SHong Zhang 
23154222ddf1SHong Zhang static PetscErrorCode MatProductSetFromOptions_SeqDense_PtAP(Mat C)
23164222ddf1SHong Zhang {
23174222ddf1SHong Zhang   PetscFunctionBegin;
23184222ddf1SHong Zhang   C->ops->productsymbolic = MatProductSymbolic_Basic;
23194222ddf1SHong Zhang   PetscFunctionReturn(0);
23204222ddf1SHong Zhang }
23214222ddf1SHong Zhang 
23224222ddf1SHong Zhang PETSC_INTERN PetscErrorCode MatProductSetFromOptions_SeqDense(Mat C)
23234222ddf1SHong Zhang {
23244222ddf1SHong Zhang   PetscErrorCode ierr;
23254222ddf1SHong Zhang   Mat_Product    *product = C->product;
23264222ddf1SHong Zhang 
23274222ddf1SHong Zhang   PetscFunctionBegin;
23284222ddf1SHong Zhang   switch (product->type) {
23294222ddf1SHong Zhang   case MATPRODUCT_AB:
23304222ddf1SHong Zhang     ierr = MatProductSetFromOptions_SeqDense_AB(C);CHKERRQ(ierr);
23314222ddf1SHong Zhang     break;
23324222ddf1SHong Zhang   case MATPRODUCT_AtB:
23334222ddf1SHong Zhang     ierr = MatProductSetFromOptions_SeqDense_AtB(C);CHKERRQ(ierr);
23344222ddf1SHong Zhang     break;
23354222ddf1SHong Zhang   case MATPRODUCT_ABt:
23364222ddf1SHong Zhang     ierr = MatProductSetFromOptions_SeqDense_ABt(C);CHKERRQ(ierr);
23374222ddf1SHong Zhang     break;
23384222ddf1SHong Zhang   case MATPRODUCT_PtAP:
23395aae2c7aSStefano Zampini   case MATPRODUCT_RARt:
23404222ddf1SHong Zhang     ierr = MatProductSetFromOptions_SeqDense_PtAP(C);CHKERRQ(ierr);
23414222ddf1SHong Zhang     break;
2342544a5e07SHong Zhang   default: SETERRQ1(PetscObjectComm((PetscObject)C),PETSC_ERR_SUP,"MatProduct type %s is not supported for SeqDense and SeqDense matrices",MatProductTypes[product->type]);
23434222ddf1SHong Zhang   }
23444222ddf1SHong Zhang   PetscFunctionReturn(0);
23454222ddf1SHong Zhang }
23464222ddf1SHong Zhang /* ----------------------------------------------- */
23474222ddf1SHong Zhang 
2348e0877f53SBarry Smith static PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[])
2349985db425SBarry Smith {
2350985db425SBarry Smith   Mat_SeqDense       *a = (Mat_SeqDense*)A->data;
2351985db425SBarry Smith   PetscErrorCode     ierr;
2352d0f46423SBarry Smith   PetscInt           i,j,m = A->rmap->n,n = A->cmap->n,p;
2353985db425SBarry Smith   PetscScalar        *x;
2354ca15aa20SStefano Zampini   const PetscScalar *aa;
2355985db425SBarry Smith 
2356985db425SBarry Smith   PetscFunctionBegin;
2357e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2358985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
2359985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
2360ca15aa20SStefano Zampini   ierr = MatDenseGetArrayRead(A,&aa);CHKERRQ(ierr);
2361e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
2362985db425SBarry Smith   for (i=0; i<m; i++) {
2363985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
2364985db425SBarry Smith     for (j=1; j<n; j++) {
2365ca15aa20SStefano Zampini       if (PetscRealPart(x[i]) < PetscRealPart(aa[i+a->lda*j])) {x[i] = aa[i + a->lda*j]; if (idx) idx[i] = j;}
2366985db425SBarry Smith     }
2367985db425SBarry Smith   }
2368ca15aa20SStefano Zampini   ierr = MatDenseRestoreArrayRead(A,&aa);CHKERRQ(ierr);
2369985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
2370985db425SBarry Smith   PetscFunctionReturn(0);
2371985db425SBarry Smith }
2372985db425SBarry Smith 
2373e0877f53SBarry Smith static PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[])
2374985db425SBarry Smith {
2375985db425SBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
2376985db425SBarry Smith   PetscErrorCode    ierr;
2377d0f46423SBarry Smith   PetscInt          i,j,m = A->rmap->n,n = A->cmap->n,p;
2378985db425SBarry Smith   PetscScalar       *x;
2379985db425SBarry Smith   PetscReal         atmp;
2380ca15aa20SStefano Zampini   const PetscScalar *aa;
2381985db425SBarry Smith 
2382985db425SBarry Smith   PetscFunctionBegin;
2383e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2384985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
2385985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
2386ca15aa20SStefano Zampini   ierr = MatDenseGetArrayRead(A,&aa);CHKERRQ(ierr);
2387e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
2388985db425SBarry Smith   for (i=0; i<m; i++) {
23899189402eSHong Zhang     x[i] = PetscAbsScalar(aa[i]);
2390985db425SBarry Smith     for (j=1; j<n; j++) {
2391ca15aa20SStefano Zampini       atmp = PetscAbsScalar(aa[i+a->lda*j]);
2392985db425SBarry Smith       if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;}
2393985db425SBarry Smith     }
2394985db425SBarry Smith   }
2395ca15aa20SStefano Zampini   ierr = MatDenseRestoreArrayRead(A,&aa);CHKERRQ(ierr);
2396985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
2397985db425SBarry Smith   PetscFunctionReturn(0);
2398985db425SBarry Smith }
2399985db425SBarry Smith 
2400e0877f53SBarry Smith static PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[])
2401985db425SBarry Smith {
2402985db425SBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
2403985db425SBarry Smith   PetscErrorCode    ierr;
2404d0f46423SBarry Smith   PetscInt          i,j,m = A->rmap->n,n = A->cmap->n,p;
2405985db425SBarry Smith   PetscScalar       *x;
2406ca15aa20SStefano Zampini   const PetscScalar *aa;
2407985db425SBarry Smith 
2408985db425SBarry Smith   PetscFunctionBegin;
2409e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2410ca15aa20SStefano Zampini   ierr = MatDenseGetArrayRead(A,&aa);CHKERRQ(ierr);
2411985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
2412985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
2413e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
2414985db425SBarry Smith   for (i=0; i<m; i++) {
2415985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
2416985db425SBarry Smith     for (j=1; j<n; j++) {
2417ca15aa20SStefano Zampini       if (PetscRealPart(x[i]) > PetscRealPart(aa[i+a->lda*j])) {x[i] = aa[i + a->lda*j]; if (idx) idx[i] = j;}
2418985db425SBarry Smith     }
2419985db425SBarry Smith   }
2420985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
2421ca15aa20SStefano Zampini   ierr = MatDenseRestoreArrayRead(A,&aa);CHKERRQ(ierr);
2422985db425SBarry Smith   PetscFunctionReturn(0);
2423985db425SBarry Smith }
2424985db425SBarry Smith 
2425637a0070SStefano Zampini PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col)
24268d0534beSBarry Smith {
24278d0534beSBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
24288d0534beSBarry Smith   PetscErrorCode    ierr;
24298d0534beSBarry Smith   PetscScalar       *x;
2430ca15aa20SStefano Zampini   const PetscScalar *aa;
24318d0534beSBarry Smith 
24328d0534beSBarry Smith   PetscFunctionBegin;
2433e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2434ca15aa20SStefano Zampini   ierr = MatDenseGetArrayRead(A,&aa);CHKERRQ(ierr);
24358d0534beSBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
2436ca15aa20SStefano Zampini   ierr = PetscArraycpy(x,aa+col*a->lda,A->rmap->n);CHKERRQ(ierr);
24378d0534beSBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
2438ca15aa20SStefano Zampini   ierr = MatDenseRestoreArrayRead(A,&aa);CHKERRQ(ierr);
24398d0534beSBarry Smith   PetscFunctionReturn(0);
24408d0534beSBarry Smith }
24418d0534beSBarry Smith 
244252c5f739Sprj- PETSC_INTERN PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms)
24430716a85fSBarry Smith {
24440716a85fSBarry Smith   PetscErrorCode    ierr;
24450716a85fSBarry Smith   PetscInt          i,j,m,n;
24461683a169SBarry Smith   const PetscScalar *a;
24470716a85fSBarry Smith 
24480716a85fSBarry Smith   PetscFunctionBegin;
24490716a85fSBarry Smith   ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr);
2450580bdb30SBarry Smith   ierr = PetscArrayzero(norms,n);CHKERRQ(ierr);
24511683a169SBarry Smith   ierr = MatDenseGetArrayRead(A,&a);CHKERRQ(ierr);
24520716a85fSBarry Smith   if (type == NORM_2) {
24530716a85fSBarry Smith     for (i=0; i<n; i++) {
24540716a85fSBarry Smith       for (j=0; j<m; j++) {
24550716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]*a[j]);
24560716a85fSBarry Smith       }
24570716a85fSBarry Smith       a += m;
24580716a85fSBarry Smith     }
24590716a85fSBarry Smith   } else if (type == NORM_1) {
24600716a85fSBarry Smith     for (i=0; i<n; i++) {
24610716a85fSBarry Smith       for (j=0; j<m; j++) {
24620716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]);
24630716a85fSBarry Smith       }
24640716a85fSBarry Smith       a += m;
24650716a85fSBarry Smith     }
24660716a85fSBarry Smith   } else if (type == NORM_INFINITY) {
24670716a85fSBarry Smith     for (i=0; i<n; i++) {
24680716a85fSBarry Smith       for (j=0; j<m; j++) {
24690716a85fSBarry Smith         norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]);
24700716a85fSBarry Smith       }
24710716a85fSBarry Smith       a += m;
24720716a85fSBarry Smith     }
2473ce94432eSBarry Smith   } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType");
24741683a169SBarry Smith   ierr = MatDenseRestoreArrayRead(A,&a);CHKERRQ(ierr);
24750716a85fSBarry Smith   if (type == NORM_2) {
24768f1a2a5eSBarry Smith     for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]);
24770716a85fSBarry Smith   }
24780716a85fSBarry Smith   PetscFunctionReturn(0);
24790716a85fSBarry Smith }
24800716a85fSBarry Smith 
248173a71a0fSBarry Smith static PetscErrorCode  MatSetRandom_SeqDense(Mat x,PetscRandom rctx)
248273a71a0fSBarry Smith {
248373a71a0fSBarry Smith   PetscErrorCode ierr;
248473a71a0fSBarry Smith   PetscScalar    *a;
2485637a0070SStefano Zampini   PetscInt       lda,m,n,i,j;
248673a71a0fSBarry Smith 
248773a71a0fSBarry Smith   PetscFunctionBegin;
248873a71a0fSBarry Smith   ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr);
2489637a0070SStefano Zampini   ierr = MatDenseGetLDA(x,&lda);CHKERRQ(ierr);
24908c778c55SBarry Smith   ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr);
2491637a0070SStefano Zampini   for (j=0; j<n; j++) {
2492637a0070SStefano Zampini     for (i=0; i<m; i++) {
2493637a0070SStefano Zampini       ierr = PetscRandomGetValue(rctx,a+j*lda+i);CHKERRQ(ierr);
2494637a0070SStefano Zampini     }
249573a71a0fSBarry Smith   }
24968c778c55SBarry Smith   ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr);
249773a71a0fSBarry Smith   PetscFunctionReturn(0);
249873a71a0fSBarry Smith }
249973a71a0fSBarry Smith 
25003b49f96aSBarry Smith static PetscErrorCode MatMissingDiagonal_SeqDense(Mat A,PetscBool  *missing,PetscInt *d)
25013b49f96aSBarry Smith {
25023b49f96aSBarry Smith   PetscFunctionBegin;
25033b49f96aSBarry Smith   *missing = PETSC_FALSE;
25043b49f96aSBarry Smith   PetscFunctionReturn(0);
25053b49f96aSBarry Smith }
250673a71a0fSBarry Smith 
2507ca15aa20SStefano Zampini /* vals is not const */
2508af53bab2SHong Zhang static PetscErrorCode MatDenseGetColumn_SeqDense(Mat A,PetscInt col,PetscScalar **vals)
250986aefd0dSHong Zhang {
2510ca15aa20SStefano Zampini   PetscErrorCode ierr;
251186aefd0dSHong Zhang   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
2512ca15aa20SStefano Zampini   PetscScalar    *v;
251386aefd0dSHong Zhang 
251486aefd0dSHong Zhang   PetscFunctionBegin;
251586aefd0dSHong Zhang   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2516ca15aa20SStefano Zampini   ierr  = MatDenseGetArray(A,&v);CHKERRQ(ierr);
2517ca15aa20SStefano Zampini   *vals = v+col*a->lda;
2518ca15aa20SStefano Zampini   ierr  = MatDenseRestoreArray(A,&v);CHKERRQ(ierr);
251986aefd0dSHong Zhang   PetscFunctionReturn(0);
252086aefd0dSHong Zhang }
252186aefd0dSHong Zhang 
2522af53bab2SHong Zhang static PetscErrorCode MatDenseRestoreColumn_SeqDense(Mat A,PetscScalar **vals)
252386aefd0dSHong Zhang {
252486aefd0dSHong Zhang   PetscFunctionBegin;
252586aefd0dSHong Zhang   *vals = 0; /* user cannot accidently use the array later */
252686aefd0dSHong Zhang   PetscFunctionReturn(0);
252786aefd0dSHong Zhang }
2528abc3b08eSStefano Zampini 
2529289bc588SBarry Smith /* -------------------------------------------------------------------*/
2530a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense,
2531905e6a2fSBarry Smith                                         MatGetRow_SeqDense,
2532905e6a2fSBarry Smith                                         MatRestoreRow_SeqDense,
2533905e6a2fSBarry Smith                                         MatMult_SeqDense,
253497304618SKris Buschelman                                 /*  4*/ MatMultAdd_SeqDense,
25357c922b88SBarry Smith                                         MatMultTranspose_SeqDense,
25367c922b88SBarry Smith                                         MatMultTransposeAdd_SeqDense,
2537db4efbfdSBarry Smith                                         0,
2538db4efbfdSBarry Smith                                         0,
2539db4efbfdSBarry Smith                                         0,
2540db4efbfdSBarry Smith                                 /* 10*/ 0,
2541905e6a2fSBarry Smith                                         MatLUFactor_SeqDense,
2542905e6a2fSBarry Smith                                         MatCholeskyFactor_SeqDense,
254341f059aeSBarry Smith                                         MatSOR_SeqDense,
2544ec8511deSBarry Smith                                         MatTranspose_SeqDense,
254597304618SKris Buschelman                                 /* 15*/ MatGetInfo_SeqDense,
2546905e6a2fSBarry Smith                                         MatEqual_SeqDense,
2547905e6a2fSBarry Smith                                         MatGetDiagonal_SeqDense,
2548905e6a2fSBarry Smith                                         MatDiagonalScale_SeqDense,
2549905e6a2fSBarry Smith                                         MatNorm_SeqDense,
2550c0aa2d19SHong Zhang                                 /* 20*/ MatAssemblyBegin_SeqDense,
2551c0aa2d19SHong Zhang                                         MatAssemblyEnd_SeqDense,
2552905e6a2fSBarry Smith                                         MatSetOption_SeqDense,
2553905e6a2fSBarry Smith                                         MatZeroEntries_SeqDense,
2554d519adbfSMatthew Knepley                                 /* 24*/ MatZeroRows_SeqDense,
2555db4efbfdSBarry Smith                                         0,
2556db4efbfdSBarry Smith                                         0,
2557db4efbfdSBarry Smith                                         0,
2558db4efbfdSBarry Smith                                         0,
25594994cf47SJed Brown                                 /* 29*/ MatSetUp_SeqDense,
2560273d9f13SBarry Smith                                         0,
2561905e6a2fSBarry Smith                                         0,
256273a71a0fSBarry Smith                                         0,
256373a71a0fSBarry Smith                                         0,
2564d519adbfSMatthew Knepley                                 /* 34*/ MatDuplicate_SeqDense,
2565a5ae1ecdSBarry Smith                                         0,
2566a5ae1ecdSBarry Smith                                         0,
2567a5ae1ecdSBarry Smith                                         0,
2568a5ae1ecdSBarry Smith                                         0,
2569d519adbfSMatthew Knepley                                 /* 39*/ MatAXPY_SeqDense,
25707dae84e0SHong Zhang                                         MatCreateSubMatrices_SeqDense,
2571a5ae1ecdSBarry Smith                                         0,
25724b0e389bSBarry Smith                                         MatGetValues_SeqDense,
2573a5ae1ecdSBarry Smith                                         MatCopy_SeqDense,
2574d519adbfSMatthew Knepley                                 /* 44*/ MatGetRowMax_SeqDense,
2575a5ae1ecdSBarry Smith                                         MatScale_SeqDense,
25767d68702bSBarry Smith                                         MatShift_Basic,
2577a5ae1ecdSBarry Smith                                         0,
25783f49a652SStefano Zampini                                         MatZeroRowsColumns_SeqDense,
257973a71a0fSBarry Smith                                 /* 49*/ MatSetRandom_SeqDense,
2580a5ae1ecdSBarry Smith                                         0,
2581a5ae1ecdSBarry Smith                                         0,
2582a5ae1ecdSBarry Smith                                         0,
2583a5ae1ecdSBarry Smith                                         0,
2584d519adbfSMatthew Knepley                                 /* 54*/ 0,
2585a5ae1ecdSBarry Smith                                         0,
2586a5ae1ecdSBarry Smith                                         0,
2587a5ae1ecdSBarry Smith                                         0,
2588a5ae1ecdSBarry Smith                                         0,
2589d519adbfSMatthew Knepley                                 /* 59*/ 0,
2590e03a110bSBarry Smith                                         MatDestroy_SeqDense,
2591e03a110bSBarry Smith                                         MatView_SeqDense,
2592357abbc8SBarry Smith                                         0,
259397304618SKris Buschelman                                         0,
2594d519adbfSMatthew Knepley                                 /* 64*/ 0,
259597304618SKris Buschelman                                         0,
259697304618SKris Buschelman                                         0,
259797304618SKris Buschelman                                         0,
259897304618SKris Buschelman                                         0,
2599d519adbfSMatthew Knepley                                 /* 69*/ MatGetRowMaxAbs_SeqDense,
260097304618SKris Buschelman                                         0,
260197304618SKris Buschelman                                         0,
260297304618SKris Buschelman                                         0,
260397304618SKris Buschelman                                         0,
2604d519adbfSMatthew Knepley                                 /* 74*/ 0,
260597304618SKris Buschelman                                         0,
260697304618SKris Buschelman                                         0,
260797304618SKris Buschelman                                         0,
260897304618SKris Buschelman                                         0,
2609d519adbfSMatthew Knepley                                 /* 79*/ 0,
261097304618SKris Buschelman                                         0,
261197304618SKris Buschelman                                         0,
261297304618SKris Buschelman                                         0,
26135bba2384SShri Abhyankar                                 /* 83*/ MatLoad_SeqDense,
2614637a0070SStefano Zampini                                         MatIsSymmetric_SeqDense,
26151cbb95d3SBarry Smith                                         MatIsHermitian_SeqDense,
2616865e5f61SKris Buschelman                                         0,
2617865e5f61SKris Buschelman                                         0,
2618865e5f61SKris Buschelman                                         0,
26194222ddf1SHong Zhang                                 /* 89*/ 0,
26204222ddf1SHong Zhang                                         0,
2621a9fe9ddaSSatish Balay                                         MatMatMultNumeric_SeqDense_SeqDense,
26224222ddf1SHong Zhang                                         0,
26234222ddf1SHong Zhang                                         0,
26244222ddf1SHong Zhang                                 /* 94*/ 0,
26254222ddf1SHong Zhang                                         0,
26264222ddf1SHong Zhang                                         0,
262769f65d41SStefano Zampini                                         MatMatTransposeMultNumeric_SeqDense_SeqDense,
2628284134d9SBarry Smith                                         0,
26294222ddf1SHong Zhang                                 /* 99*/ MatProductSetFromOptions_SeqDense,
2630284134d9SBarry Smith                                         0,
2631284134d9SBarry Smith                                         0,
2632ba337c44SJed Brown                                         MatConjugate_SeqDense,
2633f73d5cc4SBarry Smith                                         0,
2634ba337c44SJed Brown                                 /*104*/ 0,
2635ba337c44SJed Brown                                         MatRealPart_SeqDense,
2636ba337c44SJed Brown                                         MatImaginaryPart_SeqDense,
2637985db425SBarry Smith                                         0,
2638985db425SBarry Smith                                         0,
26398208b9aeSStefano Zampini                                 /*109*/ 0,
2640985db425SBarry Smith                                         0,
26418d0534beSBarry Smith                                         MatGetRowMin_SeqDense,
2642aabbc4fbSShri Abhyankar                                         MatGetColumnVector_SeqDense,
26433b49f96aSBarry Smith                                         MatMissingDiagonal_SeqDense,
2644aabbc4fbSShri Abhyankar                                 /*114*/ 0,
2645aabbc4fbSShri Abhyankar                                         0,
2646aabbc4fbSShri Abhyankar                                         0,
2647aabbc4fbSShri Abhyankar                                         0,
2648aabbc4fbSShri Abhyankar                                         0,
2649aabbc4fbSShri Abhyankar                                 /*119*/ 0,
2650aabbc4fbSShri Abhyankar                                         0,
2651aabbc4fbSShri Abhyankar                                         0,
26520716a85fSBarry Smith                                         0,
26530716a85fSBarry Smith                                         0,
26540716a85fSBarry Smith                                 /*124*/ 0,
26555df89d91SHong Zhang                                         MatGetColumnNorms_SeqDense,
26565df89d91SHong Zhang                                         0,
26575df89d91SHong Zhang                                         0,
26585df89d91SHong Zhang                                         0,
26595df89d91SHong Zhang                                 /*129*/ 0,
26604222ddf1SHong Zhang                                         0,
26614222ddf1SHong Zhang                                         0,
266275648e8dSHong Zhang                                         MatTransposeMatMultNumeric_SeqDense_SeqDense,
26633964eb88SJed Brown                                         0,
26643964eb88SJed Brown                                 /*134*/ 0,
26653964eb88SJed Brown                                         0,
26663964eb88SJed Brown                                         0,
26673964eb88SJed Brown                                         0,
26683964eb88SJed Brown                                         0,
26693964eb88SJed Brown                                 /*139*/ 0,
2670f9426fe0SMark Adams                                         0,
2671d528f656SJakub Kruzik                                         0,
2672d528f656SJakub Kruzik                                         0,
2673d528f656SJakub Kruzik                                         0,
26744222ddf1SHong Zhang                                         MatCreateMPIMatConcatenateSeqMat_SeqDense,
26754222ddf1SHong Zhang                                 /*145*/ 0,
26764222ddf1SHong Zhang                                         0,
26774222ddf1SHong Zhang                                         0
2678985db425SBarry Smith };
267990ace30eSBarry Smith 
26804b828684SBarry Smith /*@C
2681fafbff53SBarry Smith    MatCreateSeqDense - Creates a sequential dense matrix that
2682d65003e9SLois Curfman McInnes    is stored in column major order (the usual Fortran 77 manner). Many
2683d65003e9SLois Curfman McInnes    of the matrix operations use the BLAS and LAPACK routines.
2684289bc588SBarry Smith 
2685d083f849SBarry Smith    Collective
2686db81eaa0SLois Curfman McInnes 
268720563c6bSBarry Smith    Input Parameters:
2688db81eaa0SLois Curfman McInnes +  comm - MPI communicator, set to PETSC_COMM_SELF
26890c775827SLois Curfman McInnes .  m - number of rows
269018f449edSLois Curfman McInnes .  n - number of columns
26910298fd71SBarry Smith -  data - optional location of matrix data in column major order.  Set data=NULL for PETSc
2692dfc5480cSLois Curfman McInnes    to control all matrix memory allocation.
269320563c6bSBarry Smith 
269420563c6bSBarry Smith    Output Parameter:
269544cd7ae7SLois Curfman McInnes .  A - the matrix
269620563c6bSBarry Smith 
2697b259b22eSLois Curfman McInnes    Notes:
269818f449edSLois Curfman McInnes    The data input variable is intended primarily for Fortran programmers
269918f449edSLois Curfman McInnes    who wish to allocate their own matrix memory space.  Most users should
27000298fd71SBarry Smith    set data=NULL.
270118f449edSLois Curfman McInnes 
2702027ccd11SLois Curfman McInnes    Level: intermediate
2703027ccd11SLois Curfman McInnes 
270469b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues()
270520563c6bSBarry Smith @*/
27067087cfbeSBarry Smith PetscErrorCode  MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A)
2707289bc588SBarry Smith {
2708dfbe8321SBarry Smith   PetscErrorCode ierr;
27093b2fbd54SBarry Smith 
27103a40ed3dSBarry Smith   PetscFunctionBegin;
2711f69a0ea3SMatthew Knepley   ierr = MatCreate(comm,A);CHKERRQ(ierr);
2712f69a0ea3SMatthew Knepley   ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr);
2713273d9f13SBarry Smith   ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr);
2714273d9f13SBarry Smith   ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr);
2715273d9f13SBarry Smith   PetscFunctionReturn(0);
2716273d9f13SBarry Smith }
2717273d9f13SBarry Smith 
2718273d9f13SBarry Smith /*@C
2719273d9f13SBarry Smith    MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements
2720273d9f13SBarry Smith 
2721d083f849SBarry Smith    Collective
2722273d9f13SBarry Smith 
2723273d9f13SBarry Smith    Input Parameters:
27241c4f3114SJed Brown +  B - the matrix
27250298fd71SBarry Smith -  data - the array (or NULL)
2726273d9f13SBarry Smith 
2727273d9f13SBarry Smith    Notes:
2728273d9f13SBarry Smith    The data input variable is intended primarily for Fortran programmers
2729273d9f13SBarry Smith    who wish to allocate their own matrix memory space.  Most users should
2730284134d9SBarry Smith    need not call this routine.
2731273d9f13SBarry Smith 
2732273d9f13SBarry Smith    Level: intermediate
2733273d9f13SBarry Smith 
273469b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA()
2735867c911aSBarry Smith 
2736273d9f13SBarry Smith @*/
27377087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation(Mat B,PetscScalar data[])
2738273d9f13SBarry Smith {
27394ac538c5SBarry Smith   PetscErrorCode ierr;
2740a23d5eceSKris Buschelman 
2741a23d5eceSKris Buschelman   PetscFunctionBegin;
2742*d5ea218eSStefano Zampini   PetscValidHeaderSpecific(B,MAT_CLASSID,1);
27434ac538c5SBarry Smith   ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr);
2744a23d5eceSKris Buschelman   PetscFunctionReturn(0);
2745a23d5eceSKris Buschelman }
2746a23d5eceSKris Buschelman 
27477087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data)
2748a23d5eceSKris Buschelman {
2749273d9f13SBarry Smith   Mat_SeqDense   *b;
2750dfbe8321SBarry Smith   PetscErrorCode ierr;
2751273d9f13SBarry Smith 
2752273d9f13SBarry Smith   PetscFunctionBegin;
2753273d9f13SBarry Smith   B->preallocated = PETSC_TRUE;
2754a868139aSShri Abhyankar 
275534ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr);
275634ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr);
275734ef9618SShri Abhyankar 
2758273d9f13SBarry Smith   b       = (Mat_SeqDense*)B->data;
275986d161a7SShri Abhyankar   b->Mmax = B->rmap->n;
276086d161a7SShri Abhyankar   b->Nmax = B->cmap->n;
276186d161a7SShri Abhyankar   if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n;
276286d161a7SShri Abhyankar 
2763220afb94SBarry Smith   ierr = PetscIntMultError(b->lda,b->Nmax,NULL);CHKERRQ(ierr);
27649e8f95c4SLisandro Dalcin   if (!data) { /* petsc-allocated storage */
27659e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2766e92229d0SSatish Balay     ierr = PetscCalloc1((size_t)b->lda*b->Nmax,&b->v);CHKERRQ(ierr);
27673bb1ff40SBarry Smith     ierr = PetscLogObjectMemory((PetscObject)B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
27682205254eSKarl Rupp 
27699e8f95c4SLisandro Dalcin     b->user_alloc = PETSC_FALSE;
2770273d9f13SBarry Smith   } else { /* user-allocated storage */
27719e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2772273d9f13SBarry Smith     b->v          = data;
2773273d9f13SBarry Smith     b->user_alloc = PETSC_TRUE;
2774273d9f13SBarry Smith   }
27750450473dSBarry Smith   B->assembled = PETSC_TRUE;
2776273d9f13SBarry Smith   PetscFunctionReturn(0);
2777273d9f13SBarry Smith }
2778273d9f13SBarry Smith 
277965b80a83SHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
2780cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat)
27818baccfbdSHong Zhang {
2782d77f618aSHong Zhang   Mat               mat_elemental;
2783d77f618aSHong Zhang   PetscErrorCode    ierr;
27841683a169SBarry Smith   const PetscScalar *array;
27851683a169SBarry Smith   PetscScalar       *v_colwise;
2786d77f618aSHong Zhang   PetscInt          M=A->rmap->N,N=A->cmap->N,i,j,k,*rows,*cols;
2787d77f618aSHong Zhang 
27888baccfbdSHong Zhang   PetscFunctionBegin;
2789d77f618aSHong Zhang   ierr = PetscMalloc3(M*N,&v_colwise,M,&rows,N,&cols);CHKERRQ(ierr);
27901683a169SBarry Smith   ierr = MatDenseGetArrayRead(A,&array);CHKERRQ(ierr);
2791d77f618aSHong Zhang   /* convert column-wise array into row-wise v_colwise, see MatSetValues_Elemental() */
2792d77f618aSHong Zhang   k = 0;
2793d77f618aSHong Zhang   for (j=0; j<N; j++) {
2794d77f618aSHong Zhang     cols[j] = j;
2795d77f618aSHong Zhang     for (i=0; i<M; i++) {
2796d77f618aSHong Zhang       v_colwise[j*M+i] = array[k++];
2797d77f618aSHong Zhang     }
2798d77f618aSHong Zhang   }
2799d77f618aSHong Zhang   for (i=0; i<M; i++) {
2800d77f618aSHong Zhang     rows[i] = i;
2801d77f618aSHong Zhang   }
28021683a169SBarry Smith   ierr = MatDenseRestoreArrayRead(A,&array);CHKERRQ(ierr);
2803d77f618aSHong Zhang 
2804d77f618aSHong Zhang   ierr = MatCreate(PetscObjectComm((PetscObject)A), &mat_elemental);CHKERRQ(ierr);
2805d77f618aSHong Zhang   ierr = MatSetSizes(mat_elemental,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr);
2806d77f618aSHong Zhang   ierr = MatSetType(mat_elemental,MATELEMENTAL);CHKERRQ(ierr);
2807d77f618aSHong Zhang   ierr = MatSetUp(mat_elemental);CHKERRQ(ierr);
2808d77f618aSHong Zhang 
2809d77f618aSHong Zhang   /* PETSc-Elemental interaface uses axpy for setting off-processor entries, only ADD_VALUES is allowed */
2810d77f618aSHong Zhang   ierr = MatSetValues(mat_elemental,M,rows,N,cols,v_colwise,ADD_VALUES);CHKERRQ(ierr);
2811d77f618aSHong Zhang   ierr = MatAssemblyBegin(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2812d77f618aSHong Zhang   ierr = MatAssemblyEnd(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2813d77f618aSHong Zhang   ierr = PetscFree3(v_colwise,rows,cols);CHKERRQ(ierr);
2814d77f618aSHong Zhang 
2815511c6705SHong Zhang   if (reuse == MAT_INPLACE_MATRIX) {
281628be2f97SBarry Smith     ierr = MatHeaderReplace(A,&mat_elemental);CHKERRQ(ierr);
2817d77f618aSHong Zhang   } else {
2818d77f618aSHong Zhang     *newmat = mat_elemental;
2819d77f618aSHong Zhang   }
28208baccfbdSHong Zhang   PetscFunctionReturn(0);
28218baccfbdSHong Zhang }
282265b80a83SHong Zhang #endif
28238baccfbdSHong Zhang 
28241b807ce4Svictorle /*@C
28251b807ce4Svictorle   MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array
28261b807ce4Svictorle 
28271b807ce4Svictorle   Input parameter:
28281b807ce4Svictorle + A - the matrix
28291b807ce4Svictorle - lda - the leading dimension
28301b807ce4Svictorle 
28311b807ce4Svictorle   Notes:
2832867c911aSBarry Smith   This routine is to be used in conjunction with MatSeqDenseSetPreallocation();
28331b807ce4Svictorle   it asserts that the preallocation has a leading dimension (the LDA parameter
28341b807ce4Svictorle   of Blas and Lapack fame) larger than M, the first dimension of the matrix.
28351b807ce4Svictorle 
28361b807ce4Svictorle   Level: intermediate
28371b807ce4Svictorle 
2838284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize()
2839867c911aSBarry Smith 
28401b807ce4Svictorle @*/
28417087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetLDA(Mat B,PetscInt lda)
28421b807ce4Svictorle {
28431b807ce4Svictorle   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
2844*d5ea218eSStefano Zampini   PetscBool      flg;
2845*d5ea218eSStefano Zampini   PetscErrorCode ierr;
284621a2c019SBarry Smith 
28471b807ce4Svictorle   PetscFunctionBegin;
2848*d5ea218eSStefano Zampini   PetscValidHeaderSpecific(B,MAT_CLASSID,1);
2849*d5ea218eSStefano Zampini   ierr = PetscObjectTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATSEQDENSECUDA,"");CHKERRQ(ierr);
2850*d5ea218eSStefano Zampini   if (!flg) PetscFunctionReturn(0);
2851e32f2f54SBarry 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);
28521b807ce4Svictorle   b->lda       = lda;
285321a2c019SBarry Smith   b->changelda = PETSC_FALSE;
285421a2c019SBarry Smith   b->Mmax      = PetscMax(b->Mmax,lda);
28551b807ce4Svictorle   PetscFunctionReturn(0);
28561b807ce4Svictorle }
28571b807ce4Svictorle 
2858d528f656SJakub Kruzik PetscErrorCode MatCreateMPIMatConcatenateSeqMat_SeqDense(MPI_Comm comm,Mat inmat,PetscInt n,MatReuse scall,Mat *outmat)
2859d528f656SJakub Kruzik {
2860d528f656SJakub Kruzik   PetscErrorCode ierr;
2861d528f656SJakub Kruzik   PetscMPIInt    size;
2862d528f656SJakub Kruzik 
2863d528f656SJakub Kruzik   PetscFunctionBegin;
2864d528f656SJakub Kruzik   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
2865d528f656SJakub Kruzik   if (size == 1) {
2866d528f656SJakub Kruzik     if (scall == MAT_INITIAL_MATRIX) {
2867d528f656SJakub Kruzik       ierr = MatDuplicate(inmat,MAT_COPY_VALUES,outmat);CHKERRQ(ierr);
2868d528f656SJakub Kruzik     } else {
2869d528f656SJakub Kruzik       ierr = MatCopy(inmat,*outmat,SAME_NONZERO_PATTERN);CHKERRQ(ierr);
2870d528f656SJakub Kruzik     }
2871d528f656SJakub Kruzik   } else {
2872d528f656SJakub Kruzik     ierr = MatCreateMPIMatConcatenateSeqMat_MPIDense(comm,inmat,n,scall,outmat);CHKERRQ(ierr);
2873d528f656SJakub Kruzik   }
2874d528f656SJakub Kruzik   PetscFunctionReturn(0);
2875d528f656SJakub Kruzik }
2876d528f656SJakub Kruzik 
28776947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVec_SeqDense(Mat A,PetscInt col,Vec *v)
28786947451fSStefano Zampini {
28796947451fSStefano Zampini   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
28806947451fSStefano Zampini   PetscErrorCode ierr;
28816947451fSStefano Zampini 
28826947451fSStefano Zampini   PetscFunctionBegin;
28836947451fSStefano Zampini   if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec first");
28846947451fSStefano Zampini   if (!a->cvec) {
28856947451fSStefano Zampini     ierr = VecCreateSeqWithArray(PetscObjectComm((PetscObject)A),A->rmap->bs,A->rmap->n,NULL,&a->cvec);CHKERRQ(ierr);
28866947451fSStefano Zampini   }
28876947451fSStefano Zampini   a->vecinuse = col + 1;
28886947451fSStefano Zampini   ierr = MatDenseGetArray(A,(PetscScalar**)&a->ptrinuse);CHKERRQ(ierr);
28896947451fSStefano Zampini   ierr = VecPlaceArray(a->cvec,a->ptrinuse + (size_t)col * (size_t)a->lda);CHKERRQ(ierr);
28906947451fSStefano Zampini   *v   = a->cvec;
28916947451fSStefano Zampini   PetscFunctionReturn(0);
28926947451fSStefano Zampini }
28936947451fSStefano Zampini 
28946947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVec_SeqDense(Mat A,PetscInt col,Vec *v)
28956947451fSStefano Zampini {
28966947451fSStefano Zampini   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
28976947451fSStefano Zampini   PetscErrorCode ierr;
28986947451fSStefano Zampini 
28996947451fSStefano Zampini   PetscFunctionBegin;
29006947451fSStefano Zampini   if (!a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseGetColumnVec first");
29016947451fSStefano Zampini   if (!a->cvec) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing internal column vector");
29026947451fSStefano Zampini   a->vecinuse = 0;
29036947451fSStefano Zampini   ierr = MatDenseRestoreArray(A,(PetscScalar**)&a->ptrinuse);CHKERRQ(ierr);
29046947451fSStefano Zampini   ierr = VecResetArray(a->cvec);CHKERRQ(ierr);
29056947451fSStefano Zampini   *v   = NULL;
29066947451fSStefano Zampini   PetscFunctionReturn(0);
29076947451fSStefano Zampini }
29086947451fSStefano Zampini 
29096947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVecRead_SeqDense(Mat A,PetscInt col,Vec *v)
29106947451fSStefano Zampini {
29116947451fSStefano Zampini   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
29126947451fSStefano Zampini   PetscErrorCode ierr;
29136947451fSStefano Zampini 
29146947451fSStefano Zampini   PetscFunctionBegin;
29156947451fSStefano Zampini   if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec first");
29166947451fSStefano Zampini   if (!a->cvec) {
29176947451fSStefano Zampini     ierr = VecCreateSeqWithArray(PetscObjectComm((PetscObject)A),A->rmap->bs,A->rmap->n,NULL,&a->cvec);CHKERRQ(ierr);
29186947451fSStefano Zampini   }
29196947451fSStefano Zampini   a->vecinuse = col + 1;
29206947451fSStefano Zampini   ierr = MatDenseGetArrayRead(A,&a->ptrinuse);CHKERRQ(ierr);
29216947451fSStefano Zampini   ierr = VecPlaceArray(a->cvec,a->ptrinuse + (size_t)col * (size_t)a->lda);CHKERRQ(ierr);
29226947451fSStefano Zampini   ierr = VecLockReadPush(a->cvec);CHKERRQ(ierr);
29236947451fSStefano Zampini   *v   = a->cvec;
29246947451fSStefano Zampini   PetscFunctionReturn(0);
29256947451fSStefano Zampini }
29266947451fSStefano Zampini 
29276947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVecRead_SeqDense(Mat A,PetscInt col,Vec *v)
29286947451fSStefano Zampini {
29296947451fSStefano Zampini   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
29306947451fSStefano Zampini   PetscErrorCode ierr;
29316947451fSStefano Zampini 
29326947451fSStefano Zampini   PetscFunctionBegin;
29336947451fSStefano Zampini   if (!a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseGetColumnVec first");
29346947451fSStefano Zampini   if (!a->cvec) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing internal column vector");
29356947451fSStefano Zampini   a->vecinuse = 0;
29366947451fSStefano Zampini   ierr = MatDenseRestoreArrayRead(A,&a->ptrinuse);CHKERRQ(ierr);
29376947451fSStefano Zampini   ierr = VecLockReadPop(a->cvec);CHKERRQ(ierr);
29386947451fSStefano Zampini   ierr = VecResetArray(a->cvec);CHKERRQ(ierr);
29396947451fSStefano Zampini   *v   = NULL;
29406947451fSStefano Zampini   PetscFunctionReturn(0);
29416947451fSStefano Zampini }
29426947451fSStefano Zampini 
29436947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVecWrite_SeqDense(Mat A,PetscInt col,Vec *v)
29446947451fSStefano Zampini {
29456947451fSStefano Zampini   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
29466947451fSStefano Zampini   PetscErrorCode ierr;
29476947451fSStefano Zampini 
29486947451fSStefano Zampini   PetscFunctionBegin;
29496947451fSStefano Zampini   if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec first");
29506947451fSStefano Zampini   if (!a->cvec) {
29516947451fSStefano Zampini     ierr = VecCreateSeqWithArray(PetscObjectComm((PetscObject)A),A->rmap->bs,A->rmap->n,NULL,&a->cvec);CHKERRQ(ierr);
29526947451fSStefano Zampini   }
29536947451fSStefano Zampini   a->vecinuse = col + 1;
29546947451fSStefano Zampini   ierr = MatDenseGetArrayWrite(A,(PetscScalar**)&a->ptrinuse);CHKERRQ(ierr);
29556947451fSStefano Zampini   ierr = VecPlaceArray(a->cvec,a->ptrinuse + (size_t)col * (size_t)a->lda);CHKERRQ(ierr);
29566947451fSStefano Zampini   *v   = a->cvec;
29576947451fSStefano Zampini   PetscFunctionReturn(0);
29586947451fSStefano Zampini }
29596947451fSStefano Zampini 
29606947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVecWrite_SeqDense(Mat A,PetscInt col,Vec *v)
29616947451fSStefano Zampini {
29626947451fSStefano Zampini   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
29636947451fSStefano Zampini   PetscErrorCode ierr;
29646947451fSStefano Zampini 
29656947451fSStefano Zampini   PetscFunctionBegin;
29666947451fSStefano Zampini   if (!a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseGetColumnVec first");
29676947451fSStefano Zampini   if (!a->cvec) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing internal column vector");
29686947451fSStefano Zampini   a->vecinuse = 0;
29696947451fSStefano Zampini   ierr = MatDenseRestoreArrayWrite(A,(PetscScalar**)&a->ptrinuse);CHKERRQ(ierr);
29706947451fSStefano Zampini   ierr = VecResetArray(a->cvec);CHKERRQ(ierr);
29716947451fSStefano Zampini   *v   = NULL;
29726947451fSStefano Zampini   PetscFunctionReturn(0);
29736947451fSStefano Zampini }
29746947451fSStefano Zampini 
29750bad9183SKris Buschelman /*MC
2976fafad747SKris Buschelman    MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices.
29770bad9183SKris Buschelman 
29780bad9183SKris Buschelman    Options Database Keys:
29790bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions()
29800bad9183SKris Buschelman 
29810bad9183SKris Buschelman   Level: beginner
29820bad9183SKris Buschelman 
298389665df3SBarry Smith .seealso: MatCreateSeqDense()
298489665df3SBarry Smith 
29850bad9183SKris Buschelman M*/
2986ca15aa20SStefano Zampini PetscErrorCode MatCreate_SeqDense(Mat B)
2987273d9f13SBarry Smith {
2988273d9f13SBarry Smith   Mat_SeqDense   *b;
2989dfbe8321SBarry Smith   PetscErrorCode ierr;
29907c334f02SBarry Smith   PetscMPIInt    size;
2991273d9f13SBarry Smith 
2992273d9f13SBarry Smith   PetscFunctionBegin;
2993ce94432eSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr);
2994e32f2f54SBarry Smith   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1");
299555659b69SBarry Smith 
2996b00a9115SJed Brown   ierr    = PetscNewLog(B,&b);CHKERRQ(ierr);
2997549d3d68SSatish Balay   ierr    = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr);
299844cd7ae7SLois Curfman McInnes   B->data = (void*)b;
299918f449edSLois Curfman McInnes 
3000273d9f13SBarry Smith   b->roworiented = PETSC_TRUE;
30014e220ebcSLois Curfman McInnes 
300249a6ff4bSBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetLDA_C",MatDenseGetLDA_SeqDense);CHKERRQ(ierr);
3003bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr);
30048572280aSBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr);
3005d3042a70SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDensePlaceArray_C",MatDensePlaceArray_SeqDense);CHKERRQ(ierr);
3006d3042a70SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseResetArray_C",MatDenseResetArray_SeqDense);CHKERRQ(ierr);
3007*d5ea218eSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseReplaceArray_C",MatDenseReplaceArray_SeqDense);CHKERRQ(ierr);
30088572280aSBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArrayRead_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr);
3009715b7558SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArrayRead_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr);
30106947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArrayWrite_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr);
30116947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArrayWrite_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr);
3012bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr);
30138baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
30148baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr);
30158baccfbdSHong Zhang #endif
30162bf066beSStefano Zampini #if defined(PETSC_HAVE_CUDA)
30172bf066beSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqdensecuda_C",MatConvert_SeqDense_SeqDenseCUDA);CHKERRQ(ierr);
30184222ddf1SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqdensecuda_seqdensecuda_C",MatProductSetFromOptions_SeqDense);CHKERRQ(ierr);
30194222ddf1SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqdensecuda_seqdense_C",MatProductSetFromOptions_SeqDense);CHKERRQ(ierr);
3020637a0070SStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqdense_seqdensecuda_C",MatProductSetFromOptions_SeqDense);CHKERRQ(ierr);
30214222ddf1SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqaijcusparse_seqdense_C",MatProductSetFromOptions_SeqAIJ_SeqDense);CHKERRQ(ierr);
30222bf066beSStefano Zampini #endif
3023bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr);
30244222ddf1SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqaij_seqdense_C",MatProductSetFromOptions_SeqAIJ_SeqDense);CHKERRQ(ierr);
30254222ddf1SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqdense_seqdense_C",MatProductSetFromOptions_SeqDense);CHKERRQ(ierr);
3026bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
3027bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
30284222ddf1SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqbaij_seqdense_C",MatProductSetFromOptions_SeqXBAIJ_SeqDense);CHKERRQ(ierr);
3029a001520aSPierre Jolivet   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqbaij_seqdense_C",MatMatMultSymbolic_SeqBAIJ_SeqDense);CHKERRQ(ierr);
3030a001520aSPierre Jolivet   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqbaij_seqdense_C",MatMatMultNumeric_SeqBAIJ_SeqDense);CHKERRQ(ierr);
30314222ddf1SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqsbaij_seqdense_C",MatProductSetFromOptions_SeqXBAIJ_SeqDense);CHKERRQ(ierr);
3032c2916339SPierre Jolivet   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqsbaij_seqdense_C",MatMatMultSymbolic_SeqSBAIJ_SeqDense);CHKERRQ(ierr);
3033c2916339SPierre Jolivet   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqsbaij_seqdense_C",MatMatMultNumeric_SeqSBAIJ_SeqDense);CHKERRQ(ierr);
30344099cc6bSBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaijperm_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
30354099cc6bSBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaijperm_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
3036e9e4f4a6SRichard Tran Mills   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaijsell_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
3037e9e4f4a6SRichard Tran Mills   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaijsell_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
303896e6d5c4SRichard Tran Mills   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaijmkl_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
303996e6d5c4SRichard Tran Mills   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaijmkl_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
304052c5f739Sprj-   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_nest_seqdense_C",MatMatMultSymbolic_Nest_Dense);CHKERRQ(ierr);
304152c5f739Sprj-   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_nest_seqdense_C",MatMatMultNumeric_Nest_Dense);CHKERRQ(ierr);
304296e6d5c4SRichard Tran Mills 
30433bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
30443bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaij_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
30454099cc6bSBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaijperm_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
30464099cc6bSBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaijperm_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
3047e9e4f4a6SRichard Tran Mills   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaijsell_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
3048e9e4f4a6SRichard Tran Mills   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaijsell_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
304996e6d5c4SRichard Tran Mills 
305096e6d5c4SRichard Tran Mills   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaijmkl_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
305196e6d5c4SRichard Tran Mills   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaijmkl_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
3052af53bab2SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumn_C",MatDenseGetColumn_SeqDense);CHKERRQ(ierr);
3053af53bab2SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumn_C",MatDenseRestoreColumn_SeqDense);CHKERRQ(ierr);
30546947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumnVec_C",MatDenseGetColumnVec_SeqDense);CHKERRQ(ierr);
30556947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumnVec_C",MatDenseRestoreColumnVec_SeqDense);CHKERRQ(ierr);
30566947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumnVecRead_C",MatDenseGetColumnVecRead_SeqDense);CHKERRQ(ierr);
30576947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumnVecRead_C",MatDenseRestoreColumnVecRead_SeqDense);CHKERRQ(ierr);
30586947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumnVecWrite_C",MatDenseGetColumnVecWrite_SeqDense);CHKERRQ(ierr);
30596947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumnVecWrite_C",MatDenseRestoreColumnVecWrite_SeqDense);CHKERRQ(ierr);
306017667f90SBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr);
30613a40ed3dSBarry Smith   PetscFunctionReturn(0);
3062289bc588SBarry Smith }
306386aefd0dSHong Zhang 
306486aefd0dSHong Zhang /*@C
3065af53bab2SHong Zhang    MatDenseGetColumn - gives access to a column of a dense matrix. This is only the local part of the column. You MUST call MatDenseRestoreColumn() to avoid memory bleeding.
306686aefd0dSHong Zhang 
306786aefd0dSHong Zhang    Not Collective
306886aefd0dSHong Zhang 
306986aefd0dSHong Zhang    Input Parameter:
307086aefd0dSHong Zhang +  mat - a MATSEQDENSE or MATMPIDENSE matrix
307186aefd0dSHong Zhang -  col - column index
307286aefd0dSHong Zhang 
307386aefd0dSHong Zhang    Output Parameter:
307486aefd0dSHong Zhang .  vals - pointer to the data
307586aefd0dSHong Zhang 
307686aefd0dSHong Zhang    Level: intermediate
307786aefd0dSHong Zhang 
307886aefd0dSHong Zhang .seealso: MatDenseRestoreColumn()
307986aefd0dSHong Zhang @*/
308086aefd0dSHong Zhang PetscErrorCode MatDenseGetColumn(Mat A,PetscInt col,PetscScalar **vals)
308186aefd0dSHong Zhang {
308286aefd0dSHong Zhang   PetscErrorCode ierr;
308386aefd0dSHong Zhang 
308486aefd0dSHong Zhang   PetscFunctionBegin;
3085*d5ea218eSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
3086*d5ea218eSStefano Zampini   PetscValidLogicalCollectiveInt(A,col,2);
3087*d5ea218eSStefano Zampini   PetscValidPointer(vals,3);
308886aefd0dSHong Zhang   ierr = PetscUseMethod(A,"MatDenseGetColumn_C",(Mat,PetscInt,PetscScalar**),(A,col,vals));CHKERRQ(ierr);
308986aefd0dSHong Zhang   PetscFunctionReturn(0);
309086aefd0dSHong Zhang }
309186aefd0dSHong Zhang 
309286aefd0dSHong Zhang /*@C
309386aefd0dSHong Zhang    MatDenseRestoreColumn - returns access to a column of a dense matrix which is returned by MatDenseGetColumn().
309486aefd0dSHong Zhang 
309586aefd0dSHong Zhang    Not Collective
309686aefd0dSHong Zhang 
309786aefd0dSHong Zhang    Input Parameter:
309886aefd0dSHong Zhang .  mat - a MATSEQDENSE or MATMPIDENSE matrix
309986aefd0dSHong Zhang 
310086aefd0dSHong Zhang    Output Parameter:
310186aefd0dSHong Zhang .  vals - pointer to the data
310286aefd0dSHong Zhang 
310386aefd0dSHong Zhang    Level: intermediate
310486aefd0dSHong Zhang 
310586aefd0dSHong Zhang .seealso: MatDenseGetColumn()
310686aefd0dSHong Zhang @*/
310786aefd0dSHong Zhang PetscErrorCode MatDenseRestoreColumn(Mat A,PetscScalar **vals)
310886aefd0dSHong Zhang {
310986aefd0dSHong Zhang   PetscErrorCode ierr;
311086aefd0dSHong Zhang 
311186aefd0dSHong Zhang   PetscFunctionBegin;
3112*d5ea218eSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
3113*d5ea218eSStefano Zampini   PetscValidPointer(vals,2);
311486aefd0dSHong Zhang   ierr = PetscUseMethod(A,"MatDenseRestoreColumn_C",(Mat,PetscScalar**),(A,vals));CHKERRQ(ierr);
311586aefd0dSHong Zhang   PetscFunctionReturn(0);
311686aefd0dSHong Zhang }
31176947451fSStefano Zampini 
31186947451fSStefano Zampini /*@C
31196947451fSStefano Zampini    MatDenseGetColumnVec - Gives read-write access to a column of a dense matrix, represented as a Vec.
31206947451fSStefano Zampini 
31216947451fSStefano Zampini    Collective
31226947451fSStefano Zampini 
31236947451fSStefano Zampini    Input Parameter:
31246947451fSStefano Zampini +  mat - the Mat object
31256947451fSStefano Zampini -  col - the column index
31266947451fSStefano Zampini 
31276947451fSStefano Zampini    Output Parameter:
31286947451fSStefano Zampini .  v - the vector
31296947451fSStefano Zampini 
31306947451fSStefano Zampini    Notes:
31316947451fSStefano Zampini      The vector is owned by PETSc. Users need to call MatDenseRestoreColumnVec() when the vector is no longer needed.
31326947451fSStefano Zampini      Use MatDenseGetColumnVecRead() to obtain read-only access or MatDenseGetColumnVecWrite() for write-only access.
31336947451fSStefano Zampini 
31346947451fSStefano Zampini    Level: intermediate
31356947451fSStefano Zampini 
31366947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVecRead(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecRead(), MatDenseRestoreColumnVecWrite()
31376947451fSStefano Zampini @*/
31386947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVec(Mat A,PetscInt col,Vec *v)
31396947451fSStefano Zampini {
31406947451fSStefano Zampini   PetscErrorCode ierr;
31416947451fSStefano Zampini 
31426947451fSStefano Zampini   PetscFunctionBegin;
31436947451fSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
31446947451fSStefano Zampini   PetscValidType(A,1);
31456947451fSStefano Zampini   PetscValidLogicalCollectiveInt(A,col,2);
31466947451fSStefano Zampini   PetscValidPointer(v,3);
31476947451fSStefano Zampini   if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated");
31486947451fSStefano Zampini   if (col < 0 || col > A->cmap->N) SETERRQ2(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid col %D, should be in [0,%D)",col,A->cmap->N);
31496947451fSStefano Zampini   ierr = PetscUseMethod(A,"MatDenseGetColumnVec_C",(Mat,PetscInt,Vec*),(A,col,v));CHKERRQ(ierr);
31506947451fSStefano Zampini   PetscFunctionReturn(0);
31516947451fSStefano Zampini }
31526947451fSStefano Zampini 
31536947451fSStefano Zampini /*@C
31546947451fSStefano Zampini    MatDenseRestoreColumnVec - Returns access to a column of a dense matrix obtained from MatDenseGetColumnVec().
31556947451fSStefano Zampini 
31566947451fSStefano Zampini    Collective
31576947451fSStefano Zampini 
31586947451fSStefano Zampini    Input Parameter:
31596947451fSStefano Zampini +  mat - the Mat object
31606947451fSStefano Zampini .  col - the column index
31616947451fSStefano Zampini -  v - the Vec object
31626947451fSStefano Zampini 
31636947451fSStefano Zampini    Level: intermediate
31646947451fSStefano Zampini 
31656947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecRead(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVecRead(), MatDenseRestoreColumnVecWrite()
31666947451fSStefano Zampini @*/
31676947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVec(Mat A,PetscInt col,Vec *v)
31686947451fSStefano Zampini {
31696947451fSStefano Zampini   PetscErrorCode ierr;
31706947451fSStefano Zampini 
31716947451fSStefano Zampini   PetscFunctionBegin;
31726947451fSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
31736947451fSStefano Zampini   PetscValidType(A,1);
31746947451fSStefano Zampini   PetscValidLogicalCollectiveInt(A,col,2);
31756947451fSStefano Zampini   PetscValidPointer(v,3);
31766947451fSStefano Zampini   if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated");
31776947451fSStefano Zampini   if (col < 0 || col > A->cmap->N) SETERRQ2(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid col %D, should be in [0,%D)",col,A->cmap->N);
31786947451fSStefano Zampini   ierr = PetscUseMethod(A,"MatDenseRestoreColumnVec_C",(Mat,PetscInt,Vec*),(A,col,v));CHKERRQ(ierr);
31796947451fSStefano Zampini   PetscFunctionReturn(0);
31806947451fSStefano Zampini }
31816947451fSStefano Zampini 
31826947451fSStefano Zampini /*@C
31836947451fSStefano Zampini    MatDenseGetColumnVecRead - Gives read-only access to a column of a dense matrix, represented as a Vec.
31846947451fSStefano Zampini 
31856947451fSStefano Zampini    Collective
31866947451fSStefano Zampini 
31876947451fSStefano Zampini    Input Parameter:
31886947451fSStefano Zampini +  mat - the Mat object
31896947451fSStefano Zampini -  col - the column index
31906947451fSStefano Zampini 
31916947451fSStefano Zampini    Output Parameter:
31926947451fSStefano Zampini .  v - the vector
31936947451fSStefano Zampini 
31946947451fSStefano Zampini    Notes:
31956947451fSStefano Zampini      The vector is owned by PETSc and users cannot modify it.
31966947451fSStefano Zampini      Users need to call MatDenseRestoreColumnVecRead() when the vector is no longer needed.
31976947451fSStefano Zampini      Use MatDenseGetColumnVec() to obtain read-write access or MatDenseGetColumnVecWrite() for write-only access.
31986947451fSStefano Zampini 
31996947451fSStefano Zampini    Level: intermediate
32006947451fSStefano Zampini 
32016947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecRead(), MatDenseRestoreColumnVecWrite()
32026947451fSStefano Zampini @*/
32036947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVecRead(Mat A,PetscInt col,Vec *v)
32046947451fSStefano Zampini {
32056947451fSStefano Zampini   PetscErrorCode ierr;
32066947451fSStefano Zampini 
32076947451fSStefano Zampini   PetscFunctionBegin;
32086947451fSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
32096947451fSStefano Zampini   PetscValidType(A,1);
32106947451fSStefano Zampini   PetscValidLogicalCollectiveInt(A,col,2);
32116947451fSStefano Zampini   PetscValidPointer(v,3);
32126947451fSStefano Zampini   if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated");
32136947451fSStefano Zampini   if (col < 0 || col > A->cmap->N) SETERRQ2(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid col %D, should be in [0,%D)",col,A->cmap->N);
32146947451fSStefano Zampini   ierr = PetscUseMethod(A,"MatDenseGetColumnVecRead_C",(Mat,PetscInt,Vec*),(A,col,v));CHKERRQ(ierr);
32156947451fSStefano Zampini   PetscFunctionReturn(0);
32166947451fSStefano Zampini }
32176947451fSStefano Zampini 
32186947451fSStefano Zampini /*@C
32196947451fSStefano Zampini    MatDenseRestoreColumnVecRead - Returns access to a column of a dense matrix obtained from MatDenseGetColumnVecRead().
32206947451fSStefano Zampini 
32216947451fSStefano Zampini    Collective
32226947451fSStefano Zampini 
32236947451fSStefano Zampini    Input Parameter:
32246947451fSStefano Zampini +  mat - the Mat object
32256947451fSStefano Zampini .  col - the column index
32266947451fSStefano Zampini -  v - the Vec object
32276947451fSStefano Zampini 
32286947451fSStefano Zampini    Level: intermediate
32296947451fSStefano Zampini 
32306947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecRead(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecWrite()
32316947451fSStefano Zampini @*/
32326947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVecRead(Mat A,PetscInt col,Vec *v)
32336947451fSStefano Zampini {
32346947451fSStefano Zampini   PetscErrorCode ierr;
32356947451fSStefano Zampini 
32366947451fSStefano Zampini   PetscFunctionBegin;
32376947451fSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
32386947451fSStefano Zampini   PetscValidType(A,1);
32396947451fSStefano Zampini   PetscValidLogicalCollectiveInt(A,col,2);
32406947451fSStefano Zampini   PetscValidPointer(v,3);
32416947451fSStefano Zampini   if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated");
32426947451fSStefano Zampini   if (col < 0 || col > A->cmap->N) SETERRQ2(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid col %D, should be in [0,%D)",col,A->cmap->N);
32436947451fSStefano Zampini   ierr = PetscUseMethod(A,"MatDenseRestoreColumnVecRead_C",(Mat,PetscInt,Vec*),(A,col,v));CHKERRQ(ierr);
32446947451fSStefano Zampini   PetscFunctionReturn(0);
32456947451fSStefano Zampini }
32466947451fSStefano Zampini 
32476947451fSStefano Zampini /*@C
32486947451fSStefano Zampini    MatDenseGetColumnVecWrite - Gives write-only access to a column of a dense matrix, represented as a Vec.
32496947451fSStefano Zampini 
32506947451fSStefano Zampini    Collective
32516947451fSStefano Zampini 
32526947451fSStefano Zampini    Input Parameter:
32536947451fSStefano Zampini +  mat - the Mat object
32546947451fSStefano Zampini -  col - the column index
32556947451fSStefano Zampini 
32566947451fSStefano Zampini    Output Parameter:
32576947451fSStefano Zampini .  v - the vector
32586947451fSStefano Zampini 
32596947451fSStefano Zampini    Notes:
32606947451fSStefano Zampini      The vector is owned by PETSc. Users need to call MatDenseRestoreColumnVecWrite() when the vector is no longer needed.
32616947451fSStefano Zampini      Use MatDenseGetColumnVec() to obtain read-write access or MatDenseGetColumnVecRead() for read-only access.
32626947451fSStefano Zampini 
32636947451fSStefano Zampini    Level: intermediate
32646947451fSStefano Zampini 
32656947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecRead(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecRead(), MatDenseRestoreColumnVecWrite()
32666947451fSStefano Zampini @*/
32676947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVecWrite(Mat A,PetscInt col,Vec *v)
32686947451fSStefano Zampini {
32696947451fSStefano Zampini   PetscErrorCode ierr;
32706947451fSStefano Zampini 
32716947451fSStefano Zampini   PetscFunctionBegin;
32726947451fSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
32736947451fSStefano Zampini   PetscValidType(A,1);
32746947451fSStefano Zampini   PetscValidLogicalCollectiveInt(A,col,2);
32756947451fSStefano Zampini   PetscValidPointer(v,3);
32766947451fSStefano Zampini   if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated");
32776947451fSStefano Zampini   if (col < 0 || col > A->cmap->N) SETERRQ2(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid col %D, should be in [0,%D)",col,A->cmap->N);
32786947451fSStefano Zampini   ierr = PetscUseMethod(A,"MatDenseGetColumnVecWrite_C",(Mat,PetscInt,Vec*),(A,col,v));CHKERRQ(ierr);
32796947451fSStefano Zampini   PetscFunctionReturn(0);
32806947451fSStefano Zampini }
32816947451fSStefano Zampini 
32826947451fSStefano Zampini /*@C
32836947451fSStefano Zampini    MatDenseRestoreColumnVecWrite - Returns access to a column of a dense matrix obtained from MatDenseGetColumnVecWrite().
32846947451fSStefano Zampini 
32856947451fSStefano Zampini    Collective
32866947451fSStefano Zampini 
32876947451fSStefano Zampini    Input Parameter:
32886947451fSStefano Zampini +  mat - the Mat object
32896947451fSStefano Zampini .  col - the column index
32906947451fSStefano Zampini -  v - the Vec object
32916947451fSStefano Zampini 
32926947451fSStefano Zampini    Level: intermediate
32936947451fSStefano Zampini 
32946947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecRead(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecRead()
32956947451fSStefano Zampini @*/
32966947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVecWrite(Mat A,PetscInt col,Vec *v)
32976947451fSStefano Zampini {
32986947451fSStefano Zampini   PetscErrorCode ierr;
32996947451fSStefano Zampini 
33006947451fSStefano Zampini   PetscFunctionBegin;
33016947451fSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
33026947451fSStefano Zampini   PetscValidType(A,1);
33036947451fSStefano Zampini   PetscValidLogicalCollectiveInt(A,col,2);
33046947451fSStefano Zampini   PetscValidPointer(v,3);
33056947451fSStefano Zampini   if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated");
33066947451fSStefano Zampini   if (col < 0 || col > A->cmap->N) SETERRQ2(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid col %D, should be in [0,%D)",col,A->cmap->N);
33076947451fSStefano Zampini   ierr = PetscUseMethod(A,"MatDenseRestoreColumnVecWrite_C",(Mat,PetscInt,Vec*),(A,col,v));CHKERRQ(ierr);
33086947451fSStefano Zampini   PetscFunctionReturn(0);
33096947451fSStefano Zampini }
3310