xref: /petsc/src/mat/impls/dense/seq/dense.c (revision 2a350339cbaefb808cfbe82be4e4f9f98a3f4a84)
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);
299ca0c957dSBarry Smith   ierr = PetscLogFlops(PetscMax(2.0*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;
39723fc5dcaSStefano Zampini   PetscInt       lda = (PetscInt)mat->lda,j,m,nlda = lda;
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);
40223fc5dcaSStefano Zampini   if (cpvalues == MAT_SHARE_NONZERO_PATTERN) { /* propagate LDA */
40323fc5dcaSStefano Zampini     ierr = MatDenseSetLDA(newi,lda);CHKERRQ(ierr);
40423fc5dcaSStefano Zampini   }
4050298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(newi,NULL);CHKERRQ(ierr);
406b24902e0SBarry Smith   if (cpvalues == MAT_COPY_VALUES) {
407ca15aa20SStefano Zampini     const PetscScalar *av;
408ca15aa20SStefano Zampini     PetscScalar       *v;
409ca15aa20SStefano Zampini 
410ca15aa20SStefano Zampini     ierr = MatDenseGetArrayRead(A,&av);CHKERRQ(ierr);
411ca15aa20SStefano Zampini     ierr = MatDenseGetArray(newi,&v);CHKERRQ(ierr);
41223fc5dcaSStefano Zampini     ierr = MatDenseGetLDA(newi,&nlda);CHKERRQ(ierr);
413d0f46423SBarry Smith     m    = A->rmap->n;
41423fc5dcaSStefano Zampini     if (lda>m || nlda>m) {
415d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
41623fc5dcaSStefano Zampini         ierr = PetscArraycpy(v+j*nlda,av+j*lda,m);CHKERRQ(ierr);
417b24902e0SBarry Smith       }
418b24902e0SBarry Smith     } else {
419ca15aa20SStefano Zampini       ierr = PetscArraycpy(v,av,A->rmap->n*A->cmap->n);CHKERRQ(ierr);
420b24902e0SBarry Smith     }
421ca15aa20SStefano Zampini     ierr = MatDenseRestoreArray(newi,&v);CHKERRQ(ierr);
422ca15aa20SStefano Zampini     ierr = MatDenseRestoreArrayRead(A,&av);CHKERRQ(ierr);
423b24902e0SBarry Smith   }
424b24902e0SBarry Smith   PetscFunctionReturn(0);
425b24902e0SBarry Smith }
426b24902e0SBarry Smith 
427ca15aa20SStefano Zampini PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat)
42802cad45dSBarry Smith {
4296849ba73SBarry Smith   PetscErrorCode ierr;
43002cad45dSBarry Smith 
4313a40ed3dSBarry Smith   PetscFunctionBegin;
432ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),newmat);CHKERRQ(ierr);
433d0f46423SBarry Smith   ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
4345c9eb25fSBarry Smith   ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
435719d5645SBarry Smith   ierr = MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues);CHKERRQ(ierr);
436b24902e0SBarry Smith   PetscFunctionReturn(0);
437b24902e0SBarry Smith }
438b24902e0SBarry Smith 
439e0877f53SBarry Smith static PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
440289bc588SBarry Smith {
4414482741eSBarry Smith   MatFactorInfo  info;
442a093e273SMatthew Knepley   PetscErrorCode ierr;
4433a40ed3dSBarry Smith 
4443a40ed3dSBarry Smith   PetscFunctionBegin;
445c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
446f4259b30SLisandro Dalcin   ierr = (*fact->ops->lufactor)(fact,NULL,NULL,&info);CHKERRQ(ierr);
4473a40ed3dSBarry Smith   PetscFunctionReturn(0);
448289bc588SBarry Smith }
4496ee01492SSatish Balay 
450e0877f53SBarry Smith static PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy)
451289bc588SBarry Smith {
452c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
4536849ba73SBarry Smith   PetscErrorCode    ierr;
454f1ceaac6SMatthew G. Knepley   const PetscScalar *x;
455f1ceaac6SMatthew G. Knepley   PetscScalar       *y;
456c5df96a5SBarry Smith   PetscBLASInt      one = 1,info,m;
45767e560aaSBarry Smith 
4583a40ed3dSBarry Smith   PetscFunctionBegin;
459c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
460f1ceaac6SMatthew G. Knepley   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
4611ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
462580bdb30SBarry Smith   ierr = PetscArraycpy(y,x,A->rmap->n);CHKERRQ(ierr);
463d5f3da31SBarry Smith   if (A->factortype == MAT_FACTOR_LU) {
46400121966SStefano Zampini     ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
4658b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
46600121966SStefano Zampini     ierr = PetscFPTrapPop();CHKERRQ(ierr);
467e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
468d5f3da31SBarry Smith   } else if (A->factortype == MAT_FACTOR_CHOLESKY) {
469a49dc2a2SStefano Zampini     if (A->spd) {
47000121966SStefano Zampini       ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
4718b83055fSJed Brown       PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
47200121966SStefano Zampini       ierr = PetscFPTrapPop();CHKERRQ(ierr);
473e32f2f54SBarry Smith       if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
474a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX)
475a49dc2a2SStefano Zampini     } else if (A->hermitian) {
47600121966SStefano Zampini       ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
477a49dc2a2SStefano Zampini       PetscStackCallBLAS("LAPACKhetrs",LAPACKhetrs_("L",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
47800121966SStefano Zampini       ierr = PetscFPTrapPop();CHKERRQ(ierr);
479a49dc2a2SStefano Zampini       if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"HETRS Bad solve");
480a49dc2a2SStefano Zampini #endif
481a49dc2a2SStefano Zampini     } else { /* symmetric case */
48200121966SStefano Zampini       ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
483a49dc2a2SStefano Zampini       PetscStackCallBLAS("LAPACKsytrs",LAPACKsytrs_("L",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
48400121966SStefano Zampini       ierr = PetscFPTrapPop();CHKERRQ(ierr);
485a49dc2a2SStefano Zampini       if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"SYTRS Bad solve");
486a49dc2a2SStefano Zampini     }
4872205254eSKarl Rupp   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
488f1ceaac6SMatthew G. Knepley   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
4891ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
490dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
4913a40ed3dSBarry Smith   PetscFunctionReturn(0);
492289bc588SBarry Smith }
4936ee01492SSatish Balay 
494e0877f53SBarry Smith static PetscErrorCode MatMatSolve_SeqDense(Mat A,Mat B,Mat X)
49585e2c93fSHong Zhang {
49685e2c93fSHong Zhang   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
49785e2c93fSHong Zhang   PetscErrorCode    ierr;
4981683a169SBarry Smith   const PetscScalar *b;
4991683a169SBarry Smith   PetscScalar       *x;
500efb80c78SLisandro Dalcin   PetscInt          n;
501783b601eSJed Brown   PetscBLASInt      nrhs,info,m;
50285e2c93fSHong Zhang 
50385e2c93fSHong Zhang   PetscFunctionBegin;
504c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
5050298fd71SBarry Smith   ierr = MatGetSize(B,NULL,&n);CHKERRQ(ierr);
506c5df96a5SBarry Smith   ierr = PetscBLASIntCast(n,&nrhs);CHKERRQ(ierr);
5071683a169SBarry Smith   ierr = MatDenseGetArrayRead(B,&b);CHKERRQ(ierr);
5088c778c55SBarry Smith   ierr = MatDenseGetArray(X,&x);CHKERRQ(ierr);
50985e2c93fSHong Zhang 
510580bdb30SBarry Smith   ierr = PetscArraycpy(x,b,m*nrhs);CHKERRQ(ierr);
51185e2c93fSHong Zhang 
51285e2c93fSHong Zhang   if (A->factortype == MAT_FACTOR_LU) {
51300121966SStefano Zampini     ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
5148b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info));
51500121966SStefano Zampini     ierr = PetscFPTrapPop();CHKERRQ(ierr);
51685e2c93fSHong Zhang     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
51785e2c93fSHong Zhang   } else if (A->factortype == MAT_FACTOR_CHOLESKY) {
518a49dc2a2SStefano Zampini     if (A->spd) {
51900121966SStefano Zampini       ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
5208b83055fSJed Brown       PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info));
52100121966SStefano Zampini       ierr = PetscFPTrapPop();CHKERRQ(ierr);
52285e2c93fSHong Zhang       if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
523a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX)
524a49dc2a2SStefano Zampini     } else if (A->hermitian) {
52500121966SStefano Zampini       ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
526a49dc2a2SStefano Zampini       PetscStackCallBLAS("LAPACKhetrs",LAPACKhetrs_("L",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info));
52700121966SStefano Zampini       ierr = PetscFPTrapPop();CHKERRQ(ierr);
528a49dc2a2SStefano Zampini       if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"HETRS Bad solve");
529a49dc2a2SStefano Zampini #endif
530a49dc2a2SStefano Zampini     } else { /* symmetric case */
53100121966SStefano Zampini       ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
532a49dc2a2SStefano Zampini       PetscStackCallBLAS("LAPACKsytrs",LAPACKsytrs_("L",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info));
53300121966SStefano Zampini       ierr = PetscFPTrapPop();CHKERRQ(ierr);
534a49dc2a2SStefano Zampini       if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"SYTRS Bad solve");
535a49dc2a2SStefano Zampini     }
5362205254eSKarl Rupp   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
53785e2c93fSHong Zhang 
5381683a169SBarry Smith   ierr = MatDenseRestoreArrayRead(B,&b);CHKERRQ(ierr);
5398c778c55SBarry Smith   ierr = MatDenseRestoreArray(X,&x);CHKERRQ(ierr);
54085e2c93fSHong Zhang   ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr);
54185e2c93fSHong Zhang   PetscFunctionReturn(0);
54285e2c93fSHong Zhang }
54385e2c93fSHong Zhang 
54400121966SStefano Zampini static PetscErrorCode MatConjugate_SeqDense(Mat);
54500121966SStefano Zampini 
546e0877f53SBarry Smith static PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy)
547da3a660dSBarry Smith {
548c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
549dfbe8321SBarry Smith   PetscErrorCode    ierr;
550f1ceaac6SMatthew G. Knepley   const PetscScalar *x;
551f1ceaac6SMatthew G. Knepley   PetscScalar       *y;
552c5df96a5SBarry Smith   PetscBLASInt      one = 1,info,m;
55367e560aaSBarry Smith 
5543a40ed3dSBarry Smith   PetscFunctionBegin;
555c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
556f1ceaac6SMatthew G. Knepley   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
5571ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
558580bdb30SBarry Smith   ierr = PetscArraycpy(y,x,A->rmap->n);CHKERRQ(ierr);
5598208b9aeSStefano Zampini   if (A->factortype == MAT_FACTOR_LU) {
56000121966SStefano Zampini     ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
5618b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
56200121966SStefano Zampini     ierr = PetscFPTrapPop();CHKERRQ(ierr);
563e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve");
5648208b9aeSStefano Zampini   } else if (A->factortype == MAT_FACTOR_CHOLESKY) {
565a49dc2a2SStefano Zampini     if (A->spd) {
56600121966SStefano Zampini #if defined(PETSC_USE_COMPLEX)
56700121966SStefano Zampini       ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr);
56800121966SStefano Zampini #endif
56900121966SStefano Zampini       ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
5708b83055fSJed Brown       PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
57100121966SStefano Zampini       ierr = PetscFPTrapPop();CHKERRQ(ierr);
57200121966SStefano Zampini #if defined(PETSC_USE_COMPLEX)
57300121966SStefano Zampini       ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr);
57400121966SStefano Zampini #endif
575a49dc2a2SStefano Zampini       if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
576a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX)
577a49dc2a2SStefano Zampini     } else if (A->hermitian) {
57800121966SStefano Zampini       ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr);
57900121966SStefano Zampini       ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
58000121966SStefano Zampini       PetscStackCallBLAS("LAPACKhetrs",LAPACKhetrs_("L",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
58100121966SStefano Zampini       ierr = PetscFPTrapPop();CHKERRQ(ierr);
58200121966SStefano Zampini       ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr);
583ae7cfcebSSatish Balay #endif
584a49dc2a2SStefano Zampini     } else { /* symmetric case */
58500121966SStefano Zampini       ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
586a49dc2a2SStefano Zampini       PetscStackCallBLAS("LAPACKsytrs",LAPACKsytrs_("L",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
58700121966SStefano Zampini       ierr = PetscFPTrapPop();CHKERRQ(ierr);
588a49dc2a2SStefano Zampini       if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"SYTRS Bad solve");
589da3a660dSBarry Smith     }
590a49dc2a2SStefano Zampini   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
591f1ceaac6SMatthew G. Knepley   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
5921ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
593dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
5943a40ed3dSBarry Smith   PetscFunctionReturn(0);
595da3a660dSBarry Smith }
5966ee01492SSatish Balay 
597db4efbfdSBarry Smith /* ---------------------------------------------------------------*/
598db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots,
599db4efbfdSBarry Smith    rather than put it in the Mat->row slot.*/
600ca15aa20SStefano Zampini PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo)
601db4efbfdSBarry Smith {
602db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
603db4efbfdSBarry Smith   PetscErrorCode ierr;
604db4efbfdSBarry Smith   PetscBLASInt   n,m,info;
605db4efbfdSBarry Smith 
606db4efbfdSBarry Smith   PetscFunctionBegin;
607c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
608c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
609db4efbfdSBarry Smith   if (!mat->pivots) {
6108208b9aeSStefano Zampini     ierr = PetscMalloc1(A->rmap->n,&mat->pivots);CHKERRQ(ierr);
6113bb1ff40SBarry Smith     ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr);
612db4efbfdSBarry Smith   }
613db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
6148e57ea43SSatish Balay   ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
6158b83055fSJed Brown   PetscStackCallBLAS("LAPACKgetrf",LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info));
6168e57ea43SSatish Balay   ierr = PetscFPTrapPop();CHKERRQ(ierr);
6178e57ea43SSatish Balay 
618e32f2f54SBarry Smith   if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization");
619e32f2f54SBarry Smith   if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization");
6208208b9aeSStefano Zampini 
621db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
6228208b9aeSStefano Zampini   A->ops->matsolve          = MatMatSolve_SeqDense;
623db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
624d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_LU;
625db4efbfdSBarry Smith 
626f6224b95SHong Zhang   ierr = PetscFree(A->solvertype);CHKERRQ(ierr);
627f6224b95SHong Zhang   ierr = PetscStrallocpy(MATSOLVERPETSC,&A->solvertype);CHKERRQ(ierr);
628f6224b95SHong Zhang 
629dc0b31edSSatish Balay   ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr);
630db4efbfdSBarry Smith   PetscFunctionReturn(0);
631db4efbfdSBarry Smith }
632db4efbfdSBarry Smith 
633a49dc2a2SStefano Zampini /* Cholesky as L*L^T or L*D*L^T and the symmetric/hermitian complex variants */
634ca15aa20SStefano Zampini PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo)
635db4efbfdSBarry Smith {
636db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
637db4efbfdSBarry Smith   PetscErrorCode ierr;
638c5df96a5SBarry Smith   PetscBLASInt   info,n;
639db4efbfdSBarry Smith 
640db4efbfdSBarry Smith   PetscFunctionBegin;
641c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
642db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
643a49dc2a2SStefano Zampini   if (A->spd) {
64400121966SStefano Zampini     ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
6458b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrf",LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info));
64600121966SStefano Zampini     ierr = PetscFPTrapPop();CHKERRQ(ierr);
647a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX)
648a49dc2a2SStefano Zampini   } else if (A->hermitian) {
649a49dc2a2SStefano Zampini     if (!mat->pivots) {
650a49dc2a2SStefano Zampini       ierr = PetscMalloc1(A->rmap->n,&mat->pivots);CHKERRQ(ierr);
651a49dc2a2SStefano Zampini       ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr);
652a49dc2a2SStefano Zampini     }
653a49dc2a2SStefano Zampini     if (!mat->fwork) {
654a49dc2a2SStefano Zampini       PetscScalar dummy;
655a49dc2a2SStefano Zampini 
656a49dc2a2SStefano Zampini       mat->lfwork = -1;
65700121966SStefano Zampini       ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
658a49dc2a2SStefano Zampini       PetscStackCallBLAS("LAPACKhetrf",LAPACKhetrf_("L",&n,mat->v,&mat->lda,mat->pivots,&dummy,&mat->lfwork,&info));
65900121966SStefano Zampini       ierr = PetscFPTrapPop();CHKERRQ(ierr);
660a49dc2a2SStefano Zampini       mat->lfwork = (PetscInt)PetscRealPart(dummy);
661a49dc2a2SStefano Zampini       ierr = PetscMalloc1(mat->lfwork,&mat->fwork);CHKERRQ(ierr);
662a49dc2a2SStefano Zampini       ierr = PetscLogObjectMemory((PetscObject)A,mat->lfwork*sizeof(PetscBLASInt));CHKERRQ(ierr);
663a49dc2a2SStefano Zampini     }
66400121966SStefano Zampini     ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
665a49dc2a2SStefano Zampini     PetscStackCallBLAS("LAPACKhetrf",LAPACKhetrf_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&mat->lfwork,&info));
66600121966SStefano Zampini     ierr = PetscFPTrapPop();CHKERRQ(ierr);
667a49dc2a2SStefano Zampini #endif
668a49dc2a2SStefano Zampini   } else { /* symmetric case */
669a49dc2a2SStefano Zampini     if (!mat->pivots) {
670a49dc2a2SStefano Zampini       ierr = PetscMalloc1(A->rmap->n,&mat->pivots);CHKERRQ(ierr);
671a49dc2a2SStefano Zampini       ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr);
672a49dc2a2SStefano Zampini     }
673a49dc2a2SStefano Zampini     if (!mat->fwork) {
674a49dc2a2SStefano Zampini       PetscScalar dummy;
675a49dc2a2SStefano Zampini 
676a49dc2a2SStefano Zampini       mat->lfwork = -1;
67700121966SStefano Zampini       ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
678a49dc2a2SStefano Zampini       PetscStackCallBLAS("LAPACKsytrf",LAPACKsytrf_("L",&n,mat->v,&mat->lda,mat->pivots,&dummy,&mat->lfwork,&info));
67900121966SStefano Zampini       ierr = PetscFPTrapPop();CHKERRQ(ierr);
680a49dc2a2SStefano Zampini       mat->lfwork = (PetscInt)PetscRealPart(dummy);
681a49dc2a2SStefano Zampini       ierr = PetscMalloc1(mat->lfwork,&mat->fwork);CHKERRQ(ierr);
682a49dc2a2SStefano Zampini       ierr = PetscLogObjectMemory((PetscObject)A,mat->lfwork*sizeof(PetscBLASInt));CHKERRQ(ierr);
683a49dc2a2SStefano Zampini     }
68400121966SStefano Zampini     ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
685a49dc2a2SStefano Zampini     PetscStackCallBLAS("LAPACKsytrf",LAPACKsytrf_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&mat->lfwork,&info));
68600121966SStefano Zampini     ierr = PetscFPTrapPop();CHKERRQ(ierr);
687a49dc2a2SStefano Zampini   }
688e32f2f54SBarry Smith   if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1);
6898208b9aeSStefano Zampini 
690db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
6918208b9aeSStefano Zampini   A->ops->matsolve          = MatMatSolve_SeqDense;
692db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
693d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_CHOLESKY;
6942205254eSKarl Rupp 
695f6224b95SHong Zhang   ierr = PetscFree(A->solvertype);CHKERRQ(ierr);
696f6224b95SHong Zhang   ierr = PetscStrallocpy(MATSOLVERPETSC,&A->solvertype);CHKERRQ(ierr);
697f6224b95SHong Zhang 
698eb3f19e4SBarry Smith   ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr);
699db4efbfdSBarry Smith   PetscFunctionReturn(0);
700db4efbfdSBarry Smith }
701db4efbfdSBarry Smith 
7020481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
703db4efbfdSBarry Smith {
704db4efbfdSBarry Smith   PetscErrorCode ierr;
705db4efbfdSBarry Smith   MatFactorInfo  info;
706db4efbfdSBarry Smith 
707db4efbfdSBarry Smith   PetscFunctionBegin;
708db4efbfdSBarry Smith   info.fill = 1.0;
7092205254eSKarl Rupp 
710c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
711f4259b30SLisandro Dalcin   ierr = (*fact->ops->choleskyfactor)(fact,NULL,&info);CHKERRQ(ierr);
712db4efbfdSBarry Smith   PetscFunctionReturn(0);
713db4efbfdSBarry Smith }
714db4efbfdSBarry Smith 
715ca15aa20SStefano Zampini PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info)
716db4efbfdSBarry Smith {
717db4efbfdSBarry Smith   PetscFunctionBegin;
718c3ef05f6SHong Zhang   fact->assembled                  = PETSC_TRUE;
7191bbcc794SSatish Balay   fact->preallocated               = PETSC_TRUE;
720719d5645SBarry Smith   fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense;
721bd443b22SStefano Zampini   fact->ops->solve                 = MatSolve_SeqDense;
722bd443b22SStefano Zampini   fact->ops->matsolve              = MatMatSolve_SeqDense;
723bd443b22SStefano Zampini   fact->ops->solvetranspose        = MatSolveTranspose_SeqDense;
724db4efbfdSBarry Smith   PetscFunctionReturn(0);
725db4efbfdSBarry Smith }
726db4efbfdSBarry Smith 
727ca15aa20SStefano Zampini PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info)
728db4efbfdSBarry Smith {
729db4efbfdSBarry Smith   PetscFunctionBegin;
730b66fe19dSMatthew G Knepley   fact->preallocated           = PETSC_TRUE;
731c3ef05f6SHong Zhang   fact->assembled              = PETSC_TRUE;
732719d5645SBarry Smith   fact->ops->lufactornumeric   = MatLUFactorNumeric_SeqDense;
733bd443b22SStefano Zampini   fact->ops->solve             = MatSolve_SeqDense;
734bd443b22SStefano Zampini   fact->ops->matsolve          = MatMatSolve_SeqDense;
735bd443b22SStefano Zampini   fact->ops->solvetranspose    = MatSolveTranspose_SeqDense;
736db4efbfdSBarry Smith   PetscFunctionReturn(0);
737db4efbfdSBarry Smith }
738db4efbfdSBarry Smith 
739ca15aa20SStefano Zampini /* uses LAPACK */
740cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact)
741db4efbfdSBarry Smith {
742db4efbfdSBarry Smith   PetscErrorCode ierr;
743db4efbfdSBarry Smith 
744db4efbfdSBarry Smith   PetscFunctionBegin;
745ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),fact);CHKERRQ(ierr);
746db4efbfdSBarry Smith   ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
747ca15aa20SStefano Zampini   ierr = MatSetType(*fact,MATDENSE);CHKERRQ(ierr);
748*2a350339SBarry Smith   if (ftype == MAT_FACTOR_LU || ftype == MAT_FACTOR_ILU) {
749db4efbfdSBarry Smith     (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense;
750*2a350339SBarry Smith     (*fact)->ops->ilufactorsymbolic = MatLUFactorSymbolic_SeqDense;
751db4efbfdSBarry Smith   } else {
752db4efbfdSBarry Smith     (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense;
753db4efbfdSBarry Smith   }
754d5f3da31SBarry Smith   (*fact)->factortype = ftype;
75500c67f3bSHong Zhang 
75600c67f3bSHong Zhang   ierr = PetscFree((*fact)->solvertype);CHKERRQ(ierr);
75700c67f3bSHong Zhang   ierr = PetscStrallocpy(MATSOLVERPETSC,&(*fact)->solvertype);CHKERRQ(ierr);
758db4efbfdSBarry Smith   PetscFunctionReturn(0);
759db4efbfdSBarry Smith }
760db4efbfdSBarry Smith 
761289bc588SBarry Smith /* ------------------------------------------------------------------*/
762e0877f53SBarry Smith static PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx)
763289bc588SBarry Smith {
764c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
765d9ca1df4SBarry Smith   PetscScalar       *x,*v = mat->v,zero = 0.0,xt;
766d9ca1df4SBarry Smith   const PetscScalar *b;
767dfbe8321SBarry Smith   PetscErrorCode    ierr;
768d0f46423SBarry Smith   PetscInt          m = A->rmap->n,i;
769c5df96a5SBarry Smith   PetscBLASInt      o = 1,bm;
770289bc588SBarry Smith 
7713a40ed3dSBarry Smith   PetscFunctionBegin;
772ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA)
773c70f7ee4SJunchao Zhang   if (A->offloadmask == PETSC_OFFLOAD_GPU) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Not implemented");
774ca15aa20SStefano Zampini #endif
775422a814eSBarry Smith   if (shift == -1) shift = 0.0; /* negative shift indicates do not error on zero diagonal; this code never zeros on zero diagonal */
776c5df96a5SBarry Smith   ierr = PetscBLASIntCast(m,&bm);CHKERRQ(ierr);
777289bc588SBarry Smith   if (flag & SOR_ZERO_INITIAL_GUESS) {
7783bffc371SBarry Smith     /* this is a hack fix, should have another version without the second BLASdotu */
7792dcb1b2aSMatthew Knepley     ierr = VecSet(xx,zero);CHKERRQ(ierr);
780289bc588SBarry Smith   }
7811ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
782d9ca1df4SBarry Smith   ierr = VecGetArrayRead(bb,&b);CHKERRQ(ierr);
783b965ef7fSBarry Smith   its  = its*lits;
784e32f2f54SBarry 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);
785289bc588SBarry Smith   while (its--) {
786fccaa45eSBarry Smith     if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) {
787289bc588SBarry Smith       for (i=0; i<m; i++) {
7883bffc371SBarry Smith         PetscStackCallBLAS("BLASdotu",xt   = b[i] - BLASdotu_(&bm,v+i,&bm,x,&o));
78955a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
790289bc588SBarry Smith       }
791289bc588SBarry Smith     }
792fccaa45eSBarry Smith     if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) {
793289bc588SBarry Smith       for (i=m-1; i>=0; i--) {
7943bffc371SBarry Smith         PetscStackCallBLAS("BLASdotu",xt   = b[i] - BLASdotu_(&bm,v+i,&bm,x,&o));
79555a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
796289bc588SBarry Smith       }
797289bc588SBarry Smith     }
798289bc588SBarry Smith   }
799d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(bb,&b);CHKERRQ(ierr);
8001ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
8013a40ed3dSBarry Smith   PetscFunctionReturn(0);
802289bc588SBarry Smith }
803289bc588SBarry Smith 
804289bc588SBarry Smith /* -----------------------------------------------------------------*/
805ca15aa20SStefano Zampini PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy)
806289bc588SBarry Smith {
807c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
808d9ca1df4SBarry Smith   const PetscScalar *v   = mat->v,*x;
809d9ca1df4SBarry Smith   PetscScalar       *y;
810dfbe8321SBarry Smith   PetscErrorCode    ierr;
8110805154bSBarry Smith   PetscBLASInt      m, n,_One=1;
812ea709b57SSatish Balay   PetscScalar       _DOne=1.0,_DZero=0.0;
8133a40ed3dSBarry Smith 
8143a40ed3dSBarry Smith   PetscFunctionBegin;
815c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
816c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
817d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
8182bf066beSStefano Zampini   ierr = VecGetArrayWrite(yy,&y);CHKERRQ(ierr);
8195ac36cfcSBarry Smith   if (!A->rmap->n || !A->cmap->n) {
8205ac36cfcSBarry Smith     PetscBLASInt i;
8215ac36cfcSBarry Smith     for (i=0; i<n; i++) y[i] = 0.0;
8225ac36cfcSBarry Smith   } else {
8238b83055fSJed Brown     PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One));
8245ac36cfcSBarry Smith     ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
8255ac36cfcSBarry Smith   }
826d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
8272bf066beSStefano Zampini   ierr = VecRestoreArrayWrite(yy,&y);CHKERRQ(ierr);
8283a40ed3dSBarry Smith   PetscFunctionReturn(0);
829289bc588SBarry Smith }
830800995b7SMatthew Knepley 
831ca15aa20SStefano Zampini PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy)
832289bc588SBarry Smith {
833c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
834d9ca1df4SBarry Smith   PetscScalar       *y,_DOne=1.0,_DZero=0.0;
835dfbe8321SBarry Smith   PetscErrorCode    ierr;
8360805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
837d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
8383a40ed3dSBarry Smith 
8393a40ed3dSBarry Smith   PetscFunctionBegin;
840c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
841c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
842d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
8432bf066beSStefano Zampini   ierr = VecGetArrayWrite(yy,&y);CHKERRQ(ierr);
8445ac36cfcSBarry Smith   if (!A->rmap->n || !A->cmap->n) {
8455ac36cfcSBarry Smith     PetscBLASInt i;
8465ac36cfcSBarry Smith     for (i=0; i<m; i++) y[i] = 0.0;
8475ac36cfcSBarry Smith   } else {
8488b83055fSJed Brown     PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One));
8495ac36cfcSBarry Smith     ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr);
8505ac36cfcSBarry Smith   }
851d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
8522bf066beSStefano Zampini   ierr = VecRestoreArrayWrite(yy,&y);CHKERRQ(ierr);
8533a40ed3dSBarry Smith   PetscFunctionReturn(0);
854289bc588SBarry Smith }
8556ee01492SSatish Balay 
856ca15aa20SStefano Zampini PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
857289bc588SBarry Smith {
858c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
859d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
860d9ca1df4SBarry Smith   PetscScalar       *y,_DOne=1.0;
861dfbe8321SBarry Smith   PetscErrorCode    ierr;
8620805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
8633a40ed3dSBarry Smith 
8643a40ed3dSBarry Smith   PetscFunctionBegin;
865c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
866c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
86717b127eeSStefano Zampini   ierr = VecCopy(zz,yy);CHKERRQ(ierr);
868d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
869d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
8701ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
8718b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
872d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
8731ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
874dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
8753a40ed3dSBarry Smith   PetscFunctionReturn(0);
876289bc588SBarry Smith }
8776ee01492SSatish Balay 
878ca15aa20SStefano Zampini PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
879289bc588SBarry Smith {
880c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
881d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
882d9ca1df4SBarry Smith   PetscScalar       *y;
883dfbe8321SBarry Smith   PetscErrorCode    ierr;
8840805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
88587828ca2SBarry Smith   PetscScalar       _DOne=1.0;
8863a40ed3dSBarry Smith 
8873a40ed3dSBarry Smith   PetscFunctionBegin;
888c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
889c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
89017b127eeSStefano Zampini   ierr = VecCopy(zz,yy);CHKERRQ(ierr);
891d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
892d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
8931ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
8948b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
895d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
8961ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
897dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
8983a40ed3dSBarry Smith   PetscFunctionReturn(0);
899289bc588SBarry Smith }
900289bc588SBarry Smith 
901289bc588SBarry Smith /* -----------------------------------------------------------------*/
902e0877f53SBarry Smith static PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
903289bc588SBarry Smith {
904c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
9056849ba73SBarry Smith   PetscErrorCode ierr;
90613f74950SBarry Smith   PetscInt       i;
90767e560aaSBarry Smith 
9083a40ed3dSBarry Smith   PetscFunctionBegin;
909d0f46423SBarry Smith   *ncols = A->cmap->n;
910289bc588SBarry Smith   if (cols) {
911854ce69bSBarry Smith     ierr = PetscMalloc1(A->cmap->n+1,cols);CHKERRQ(ierr);
912d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) (*cols)[i] = i;
913289bc588SBarry Smith   }
914289bc588SBarry Smith   if (vals) {
915ca15aa20SStefano Zampini     const PetscScalar *v;
916ca15aa20SStefano Zampini 
917ca15aa20SStefano Zampini     ierr = MatDenseGetArrayRead(A,&v);CHKERRQ(ierr);
918854ce69bSBarry Smith     ierr = PetscMalloc1(A->cmap->n+1,vals);CHKERRQ(ierr);
919ca15aa20SStefano Zampini     v   += row;
920d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;}
921ca15aa20SStefano Zampini     ierr = MatDenseRestoreArrayRead(A,&v);CHKERRQ(ierr);
922289bc588SBarry Smith   }
9233a40ed3dSBarry Smith   PetscFunctionReturn(0);
924289bc588SBarry Smith }
9256ee01492SSatish Balay 
926e0877f53SBarry Smith static PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
927289bc588SBarry Smith {
928dfbe8321SBarry Smith   PetscErrorCode ierr;
9296e111a19SKarl Rupp 
930606d414cSSatish Balay   PetscFunctionBegin;
931606d414cSSatish Balay   if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);}
932606d414cSSatish Balay   if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); }
9333a40ed3dSBarry Smith   PetscFunctionReturn(0);
934289bc588SBarry Smith }
935289bc588SBarry Smith /* ----------------------------------------------------------------*/
936e0877f53SBarry Smith static PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv)
937289bc588SBarry Smith {
938c0bbcb79SLois Curfman McInnes   Mat_SeqDense     *mat = (Mat_SeqDense*)A->data;
939ca15aa20SStefano Zampini   PetscScalar      *av;
94013f74950SBarry Smith   PetscInt         i,j,idx=0;
941ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA)
942c70f7ee4SJunchao Zhang   PetscOffloadMask oldf;
943ca15aa20SStefano Zampini #endif
944ca15aa20SStefano Zampini   PetscErrorCode   ierr;
945d6dfbf8fSBarry Smith 
9463a40ed3dSBarry Smith   PetscFunctionBegin;
947ca15aa20SStefano Zampini   ierr = MatDenseGetArray(A,&av);CHKERRQ(ierr);
948289bc588SBarry Smith   if (!mat->roworiented) {
949dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
950289bc588SBarry Smith       for (j=0; j<n; j++) {
951cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
952cf9c20a2SJed 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);
953289bc588SBarry Smith         for (i=0; i<m; i++) {
954cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
955cf9c20a2SJed 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);
956ca15aa20SStefano Zampini           av[indexn[j]*mat->lda + indexm[i]] = v[idx++];
957289bc588SBarry Smith         }
958289bc588SBarry Smith       }
9593a40ed3dSBarry Smith     } else {
960289bc588SBarry Smith       for (j=0; j<n; j++) {
961cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
962cf9c20a2SJed 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);
963289bc588SBarry Smith         for (i=0; i<m; i++) {
964cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
965cf9c20a2SJed 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);
966ca15aa20SStefano Zampini           av[indexn[j]*mat->lda + indexm[i]] += v[idx++];
967289bc588SBarry Smith         }
968289bc588SBarry Smith       }
969289bc588SBarry Smith     }
9703a40ed3dSBarry Smith   } else {
971dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
972e8d4e0b9SBarry Smith       for (i=0; i<m; i++) {
973cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
974cf9c20a2SJed 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);
975e8d4e0b9SBarry Smith         for (j=0; j<n; j++) {
976cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
977cf9c20a2SJed 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);
978ca15aa20SStefano Zampini           av[indexn[j]*mat->lda + indexm[i]] = v[idx++];
979e8d4e0b9SBarry Smith         }
980e8d4e0b9SBarry Smith       }
9813a40ed3dSBarry Smith     } else {
982289bc588SBarry Smith       for (i=0; i<m; i++) {
983cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
984cf9c20a2SJed 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);
985289bc588SBarry Smith         for (j=0; j<n; j++) {
986cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
987cf9c20a2SJed 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);
988ca15aa20SStefano Zampini           av[indexn[j]*mat->lda + indexm[i]] += v[idx++];
989289bc588SBarry Smith         }
990289bc588SBarry Smith       }
991289bc588SBarry Smith     }
992e8d4e0b9SBarry Smith   }
993ca15aa20SStefano Zampini   /* hack to prevent unneeded copy to the GPU while returning the array */
994ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA)
995c70f7ee4SJunchao Zhang   oldf = A->offloadmask;
996c70f7ee4SJunchao Zhang   A->offloadmask = PETSC_OFFLOAD_GPU;
997ca15aa20SStefano Zampini #endif
998ca15aa20SStefano Zampini   ierr = MatDenseRestoreArray(A,&av);CHKERRQ(ierr);
999ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA)
1000c70f7ee4SJunchao Zhang   A->offloadmask = (oldf == PETSC_OFFLOAD_UNALLOCATED ? PETSC_OFFLOAD_UNALLOCATED : PETSC_OFFLOAD_CPU);
1001ca15aa20SStefano Zampini #endif
10023a40ed3dSBarry Smith   PetscFunctionReturn(0);
1003289bc588SBarry Smith }
1004e8d4e0b9SBarry Smith 
1005e0877f53SBarry Smith static PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[])
1006ae80bb75SLois Curfman McInnes {
1007ae80bb75SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
1008ca15aa20SStefano Zampini   const PetscScalar *vv;
100913f74950SBarry Smith   PetscInt          i,j;
1010ca15aa20SStefano Zampini   PetscErrorCode    ierr;
1011ae80bb75SLois Curfman McInnes 
10123a40ed3dSBarry Smith   PetscFunctionBegin;
1013ca15aa20SStefano Zampini   ierr = MatDenseGetArrayRead(A,&vv);CHKERRQ(ierr);
1014ae80bb75SLois Curfman McInnes   /* row-oriented output */
1015ae80bb75SLois Curfman McInnes   for (i=0; i<m; i++) {
101697e567efSBarry Smith     if (indexm[i] < 0) {v += n;continue;}
1017e32f2f54SBarry 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);
1018ae80bb75SLois Curfman McInnes     for (j=0; j<n; j++) {
10196f31f424SBarry Smith       if (indexn[j] < 0) {v++; continue;}
1020e32f2f54SBarry 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);
1021ca15aa20SStefano Zampini       *v++ = vv[indexn[j]*mat->lda + indexm[i]];
1022ae80bb75SLois Curfman McInnes     }
1023ae80bb75SLois Curfman McInnes   }
1024ca15aa20SStefano Zampini   ierr = MatDenseRestoreArrayRead(A,&vv);CHKERRQ(ierr);
10253a40ed3dSBarry Smith   PetscFunctionReturn(0);
1026ae80bb75SLois Curfman McInnes }
1027ae80bb75SLois Curfman McInnes 
1028289bc588SBarry Smith /* -----------------------------------------------------------------*/
1029289bc588SBarry Smith 
10308491ab44SLisandro Dalcin PetscErrorCode MatView_Dense_Binary(Mat mat,PetscViewer viewer)
1031aabbc4fbSShri Abhyankar {
1032aabbc4fbSShri Abhyankar   PetscErrorCode    ierr;
10338491ab44SLisandro Dalcin   PetscBool         skipHeader;
10348491ab44SLisandro Dalcin   PetscViewerFormat format;
10358491ab44SLisandro Dalcin   PetscInt          header[4],M,N,m,lda,i,j,k;
10368491ab44SLisandro Dalcin   const PetscScalar *v;
10378491ab44SLisandro Dalcin   PetscScalar       *vwork;
1038aabbc4fbSShri Abhyankar 
1039aabbc4fbSShri Abhyankar   PetscFunctionBegin;
10408491ab44SLisandro Dalcin   ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr);
10418491ab44SLisandro Dalcin   ierr = PetscViewerBinaryGetSkipHeader(viewer,&skipHeader);CHKERRQ(ierr);
10428491ab44SLisandro Dalcin   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
10438491ab44SLisandro Dalcin   if (skipHeader) format = PETSC_VIEWER_NATIVE;
1044aabbc4fbSShri Abhyankar 
10458491ab44SLisandro Dalcin   ierr = MatGetSize(mat,&M,&N);CHKERRQ(ierr);
10468491ab44SLisandro Dalcin 
10478491ab44SLisandro Dalcin   /* write matrix header */
10488491ab44SLisandro Dalcin   header[0] = MAT_FILE_CLASSID; header[1] = M; header[2] = N;
10498491ab44SLisandro Dalcin   header[3] = (format == PETSC_VIEWER_NATIVE) ? MATRIX_BINARY_FORMAT_DENSE : M*N;
10508491ab44SLisandro Dalcin   if (!skipHeader) {ierr = PetscViewerBinaryWrite(viewer,header,4,PETSC_INT);CHKERRQ(ierr);}
10518491ab44SLisandro Dalcin 
10528491ab44SLisandro Dalcin   ierr = MatGetLocalSize(mat,&m,NULL);CHKERRQ(ierr);
10538491ab44SLisandro Dalcin   if (format != PETSC_VIEWER_NATIVE) {
10548491ab44SLisandro Dalcin     PetscInt nnz = m*N, *iwork;
10558491ab44SLisandro Dalcin     /* store row lengths for each row */
10568491ab44SLisandro Dalcin     ierr = PetscMalloc1(nnz,&iwork);CHKERRQ(ierr);
10578491ab44SLisandro Dalcin     for (i=0; i<m; i++) iwork[i] = N;
10588491ab44SLisandro Dalcin     ierr = PetscViewerBinaryWriteAll(viewer,iwork,m,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_INT);CHKERRQ(ierr);
10598491ab44SLisandro Dalcin     /* store column indices (zero start index) */
10608491ab44SLisandro Dalcin     for (k=0, i=0; i<m; i++)
10618491ab44SLisandro Dalcin       for (j=0; j<N; j++, k++)
10628491ab44SLisandro Dalcin         iwork[k] = j;
10638491ab44SLisandro Dalcin     ierr = PetscViewerBinaryWriteAll(viewer,iwork,nnz,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_INT);CHKERRQ(ierr);
10648491ab44SLisandro Dalcin     ierr = PetscFree(iwork);CHKERRQ(ierr);
10658491ab44SLisandro Dalcin   }
10668491ab44SLisandro Dalcin   /* store matrix values as a dense matrix in row major order */
10678491ab44SLisandro Dalcin   ierr = PetscMalloc1(m*N,&vwork);CHKERRQ(ierr);
10688491ab44SLisandro Dalcin   ierr = MatDenseGetArrayRead(mat,&v);CHKERRQ(ierr);
10698491ab44SLisandro Dalcin   ierr = MatDenseGetLDA(mat,&lda);CHKERRQ(ierr);
10708491ab44SLisandro Dalcin   for (k=0, i=0; i<m; i++)
10718491ab44SLisandro Dalcin     for (j=0; j<N; j++, k++)
10728491ab44SLisandro Dalcin       vwork[k] = v[i+lda*j];
10738491ab44SLisandro Dalcin   ierr = MatDenseRestoreArrayRead(mat,&v);CHKERRQ(ierr);
10748491ab44SLisandro Dalcin   ierr = PetscViewerBinaryWriteAll(viewer,vwork,m*N,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_SCALAR);CHKERRQ(ierr);
10758491ab44SLisandro Dalcin   ierr = PetscFree(vwork);CHKERRQ(ierr);
10768491ab44SLisandro Dalcin   PetscFunctionReturn(0);
10778491ab44SLisandro Dalcin }
10788491ab44SLisandro Dalcin 
10798491ab44SLisandro Dalcin PetscErrorCode MatLoad_Dense_Binary(Mat mat,PetscViewer viewer)
10808491ab44SLisandro Dalcin {
10818491ab44SLisandro Dalcin   PetscErrorCode ierr;
10828491ab44SLisandro Dalcin   PetscBool      skipHeader;
10838491ab44SLisandro Dalcin   PetscInt       header[4],M,N,m,nz,lda,i,j,k;
10848491ab44SLisandro Dalcin   PetscInt       rows,cols;
10858491ab44SLisandro Dalcin   PetscScalar    *v,*vwork;
10868491ab44SLisandro Dalcin 
10878491ab44SLisandro Dalcin   PetscFunctionBegin;
10888491ab44SLisandro Dalcin   ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr);
10898491ab44SLisandro Dalcin   ierr = PetscViewerBinaryGetSkipHeader(viewer,&skipHeader);CHKERRQ(ierr);
10908491ab44SLisandro Dalcin 
10918491ab44SLisandro Dalcin   if (!skipHeader) {
10928491ab44SLisandro Dalcin     ierr = PetscViewerBinaryRead(viewer,header,4,NULL,PETSC_INT);CHKERRQ(ierr);
10938491ab44SLisandro Dalcin     if (header[0] != MAT_FILE_CLASSID) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"Not a matrix object in file");
10948491ab44SLisandro Dalcin     M = header[1]; N = header[2];
10958491ab44SLisandro Dalcin     if (M < 0) SETERRQ1(PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"Matrix row size (%D) in file is negative",M);
10968491ab44SLisandro Dalcin     if (N < 0) SETERRQ1(PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"Matrix column size (%D) in file is negative",N);
10978491ab44SLisandro Dalcin     nz = header[3];
10988491ab44SLisandro Dalcin     if (nz != MATRIX_BINARY_FORMAT_DENSE && nz < 0) SETERRQ1(PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"Unknown matrix format %D in file",nz);
1099aabbc4fbSShri Abhyankar   } else {
11008491ab44SLisandro Dalcin     ierr = MatGetSize(mat,&M,&N);CHKERRQ(ierr);
11018491ab44SLisandro 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");
11028491ab44SLisandro Dalcin     nz = MATRIX_BINARY_FORMAT_DENSE;
1103e6324fbbSBarry Smith   }
1104aabbc4fbSShri Abhyankar 
11058491ab44SLisandro Dalcin   /* setup global sizes if not set */
11068491ab44SLisandro Dalcin   if (mat->rmap->N < 0) mat->rmap->N = M;
11078491ab44SLisandro Dalcin   if (mat->cmap->N < 0) mat->cmap->N = N;
11088491ab44SLisandro Dalcin   ierr = MatSetUp(mat);CHKERRQ(ierr);
11098491ab44SLisandro Dalcin   /* check if global sizes are correct */
11108491ab44SLisandro Dalcin   ierr = MatGetSize(mat,&rows,&cols);CHKERRQ(ierr);
11118491ab44SLisandro 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);
1112aabbc4fbSShri Abhyankar 
11138491ab44SLisandro Dalcin   ierr = MatGetSize(mat,NULL,&N);CHKERRQ(ierr);
11148491ab44SLisandro Dalcin   ierr = MatGetLocalSize(mat,&m,NULL);CHKERRQ(ierr);
11158491ab44SLisandro Dalcin   ierr = MatDenseGetArray(mat,&v);CHKERRQ(ierr);
11168491ab44SLisandro Dalcin   ierr = MatDenseGetLDA(mat,&lda);CHKERRQ(ierr);
11178491ab44SLisandro Dalcin   if (nz == MATRIX_BINARY_FORMAT_DENSE) {  /* matrix in file is dense format */
11188491ab44SLisandro Dalcin     PetscInt nnz = m*N;
11198491ab44SLisandro Dalcin     /* read in matrix values */
11208491ab44SLisandro Dalcin     ierr = PetscMalloc1(nnz,&vwork);CHKERRQ(ierr);
11218491ab44SLisandro Dalcin     ierr = PetscViewerBinaryReadAll(viewer,vwork,nnz,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_SCALAR);CHKERRQ(ierr);
11228491ab44SLisandro Dalcin     /* store values in column major order */
11238491ab44SLisandro Dalcin     for (j=0; j<N; j++)
11248491ab44SLisandro Dalcin       for (i=0; i<m; i++)
11258491ab44SLisandro Dalcin         v[i+lda*j] = vwork[i*N+j];
11268491ab44SLisandro Dalcin     ierr = PetscFree(vwork);CHKERRQ(ierr);
11278491ab44SLisandro Dalcin   } else { /* matrix in file is sparse format */
11288491ab44SLisandro Dalcin     PetscInt nnz = 0, *rlens, *icols;
11298491ab44SLisandro Dalcin     /* read in row lengths */
11308491ab44SLisandro Dalcin     ierr = PetscMalloc1(m,&rlens);CHKERRQ(ierr);
11318491ab44SLisandro Dalcin     ierr = PetscViewerBinaryReadAll(viewer,rlens,m,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_INT);CHKERRQ(ierr);
11328491ab44SLisandro Dalcin     for (i=0; i<m; i++) nnz += rlens[i];
11338491ab44SLisandro Dalcin     /* read in column indices and values */
11348491ab44SLisandro Dalcin     ierr = PetscMalloc2(nnz,&icols,nnz,&vwork);CHKERRQ(ierr);
11358491ab44SLisandro Dalcin     ierr = PetscViewerBinaryReadAll(viewer,icols,nnz,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_INT);CHKERRQ(ierr);
11368491ab44SLisandro Dalcin     ierr = PetscViewerBinaryReadAll(viewer,vwork,nnz,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_SCALAR);CHKERRQ(ierr);
11378491ab44SLisandro Dalcin     /* store values in column major order */
11388491ab44SLisandro Dalcin     for (k=0, i=0; i<m; i++)
11398491ab44SLisandro Dalcin       for (j=0; j<rlens[i]; j++, k++)
11408491ab44SLisandro Dalcin         v[i+lda*icols[k]] = vwork[k];
11418491ab44SLisandro Dalcin     ierr = PetscFree(rlens);CHKERRQ(ierr);
11428491ab44SLisandro Dalcin     ierr = PetscFree2(icols,vwork);CHKERRQ(ierr);
1143aabbc4fbSShri Abhyankar   }
11448491ab44SLisandro Dalcin   ierr = MatDenseRestoreArray(mat,&v);CHKERRQ(ierr);
11458491ab44SLisandro Dalcin   ierr = MatAssemblyBegin(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
11468491ab44SLisandro Dalcin   ierr = MatAssemblyEnd(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1147aabbc4fbSShri Abhyankar   PetscFunctionReturn(0);
1148aabbc4fbSShri Abhyankar }
1149aabbc4fbSShri Abhyankar 
1150eb91f321SVaclav Hapla PetscErrorCode MatLoad_SeqDense(Mat newMat, PetscViewer viewer)
1151eb91f321SVaclav Hapla {
1152eb91f321SVaclav Hapla   PetscBool      isbinary, ishdf5;
1153eb91f321SVaclav Hapla   PetscErrorCode ierr;
1154eb91f321SVaclav Hapla 
1155eb91f321SVaclav Hapla   PetscFunctionBegin;
1156eb91f321SVaclav Hapla   PetscValidHeaderSpecific(newMat,MAT_CLASSID,1);
1157eb91f321SVaclav Hapla   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
1158eb91f321SVaclav Hapla   /* force binary viewer to load .info file if it has not yet done so */
1159eb91f321SVaclav Hapla   ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr);
1160eb91f321SVaclav Hapla   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
1161eb91f321SVaclav Hapla   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERHDF5,  &ishdf5);CHKERRQ(ierr);
1162eb91f321SVaclav Hapla   if (isbinary) {
11638491ab44SLisandro Dalcin     ierr = MatLoad_Dense_Binary(newMat,viewer);CHKERRQ(ierr);
1164eb91f321SVaclav Hapla   } else if (ishdf5) {
1165eb91f321SVaclav Hapla #if defined(PETSC_HAVE_HDF5)
1166eb91f321SVaclav Hapla     ierr = MatLoad_Dense_HDF5(newMat,viewer);CHKERRQ(ierr);
1167eb91f321SVaclav Hapla #else
1168eb91f321SVaclav Hapla     SETERRQ(PetscObjectComm((PetscObject)newMat),PETSC_ERR_SUP,"HDF5 not supported in this build.\nPlease reconfigure using --download-hdf5");
1169eb91f321SVaclav Hapla #endif
1170eb91f321SVaclav Hapla   } else {
1171eb91f321SVaclav 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);
1172eb91f321SVaclav Hapla   }
1173eb91f321SVaclav Hapla   PetscFunctionReturn(0);
1174eb91f321SVaclav Hapla }
1175eb91f321SVaclav Hapla 
11766849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer)
1177289bc588SBarry Smith {
1178932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
1179dfbe8321SBarry Smith   PetscErrorCode    ierr;
118013f74950SBarry Smith   PetscInt          i,j;
11812dcb1b2aSMatthew Knepley   const char        *name;
1182ca15aa20SStefano Zampini   PetscScalar       *v,*av;
1183f3ef73ceSBarry Smith   PetscViewerFormat format;
11845f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX)
1185ace3abfcSBarry Smith   PetscBool         allreal = PETSC_TRUE;
11865f481a85SSatish Balay #endif
1187932b0c3eSLois Curfman McInnes 
11883a40ed3dSBarry Smith   PetscFunctionBegin;
1189ca15aa20SStefano Zampini   ierr = MatDenseGetArrayRead(A,(const PetscScalar**)&av);CHKERRQ(ierr);
1190b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1191456192e2SBarry Smith   if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
11923a40ed3dSBarry Smith     PetscFunctionReturn(0);  /* do nothing for now */
1193fb9695e5SSatish Balay   } else if (format == PETSC_VIEWER_ASCII_COMMON) {
1194d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
1195d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
1196ca15aa20SStefano Zampini       v    = av + i;
119777431f27SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr);
1198d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1199aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
1200329f5518SBarry Smith         if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) {
120157622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g + %g i) ",j,(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr);
1202329f5518SBarry Smith         } else if (PetscRealPart(*v)) {
120357622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)PetscRealPart(*v));CHKERRQ(ierr);
12046831982aSBarry Smith         }
120580cd9d93SLois Curfman McInnes #else
12066831982aSBarry Smith         if (*v) {
120757622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)*v);CHKERRQ(ierr);
12086831982aSBarry Smith         }
120980cd9d93SLois Curfman McInnes #endif
12101b807ce4Svictorle         v += a->lda;
121180cd9d93SLois Curfman McInnes       }
1212b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
121380cd9d93SLois Curfman McInnes     }
1214d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
12153a40ed3dSBarry Smith   } else {
1216d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
1217aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
121847989497SBarry Smith     /* determine if matrix has all real values */
1219ca15aa20SStefano Zampini     v = av;
1220d0f46423SBarry Smith     for (i=0; i<A->rmap->n*A->cmap->n; i++) {
1221ffac6cdbSBarry Smith       if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break;}
122247989497SBarry Smith     }
122347989497SBarry Smith #endif
1224fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
12253a7fca6bSBarry Smith       ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr);
1226d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr);
1227d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
1228fb9695e5SSatish Balay       ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr);
1229ffac6cdbSBarry Smith     }
1230ffac6cdbSBarry Smith 
1231d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
1232ca15aa20SStefano Zampini       v = av + i;
1233d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1234aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
123547989497SBarry Smith         if (allreal) {
1236c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr);
123747989497SBarry Smith         } else {
1238c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr);
123947989497SBarry Smith         }
1240289bc588SBarry Smith #else
1241c61cd2faSJed Brown         ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr);
1242289bc588SBarry Smith #endif
12431b807ce4Svictorle         v += a->lda;
1244289bc588SBarry Smith       }
1245b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
1246289bc588SBarry Smith     }
1247fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
1248b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr);
1249ffac6cdbSBarry Smith     }
1250d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
1251da3a660dSBarry Smith   }
1252ca15aa20SStefano Zampini   ierr = MatDenseRestoreArrayRead(A,(const PetscScalar**)&av);CHKERRQ(ierr);
1253b0a32e0cSBarry Smith   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
12543a40ed3dSBarry Smith   PetscFunctionReturn(0);
1255289bc588SBarry Smith }
1256289bc588SBarry Smith 
12579804daf3SBarry Smith #include <petscdraw.h>
1258e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa)
1259f1af5d2fSBarry Smith {
1260f1af5d2fSBarry Smith   Mat               A  = (Mat) Aa;
12616849ba73SBarry Smith   PetscErrorCode    ierr;
1262383922c3SLisandro Dalcin   PetscInt          m  = A->rmap->n,n = A->cmap->n,i,j;
1263383922c3SLisandro Dalcin   int               color = PETSC_DRAW_WHITE;
1264ca15aa20SStefano Zampini   const PetscScalar *v;
1265b0a32e0cSBarry Smith   PetscViewer       viewer;
1266b05fc000SLisandro Dalcin   PetscReal         xl,yl,xr,yr,x_l,x_r,y_l,y_r;
1267f3ef73ceSBarry Smith   PetscViewerFormat format;
1268f1af5d2fSBarry Smith 
1269f1af5d2fSBarry Smith   PetscFunctionBegin;
1270f1af5d2fSBarry Smith   ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr);
1271b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1272b0a32e0cSBarry Smith   ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr);
1273f1af5d2fSBarry Smith 
1274f1af5d2fSBarry Smith   /* Loop over matrix elements drawing boxes */
1275ca15aa20SStefano Zampini   ierr = MatDenseGetArrayRead(A,&v);CHKERRQ(ierr);
1276fb9695e5SSatish Balay   if (format != PETSC_VIEWER_DRAW_CONTOUR) {
1277383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
1278f1af5d2fSBarry Smith     /* Blue for negative and Red for positive */
1279f1af5d2fSBarry Smith     for (j = 0; j < n; j++) {
1280383922c3SLisandro Dalcin       x_l = j; x_r = x_l + 1.0;
1281f1af5d2fSBarry Smith       for (i = 0; i < m; i++) {
1282f1af5d2fSBarry Smith         y_l = m - i - 1.0;
1283f1af5d2fSBarry Smith         y_r = y_l + 1.0;
1284ca15aa20SStefano Zampini         if (PetscRealPart(v[j*m+i]) >  0.) color = PETSC_DRAW_RED;
1285ca15aa20SStefano Zampini         else if (PetscRealPart(v[j*m+i]) <  0.) color = PETSC_DRAW_BLUE;
1286ca15aa20SStefano Zampini         else continue;
1287b0a32e0cSBarry Smith         ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1288f1af5d2fSBarry Smith       }
1289f1af5d2fSBarry Smith     }
1290383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
1291f1af5d2fSBarry Smith   } else {
1292f1af5d2fSBarry Smith     /* use contour shading to indicate magnitude of values */
1293f1af5d2fSBarry Smith     /* first determine max of all nonzero values */
1294b05fc000SLisandro Dalcin     PetscReal minv = 0.0, maxv = 0.0;
1295b05fc000SLisandro Dalcin     PetscDraw popup;
1296b05fc000SLisandro Dalcin 
1297f1af5d2fSBarry Smith     for (i=0; i < m*n; i++) {
1298f1af5d2fSBarry Smith       if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]);
1299f1af5d2fSBarry Smith     }
1300383922c3SLisandro Dalcin     if (minv >= maxv) maxv = minv + PETSC_SMALL;
1301b0a32e0cSBarry Smith     ierr = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr);
130245f3bb6eSLisandro Dalcin     ierr = PetscDrawScalePopup(popup,minv,maxv);CHKERRQ(ierr);
1303383922c3SLisandro Dalcin 
1304383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
1305f1af5d2fSBarry Smith     for (j=0; j<n; j++) {
1306f1af5d2fSBarry Smith       x_l = j;
1307f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1308f1af5d2fSBarry Smith       for (i=0; i<m; i++) {
1309f1af5d2fSBarry Smith         y_l   = m - i - 1.0;
1310f1af5d2fSBarry Smith         y_r   = y_l + 1.0;
1311b05fc000SLisandro Dalcin         color = PetscDrawRealToColor(PetscAbsScalar(v[j*m+i]),minv,maxv);
1312b0a32e0cSBarry Smith         ierr  = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1313f1af5d2fSBarry Smith       }
1314f1af5d2fSBarry Smith     }
1315383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
1316f1af5d2fSBarry Smith   }
1317ca15aa20SStefano Zampini   ierr = MatDenseRestoreArrayRead(A,&v);CHKERRQ(ierr);
1318f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1319f1af5d2fSBarry Smith }
1320f1af5d2fSBarry Smith 
1321e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer)
1322f1af5d2fSBarry Smith {
1323b0a32e0cSBarry Smith   PetscDraw      draw;
1324ace3abfcSBarry Smith   PetscBool      isnull;
1325329f5518SBarry Smith   PetscReal      xr,yr,xl,yl,h,w;
1326dfbe8321SBarry Smith   PetscErrorCode ierr;
1327f1af5d2fSBarry Smith 
1328f1af5d2fSBarry Smith   PetscFunctionBegin;
1329b0a32e0cSBarry Smith   ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
1330b0a32e0cSBarry Smith   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
1331abc0a331SBarry Smith   if (isnull) PetscFunctionReturn(0);
1332f1af5d2fSBarry Smith 
1333d0f46423SBarry Smith   xr   = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0;
1334f1af5d2fSBarry Smith   xr  += w;          yr += h;        xl = -w;     yl = -h;
1335b0a32e0cSBarry Smith   ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr);
1336832b7cebSLisandro Dalcin   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr);
1337b0a32e0cSBarry Smith   ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr);
13380298fd71SBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr);
1339832b7cebSLisandro Dalcin   ierr = PetscDrawSave(draw);CHKERRQ(ierr);
1340f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1341f1af5d2fSBarry Smith }
1342f1af5d2fSBarry Smith 
1343dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer)
1344932b0c3eSLois Curfman McInnes {
1345dfbe8321SBarry Smith   PetscErrorCode ierr;
1346ace3abfcSBarry Smith   PetscBool      iascii,isbinary,isdraw;
1347932b0c3eSLois Curfman McInnes 
13483a40ed3dSBarry Smith   PetscFunctionBegin;
1349251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
1350251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
1351251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
13520f5bd95cSBarry Smith 
1353c45a1595SBarry Smith   if (iascii) {
1354c45a1595SBarry Smith     ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr);
13550f5bd95cSBarry Smith   } else if (isbinary) {
1356637a0070SStefano Zampini     ierr = MatView_Dense_Binary(A,viewer);CHKERRQ(ierr);
1357f1af5d2fSBarry Smith   } else if (isdraw) {
1358f1af5d2fSBarry Smith     ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr);
1359932b0c3eSLois Curfman McInnes   }
13603a40ed3dSBarry Smith   PetscFunctionReturn(0);
1361932b0c3eSLois Curfman McInnes }
1362289bc588SBarry Smith 
1363637a0070SStefano Zampini static PetscErrorCode MatDensePlaceArray_SeqDense(Mat A,const PetscScalar *array)
1364d3042a70SBarry Smith {
1365d3042a70SBarry Smith   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1366d3042a70SBarry Smith 
1367d3042a70SBarry Smith   PetscFunctionBegin;
13685ea7661aSPierre Jolivet   if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first");
13695ea7661aSPierre Jolivet   if (a->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first");
13705ea7661aSPierre Jolivet   if (a->unplacedarray) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreArray() first");
1371d3042a70SBarry Smith   a->unplacedarray       = a->v;
1372d3042a70SBarry Smith   a->unplaced_user_alloc = a->user_alloc;
1373d3042a70SBarry Smith   a->v                   = (PetscScalar*) array;
1374637a0070SStefano Zampini   a->user_alloc          = PETSC_TRUE;
1375ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA)
1376c70f7ee4SJunchao Zhang   A->offloadmask = PETSC_OFFLOAD_CPU;
1377ca15aa20SStefano Zampini #endif
1378d3042a70SBarry Smith   PetscFunctionReturn(0);
1379d3042a70SBarry Smith }
1380d3042a70SBarry Smith 
1381d3042a70SBarry Smith static PetscErrorCode MatDenseResetArray_SeqDense(Mat A)
1382d3042a70SBarry Smith {
1383d3042a70SBarry Smith   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1384d3042a70SBarry Smith 
1385d3042a70SBarry Smith   PetscFunctionBegin;
13865ea7661aSPierre Jolivet   if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first");
13875ea7661aSPierre Jolivet   if (a->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first");
1388d3042a70SBarry Smith   a->v             = a->unplacedarray;
1389d3042a70SBarry Smith   a->user_alloc    = a->unplaced_user_alloc;
1390d3042a70SBarry Smith   a->unplacedarray = NULL;
1391ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA)
1392c70f7ee4SJunchao Zhang   A->offloadmask = PETSC_OFFLOAD_CPU;
1393ca15aa20SStefano Zampini #endif
1394d3042a70SBarry Smith   PetscFunctionReturn(0);
1395d3042a70SBarry Smith }
1396d3042a70SBarry Smith 
1397d5ea218eSStefano Zampini static PetscErrorCode MatDenseReplaceArray_SeqDense(Mat A,const PetscScalar *array)
1398d5ea218eSStefano Zampini {
1399d5ea218eSStefano Zampini   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1400d5ea218eSStefano Zampini   PetscErrorCode ierr;
1401d5ea218eSStefano Zampini 
1402d5ea218eSStefano Zampini   PetscFunctionBegin;
14035ea7661aSPierre Jolivet   if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first");
14045ea7661aSPierre Jolivet   if (a->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first");
1405d5ea218eSStefano Zampini   if (!a->user_alloc) { ierr = PetscFree(a->v);CHKERRQ(ierr); }
1406d5ea218eSStefano Zampini   a->v           = (PetscScalar*) array;
1407d5ea218eSStefano Zampini   a->user_alloc  = PETSC_FALSE;
1408d5ea218eSStefano Zampini #if defined(PETSC_HAVE_CUDA)
1409d5ea218eSStefano Zampini   A->offloadmask = PETSC_OFFLOAD_CPU;
1410d5ea218eSStefano Zampini #endif
1411d5ea218eSStefano Zampini   PetscFunctionReturn(0);
1412d5ea218eSStefano Zampini }
1413d5ea218eSStefano Zampini 
1414ca15aa20SStefano Zampini PetscErrorCode MatDestroy_SeqDense(Mat mat)
1415289bc588SBarry Smith {
1416ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)mat->data;
1417dfbe8321SBarry Smith   PetscErrorCode ierr;
141890f02eecSBarry Smith 
14193a40ed3dSBarry Smith   PetscFunctionBegin;
1420aa482453SBarry Smith #if defined(PETSC_USE_LOG)
1421d0f46423SBarry Smith   PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n);
1422a5a9c739SBarry Smith #endif
142305b42c5fSBarry Smith   ierr = PetscFree(l->pivots);CHKERRQ(ierr);
1424a49dc2a2SStefano Zampini   ierr = PetscFree(l->fwork);CHKERRQ(ierr);
1425abc3b08eSStefano Zampini   ierr = MatDestroy(&l->ptapwork);CHKERRQ(ierr);
14266857c123SSatish Balay   if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);}
1427637a0070SStefano Zampini   if (!l->unplaced_user_alloc) {ierr = PetscFree(l->unplacedarray);CHKERRQ(ierr);}
14285ea7661aSPierre Jolivet   if (l->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first");
14295ea7661aSPierre Jolivet   if (l->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first");
14306947451fSStefano Zampini   ierr = VecDestroy(&l->cvec);CHKERRQ(ierr);
14315ea7661aSPierre Jolivet   ierr = MatDestroy(&l->cmat);CHKERRQ(ierr);
1432bf0cc555SLisandro Dalcin   ierr = PetscFree(mat->data);CHKERRQ(ierr);
1433dbd8c25aSHong Zhang 
1434f4259b30SLisandro Dalcin   ierr = PetscObjectChangeTypeName((PetscObject)mat,NULL);CHKERRQ(ierr);
143549a6ff4bSBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetLDA_C",NULL);CHKERRQ(ierr);
1436ad16ce7aSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseSetLDA_C",NULL);CHKERRQ(ierr);
1437bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL);CHKERRQ(ierr);
143852c5f739Sprj-   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL);CHKERRQ(ierr);
1439d3042a70SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDensePlaceArray_C",NULL);CHKERRQ(ierr);
1440d3042a70SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseResetArray_C",NULL);CHKERRQ(ierr);
1441d5ea218eSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseReplaceArray_C",NULL);CHKERRQ(ierr);
144252c5f739Sprj-   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArrayRead_C",NULL);CHKERRQ(ierr);
144352c5f739Sprj-   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArrayRead_C",NULL);CHKERRQ(ierr);
14446947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArrayWrite_C",NULL);CHKERRQ(ierr);
14456947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArrayWrite_C",NULL);CHKERRQ(ierr);
14468baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL);CHKERRQ(ierr);
14478baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
14488baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL);CHKERRQ(ierr);
14498baccfbdSHong Zhang #endif
1450d24d4204SJose E. Roman #if defined(PETSC_HAVE_SCALAPACK)
1451d24d4204SJose E. Roman   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_scalapack_C",NULL);CHKERRQ(ierr);
1452d24d4204SJose E. Roman #endif
14532bf066beSStefano Zampini #if defined(PETSC_HAVE_CUDA)
14542bf066beSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqdensecuda_C",NULL);CHKERRQ(ierr);
14554222ddf1SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqdensecuda_seqdensecuda_C",NULL);CHKERRQ(ierr);
14564222ddf1SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqdensecuda_seqdense_C",NULL);CHKERRQ(ierr);
14572bf066beSStefano Zampini #endif
1458bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL);CHKERRQ(ierr);
14594222ddf1SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
14604222ddf1SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqdense_seqdense_C",NULL);CHKERRQ(ierr);
14614222ddf1SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqbaij_seqdense_C",NULL);CHKERRQ(ierr);
14624222ddf1SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqsbaij_seqdense_C",NULL);CHKERRQ(ierr);
146352c5f739Sprj- 
146486aefd0dSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumn_C",NULL);CHKERRQ(ierr);
146586aefd0dSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumn_C",NULL);CHKERRQ(ierr);
14666947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumnVec_C",NULL);CHKERRQ(ierr);
14676947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumnVec_C",NULL);CHKERRQ(ierr);
14686947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumnVecRead_C",NULL);CHKERRQ(ierr);
14696947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumnVecRead_C",NULL);CHKERRQ(ierr);
14706947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumnVecWrite_C",NULL);CHKERRQ(ierr);
14716947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumnVecWrite_C",NULL);CHKERRQ(ierr);
14725ea7661aSPierre Jolivet   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetSubMatrix_C",NULL);CHKERRQ(ierr);
14735ea7661aSPierre Jolivet   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreSubMatrix_C",NULL);CHKERRQ(ierr);
14743a40ed3dSBarry Smith   PetscFunctionReturn(0);
1475289bc588SBarry Smith }
1476289bc588SBarry Smith 
1477e0877f53SBarry Smith static PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout)
1478289bc588SBarry Smith {
1479c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
14806849ba73SBarry Smith   PetscErrorCode ierr;
14816536e3caSStefano Zampini   PetscInt       k,j,m = A->rmap->n, M = mat->lda, n = A->cmap->n;
148287828ca2SBarry Smith   PetscScalar    *v,tmp;
148348b35521SBarry Smith 
14843a40ed3dSBarry Smith   PetscFunctionBegin;
14856536e3caSStefano Zampini   if (reuse == MAT_INPLACE_MATRIX) {
14866536e3caSStefano Zampini     if (m == n) { /* in place transpose */
1487ca15aa20SStefano Zampini       ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr);
1488d3e5ee88SLois Curfman McInnes       for (j=0; j<m; j++) {
1489289bc588SBarry Smith         for (k=0; k<j; k++) {
14901b807ce4Svictorle           tmp        = v[j + k*M];
14911b807ce4Svictorle           v[j + k*M] = v[k + j*M];
14921b807ce4Svictorle           v[k + j*M] = tmp;
1493289bc588SBarry Smith         }
1494289bc588SBarry Smith       }
1495ca15aa20SStefano Zampini       ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr);
14966536e3caSStefano Zampini     } else { /* reuse memory, temporary allocates new memory */
14976536e3caSStefano Zampini       PetscScalar *v2;
14986536e3caSStefano Zampini       PetscLayout tmplayout;
14996536e3caSStefano Zampini 
15006536e3caSStefano Zampini       ierr = PetscMalloc1((size_t)m*n,&v2);CHKERRQ(ierr);
15016536e3caSStefano Zampini       ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr);
15026536e3caSStefano Zampini       for (j=0; j<n; j++) {
15036536e3caSStefano Zampini         for (k=0; k<m; k++) v2[j + (size_t)k*n] = v[k + (size_t)j*M];
15046536e3caSStefano Zampini       }
15056536e3caSStefano Zampini       ierr = PetscArraycpy(v,v2,(size_t)m*n);CHKERRQ(ierr);
15066536e3caSStefano Zampini       ierr = PetscFree(v2);CHKERRQ(ierr);
15076536e3caSStefano Zampini       ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr);
15086536e3caSStefano Zampini       /* cleanup size dependent quantities */
15096536e3caSStefano Zampini       ierr = VecDestroy(&mat->cvec);CHKERRQ(ierr);
15106536e3caSStefano Zampini       ierr = MatDestroy(&mat->cmat);CHKERRQ(ierr);
15116536e3caSStefano Zampini       ierr = PetscFree(mat->pivots);CHKERRQ(ierr);
15126536e3caSStefano Zampini       ierr = PetscFree(mat->fwork);CHKERRQ(ierr);
15136536e3caSStefano Zampini       ierr = MatDestroy(&mat->ptapwork);CHKERRQ(ierr);
15146536e3caSStefano Zampini       /* swap row/col layouts */
15156536e3caSStefano Zampini       mat->lda  = n;
15166536e3caSStefano Zampini       tmplayout = A->rmap;
15176536e3caSStefano Zampini       A->rmap   = A->cmap;
15186536e3caSStefano Zampini       A->cmap   = tmplayout;
15196536e3caSStefano Zampini     }
15203a40ed3dSBarry Smith   } else { /* out-of-place transpose */
1521d3e5ee88SLois Curfman McInnes     Mat          tmat;
1522ec8511deSBarry Smith     Mat_SeqDense *tmatd;
152387828ca2SBarry Smith     PetscScalar  *v2;
1524af36a384SStefano Zampini     PetscInt     M2;
1525ea709b57SSatish Balay 
15266536e3caSStefano Zampini     if (reuse == MAT_INITIAL_MATRIX) {
1527ce94432eSBarry Smith       ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr);
1528d0f46423SBarry Smith       ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr);
15297adad957SLisandro Dalcin       ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
15300298fd71SBarry Smith       ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr);
1531ca15aa20SStefano Zampini     } else tmat = *matout;
1532ca15aa20SStefano Zampini 
1533ca15aa20SStefano Zampini     ierr  = MatDenseGetArrayRead(A,(const PetscScalar**)&v);CHKERRQ(ierr);
1534ca15aa20SStefano Zampini     ierr  = MatDenseGetArray(tmat,&v2);CHKERRQ(ierr);
1535ec8511deSBarry Smith     tmatd = (Mat_SeqDense*)tmat->data;
1536ca15aa20SStefano Zampini     M2    = tmatd->lda;
1537d3e5ee88SLois Curfman McInnes     for (j=0; j<n; j++) {
1538af36a384SStefano Zampini       for (k=0; k<m; k++) v2[j + k*M2] = v[k + j*M];
1539d3e5ee88SLois Curfman McInnes     }
1540ca15aa20SStefano Zampini     ierr = MatDenseRestoreArray(tmat,&v2);CHKERRQ(ierr);
1541ca15aa20SStefano Zampini     ierr = MatDenseRestoreArrayRead(A,(const PetscScalar**)&v);CHKERRQ(ierr);
15426d4a8577SBarry Smith     ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
15436d4a8577SBarry Smith     ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
15446536e3caSStefano Zampini     *matout = tmat;
154548b35521SBarry Smith   }
15463a40ed3dSBarry Smith   PetscFunctionReturn(0);
1547289bc588SBarry Smith }
1548289bc588SBarry Smith 
1549e0877f53SBarry Smith static PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool  *flg)
1550289bc588SBarry Smith {
1551c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat1 = (Mat_SeqDense*)A1->data;
1552c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat2 = (Mat_SeqDense*)A2->data;
1553ca15aa20SStefano Zampini   PetscInt          i;
1554ca15aa20SStefano Zampini   const PetscScalar *v1,*v2;
1555ca15aa20SStefano Zampini   PetscErrorCode    ierr;
15569ea5d5aeSSatish Balay 
15573a40ed3dSBarry Smith   PetscFunctionBegin;
1558d0f46423SBarry Smith   if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1559d0f46423SBarry Smith   if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1560ca15aa20SStefano Zampini   ierr = MatDenseGetArrayRead(A1,&v1);CHKERRQ(ierr);
1561ca15aa20SStefano Zampini   ierr = MatDenseGetArrayRead(A2,&v2);CHKERRQ(ierr);
1562ca15aa20SStefano Zampini   for (i=0; i<A1->cmap->n; i++) {
1563ca15aa20SStefano Zampini     ierr = PetscArraycmp(v1,v2,A1->rmap->n,flg);CHKERRQ(ierr);
1564ca15aa20SStefano Zampini     if (*flg == PETSC_FALSE) PetscFunctionReturn(0);
1565ca15aa20SStefano Zampini     v1 += mat1->lda;
1566ca15aa20SStefano Zampini     v2 += mat2->lda;
15671b807ce4Svictorle   }
1568ca15aa20SStefano Zampini   ierr = MatDenseRestoreArrayRead(A1,&v1);CHKERRQ(ierr);
1569ca15aa20SStefano Zampini   ierr = MatDenseRestoreArrayRead(A2,&v2);CHKERRQ(ierr);
157077c4ece6SBarry Smith   *flg = PETSC_TRUE;
15713a40ed3dSBarry Smith   PetscFunctionReturn(0);
1572289bc588SBarry Smith }
1573289bc588SBarry Smith 
1574e0877f53SBarry Smith static PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v)
1575289bc588SBarry Smith {
1576c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
157713f74950SBarry Smith   PetscInt          i,n,len;
1578ca15aa20SStefano Zampini   PetscScalar       *x;
1579ca15aa20SStefano Zampini   const PetscScalar *vv;
1580ca15aa20SStefano Zampini   PetscErrorCode    ierr;
158144cd7ae7SLois Curfman McInnes 
15823a40ed3dSBarry Smith   PetscFunctionBegin;
15837a97a34bSBarry Smith   ierr = VecGetSize(v,&n);CHKERRQ(ierr);
15841ebc52fbSHong Zhang   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1585d0f46423SBarry Smith   len  = PetscMin(A->rmap->n,A->cmap->n);
1586ca15aa20SStefano Zampini   ierr = MatDenseGetArrayRead(A,&vv);CHKERRQ(ierr);
1587e32f2f54SBarry Smith   if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec");
158844cd7ae7SLois Curfman McInnes   for (i=0; i<len; i++) {
1589ca15aa20SStefano Zampini     x[i] = vv[i*mat->lda + i];
1590289bc588SBarry Smith   }
1591ca15aa20SStefano Zampini   ierr = MatDenseRestoreArrayRead(A,&vv);CHKERRQ(ierr);
15921ebc52fbSHong Zhang   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
15933a40ed3dSBarry Smith   PetscFunctionReturn(0);
1594289bc588SBarry Smith }
1595289bc588SBarry Smith 
1596e0877f53SBarry Smith static PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr)
1597289bc588SBarry Smith {
1598c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
1599f1ceaac6SMatthew G. Knepley   const PetscScalar *l,*r;
1600ca15aa20SStefano Zampini   PetscScalar       x,*v,*vv;
1601dfbe8321SBarry Smith   PetscErrorCode    ierr;
1602d0f46423SBarry Smith   PetscInt          i,j,m = A->rmap->n,n = A->cmap->n;
160355659b69SBarry Smith 
16043a40ed3dSBarry Smith   PetscFunctionBegin;
1605ca15aa20SStefano Zampini   ierr = MatDenseGetArray(A,&vv);CHKERRQ(ierr);
160628988994SBarry Smith   if (ll) {
16077a97a34bSBarry Smith     ierr = VecGetSize(ll,&m);CHKERRQ(ierr);
1608f1ceaac6SMatthew G. Knepley     ierr = VecGetArrayRead(ll,&l);CHKERRQ(ierr);
1609e32f2f54SBarry Smith     if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size");
1610da3a660dSBarry Smith     for (i=0; i<m; i++) {
1611da3a660dSBarry Smith       x = l[i];
1612ca15aa20SStefano Zampini       v = vv + i;
1613b43bac26SStefano Zampini       for (j=0; j<n; j++) { (*v) *= x; v+= mat->lda;}
1614da3a660dSBarry Smith     }
1615f1ceaac6SMatthew G. Knepley     ierr = VecRestoreArrayRead(ll,&l);CHKERRQ(ierr);
1616eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr);
1617da3a660dSBarry Smith   }
161828988994SBarry Smith   if (rr) {
16197a97a34bSBarry Smith     ierr = VecGetSize(rr,&n);CHKERRQ(ierr);
1620f1ceaac6SMatthew G. Knepley     ierr = VecGetArrayRead(rr,&r);CHKERRQ(ierr);
1621e32f2f54SBarry Smith     if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size");
1622da3a660dSBarry Smith     for (i=0; i<n; i++) {
1623da3a660dSBarry Smith       x = r[i];
1624ca15aa20SStefano Zampini       v = vv + i*mat->lda;
16252205254eSKarl Rupp       for (j=0; j<m; j++) (*v++) *= x;
1626da3a660dSBarry Smith     }
1627f1ceaac6SMatthew G. Knepley     ierr = VecRestoreArrayRead(rr,&r);CHKERRQ(ierr);
1628eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr);
1629da3a660dSBarry Smith   }
1630ca15aa20SStefano Zampini   ierr = MatDenseRestoreArray(A,&vv);CHKERRQ(ierr);
16313a40ed3dSBarry Smith   PetscFunctionReturn(0);
1632289bc588SBarry Smith }
1633289bc588SBarry Smith 
1634ca15aa20SStefano Zampini PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm)
1635289bc588SBarry Smith {
1636c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
1637ca15aa20SStefano Zampini   PetscScalar       *v,*vv;
1638329f5518SBarry Smith   PetscReal         sum  = 0.0;
1639d0f46423SBarry Smith   PetscInt          lda  =mat->lda,m=A->rmap->n,i,j;
1640efee365bSSatish Balay   PetscErrorCode    ierr;
164155659b69SBarry Smith 
16423a40ed3dSBarry Smith   PetscFunctionBegin;
1643ca15aa20SStefano Zampini   ierr = MatDenseGetArrayRead(A,(const PetscScalar**)&vv);CHKERRQ(ierr);
1644ca15aa20SStefano Zampini   v    = vv;
1645289bc588SBarry Smith   if (type == NORM_FROBENIUS) {
1646a5ce6ee0Svictorle     if (lda>m) {
1647d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1648ca15aa20SStefano Zampini         v = vv+j*lda;
1649a5ce6ee0Svictorle         for (i=0; i<m; i++) {
1650a5ce6ee0Svictorle           sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1651a5ce6ee0Svictorle         }
1652a5ce6ee0Svictorle       }
1653a5ce6ee0Svictorle     } else {
1654570b7f6dSBarry Smith #if defined(PETSC_USE_REAL___FP16)
1655570b7f6dSBarry Smith       PetscBLASInt one = 1,cnt = A->cmap->n*A->rmap->n;
1656570b7f6dSBarry Smith       *nrm = BLASnrm2_(&cnt,v,&one);
1657570b7f6dSBarry Smith     }
1658570b7f6dSBarry Smith #else
1659d0f46423SBarry Smith       for (i=0; i<A->cmap->n*A->rmap->n; i++) {
1660329f5518SBarry Smith         sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1661289bc588SBarry Smith       }
1662a5ce6ee0Svictorle     }
16638f1a2a5eSBarry Smith     *nrm = PetscSqrtReal(sum);
1664570b7f6dSBarry Smith #endif
1665dc0b31edSSatish Balay     ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
16663a40ed3dSBarry Smith   } else if (type == NORM_1) {
1667064f8208SBarry Smith     *nrm = 0.0;
1668d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1669ca15aa20SStefano Zampini       v   = vv + j*mat->lda;
1670289bc588SBarry Smith       sum = 0.0;
1671d0f46423SBarry Smith       for (i=0; i<A->rmap->n; i++) {
167233a8263dSBarry Smith         sum += PetscAbsScalar(*v);  v++;
1673289bc588SBarry Smith       }
1674064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1675289bc588SBarry Smith     }
1676eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
16773a40ed3dSBarry Smith   } else if (type == NORM_INFINITY) {
1678064f8208SBarry Smith     *nrm = 0.0;
1679d0f46423SBarry Smith     for (j=0; j<A->rmap->n; j++) {
1680ca15aa20SStefano Zampini       v   = vv + j;
1681289bc588SBarry Smith       sum = 0.0;
1682d0f46423SBarry Smith       for (i=0; i<A->cmap->n; i++) {
16831b807ce4Svictorle         sum += PetscAbsScalar(*v); v += mat->lda;
1684289bc588SBarry Smith       }
1685064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1686289bc588SBarry Smith     }
1687eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
1688e7e72b3dSBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm");
1689ca15aa20SStefano Zampini   ierr = MatDenseRestoreArrayRead(A,(const PetscScalar**)&vv);CHKERRQ(ierr);
16903a40ed3dSBarry Smith   PetscFunctionReturn(0);
1691289bc588SBarry Smith }
1692289bc588SBarry Smith 
1693e0877f53SBarry Smith static PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg)
1694289bc588SBarry Smith {
1695c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *aij = (Mat_SeqDense*)A->data;
169663ba0a88SBarry Smith   PetscErrorCode ierr;
169767e560aaSBarry Smith 
16983a40ed3dSBarry Smith   PetscFunctionBegin;
1699b5a2b587SKris Buschelman   switch (op) {
1700b5a2b587SKris Buschelman   case MAT_ROW_ORIENTED:
17014e0d8c25SBarry Smith     aij->roworiented = flg;
1702b5a2b587SKris Buschelman     break;
1703512a5fc5SBarry Smith   case MAT_NEW_NONZERO_LOCATIONS:
1704b5a2b587SKris Buschelman   case MAT_NEW_NONZERO_LOCATION_ERR:
17053971808eSMatthew Knepley   case MAT_NEW_NONZERO_ALLOCATION_ERR:
17064e0d8c25SBarry Smith   case MAT_NEW_DIAGONALS:
170713fa8e87SLisandro Dalcin   case MAT_KEEP_NONZERO_PATTERN:
1708b5a2b587SKris Buschelman   case MAT_IGNORE_OFF_PROC_ENTRIES:
1709b5a2b587SKris Buschelman   case MAT_USE_HASH_TABLE:
17100f8fb01aSBarry Smith   case MAT_IGNORE_ZERO_ENTRIES:
17115021d80fSJed Brown   case MAT_IGNORE_LOWER_TRIANGULAR:
1712071fcb05SBarry Smith   case MAT_SORTED_FULL:
17135021d80fSJed Brown     ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr);
17145021d80fSJed Brown     break;
17155021d80fSJed Brown   case MAT_SPD:
171677e54ba9SKris Buschelman   case MAT_SYMMETRIC:
171777e54ba9SKris Buschelman   case MAT_STRUCTURALLY_SYMMETRIC:
17189a4540c5SBarry Smith   case MAT_HERMITIAN:
17199a4540c5SBarry Smith   case MAT_SYMMETRY_ETERNAL:
17205021d80fSJed Brown     /* These options are handled directly by MatSetOption() */
172177e54ba9SKris Buschelman     break;
1722b5a2b587SKris Buschelman   default:
1723e32f2f54SBarry Smith     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]);
17243a40ed3dSBarry Smith   }
17253a40ed3dSBarry Smith   PetscFunctionReturn(0);
1726289bc588SBarry Smith }
1727289bc588SBarry Smith 
1728e0877f53SBarry Smith static PetscErrorCode MatZeroEntries_SeqDense(Mat A)
17296f0a148fSBarry Smith {
1730ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)A->data;
17316849ba73SBarry Smith   PetscErrorCode ierr;
1732d0f46423SBarry Smith   PetscInt       lda=l->lda,m=A->rmap->n,j;
1733ca15aa20SStefano Zampini   PetscScalar    *v;
17343a40ed3dSBarry Smith 
17353a40ed3dSBarry Smith   PetscFunctionBegin;
1736ca15aa20SStefano Zampini   ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr);
1737a5ce6ee0Svictorle   if (lda>m) {
1738d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1739ca15aa20SStefano Zampini       ierr = PetscArrayzero(v+j*lda,m);CHKERRQ(ierr);
1740a5ce6ee0Svictorle     }
1741a5ce6ee0Svictorle   } else {
1742ca15aa20SStefano Zampini     ierr = PetscArrayzero(v,A->rmap->n*A->cmap->n);CHKERRQ(ierr);
1743a5ce6ee0Svictorle   }
1744ca15aa20SStefano Zampini   ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr);
17453a40ed3dSBarry Smith   PetscFunctionReturn(0);
17466f0a148fSBarry Smith }
17476f0a148fSBarry Smith 
1748e0877f53SBarry Smith static PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b)
17496f0a148fSBarry Smith {
175097b48c8fSBarry Smith   PetscErrorCode    ierr;
1751ec8511deSBarry Smith   Mat_SeqDense      *l = (Mat_SeqDense*)A->data;
1752b9679d65SBarry Smith   PetscInt          m  = l->lda, n = A->cmap->n, i,j;
1753ca15aa20SStefano Zampini   PetscScalar       *slot,*bb,*v;
175497b48c8fSBarry Smith   const PetscScalar *xx;
175555659b69SBarry Smith 
17563a40ed3dSBarry Smith   PetscFunctionBegin;
175776bd3646SJed Brown   if (PetscDefined(USE_DEBUG)) {
1758b9679d65SBarry Smith     for (i=0; i<N; i++) {
1759b9679d65SBarry Smith       if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed");
1760b9679d65SBarry 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);
1761b9679d65SBarry Smith     }
176276bd3646SJed Brown   }
1763ca15aa20SStefano Zampini   if (!N) PetscFunctionReturn(0);
1764b9679d65SBarry Smith 
176597b48c8fSBarry Smith   /* fix right hand side if needed */
176697b48c8fSBarry Smith   if (x && b) {
176797b48c8fSBarry Smith     ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr);
176897b48c8fSBarry Smith     ierr = VecGetArray(b,&bb);CHKERRQ(ierr);
17692205254eSKarl Rupp     for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]];
177097b48c8fSBarry Smith     ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr);
177197b48c8fSBarry Smith     ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr);
177297b48c8fSBarry Smith   }
177397b48c8fSBarry Smith 
1774ca15aa20SStefano Zampini   ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr);
17756f0a148fSBarry Smith   for (i=0; i<N; i++) {
1776ca15aa20SStefano Zampini     slot = v + rows[i];
1777b9679d65SBarry Smith     for (j=0; j<n; j++) { *slot = 0.0; slot += m;}
17786f0a148fSBarry Smith   }
1779f4df32b1SMatthew Knepley   if (diag != 0.0) {
1780b9679d65SBarry Smith     if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices");
17816f0a148fSBarry Smith     for (i=0; i<N; i++) {
1782ca15aa20SStefano Zampini       slot  = v + (m+1)*rows[i];
1783f4df32b1SMatthew Knepley       *slot = diag;
17846f0a148fSBarry Smith     }
17856f0a148fSBarry Smith   }
1786ca15aa20SStefano Zampini   ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr);
17873a40ed3dSBarry Smith   PetscFunctionReturn(0);
17886f0a148fSBarry Smith }
1789557bce09SLois Curfman McInnes 
179049a6ff4bSBarry Smith static PetscErrorCode MatDenseGetLDA_SeqDense(Mat A,PetscInt *lda)
179149a6ff4bSBarry Smith {
179249a6ff4bSBarry Smith   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
179349a6ff4bSBarry Smith 
179449a6ff4bSBarry Smith   PetscFunctionBegin;
179549a6ff4bSBarry Smith   *lda = mat->lda;
179649a6ff4bSBarry Smith   PetscFunctionReturn(0);
179749a6ff4bSBarry Smith }
179849a6ff4bSBarry Smith 
1799637a0070SStefano Zampini PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar **array)
180064e87e97SBarry Smith {
1801c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
18023a40ed3dSBarry Smith 
18033a40ed3dSBarry Smith   PetscFunctionBegin;
1804616b8fbbSStefano Zampini   if (mat->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first");
180564e87e97SBarry Smith   *array = mat->v;
18063a40ed3dSBarry Smith   PetscFunctionReturn(0);
180764e87e97SBarry Smith }
18080754003eSLois Curfman McInnes 
1809637a0070SStefano Zampini PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar **array)
1810ff14e315SSatish Balay {
18113a40ed3dSBarry Smith   PetscFunctionBegin;
1812637a0070SStefano Zampini   *array = NULL;
18133a40ed3dSBarry Smith   PetscFunctionReturn(0);
1814ff14e315SSatish Balay }
18150754003eSLois Curfman McInnes 
1816dec5eb66SMatthew G Knepley /*@C
181749a6ff4bSBarry Smith    MatDenseGetLDA - gets the leading dimension of the array returned from MatDenseGetArray()
181849a6ff4bSBarry Smith 
1819ad16ce7aSStefano Zampini    Not collective
182049a6ff4bSBarry Smith 
182149a6ff4bSBarry Smith    Input Parameter:
182249a6ff4bSBarry Smith .  mat - a MATSEQDENSE or MATMPIDENSE matrix
182349a6ff4bSBarry Smith 
182449a6ff4bSBarry Smith    Output Parameter:
182549a6ff4bSBarry Smith .   lda - the leading dimension
182649a6ff4bSBarry Smith 
182749a6ff4bSBarry Smith    Level: intermediate
182849a6ff4bSBarry Smith 
1829ad16ce7aSStefano Zampini .seealso: MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead(), MatDenseSetLDA()
183049a6ff4bSBarry Smith @*/
183149a6ff4bSBarry Smith PetscErrorCode  MatDenseGetLDA(Mat A,PetscInt *lda)
183249a6ff4bSBarry Smith {
183349a6ff4bSBarry Smith   PetscErrorCode ierr;
183449a6ff4bSBarry Smith 
183549a6ff4bSBarry Smith   PetscFunctionBegin;
1836d5ea218eSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
1837d5ea218eSStefano Zampini   PetscValidPointer(lda,2);
183849a6ff4bSBarry Smith   ierr = PetscUseMethod(A,"MatDenseGetLDA_C",(Mat,PetscInt*),(A,lda));CHKERRQ(ierr);
183949a6ff4bSBarry Smith   PetscFunctionReturn(0);
184049a6ff4bSBarry Smith }
184149a6ff4bSBarry Smith 
184249a6ff4bSBarry Smith /*@C
1843ad16ce7aSStefano Zampini    MatDenseSetLDA - Sets the leading dimension of the array used by the dense matrix
1844ad16ce7aSStefano Zampini 
1845ad16ce7aSStefano Zampini    Not collective
1846ad16ce7aSStefano Zampini 
1847ad16ce7aSStefano Zampini    Input Parameter:
1848ad16ce7aSStefano Zampini +  mat - a MATSEQDENSE or MATMPIDENSE matrix
1849ad16ce7aSStefano Zampini -  lda - the leading dimension
1850ad16ce7aSStefano Zampini 
1851ad16ce7aSStefano Zampini    Level: intermediate
1852ad16ce7aSStefano Zampini 
1853ad16ce7aSStefano Zampini .seealso: MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead(), MatDenseGetLDA()
1854ad16ce7aSStefano Zampini @*/
1855ad16ce7aSStefano Zampini PetscErrorCode  MatDenseSetLDA(Mat A,PetscInt lda)
1856ad16ce7aSStefano Zampini {
1857ad16ce7aSStefano Zampini   PetscErrorCode ierr;
1858ad16ce7aSStefano Zampini 
1859ad16ce7aSStefano Zampini   PetscFunctionBegin;
1860ad16ce7aSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
1861ad16ce7aSStefano Zampini   ierr = PetscTryMethod(A,"MatDenseSetLDA_C",(Mat,PetscInt),(A,lda));CHKERRQ(ierr);
1862ad16ce7aSStefano Zampini   PetscFunctionReturn(0);
1863ad16ce7aSStefano Zampini }
1864ad16ce7aSStefano Zampini 
1865ad16ce7aSStefano Zampini /*@C
18666947451fSStefano Zampini    MatDenseGetArray - gives read-write access to the array where the data for a dense matrix is stored
186773a71a0fSBarry Smith 
18688572280aSBarry Smith    Logically Collective on Mat
186973a71a0fSBarry Smith 
187073a71a0fSBarry Smith    Input Parameter:
18716947451fSStefano Zampini .  mat - a dense matrix
187273a71a0fSBarry Smith 
187373a71a0fSBarry Smith    Output Parameter:
187473a71a0fSBarry Smith .   array - pointer to the data
187573a71a0fSBarry Smith 
187673a71a0fSBarry Smith    Level: intermediate
187773a71a0fSBarry Smith 
18786947451fSStefano Zampini .seealso: MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead(), MatDenseGetArrayWrite(), MatDenseRestoreArrayWrite()
187973a71a0fSBarry Smith @*/
18808c778c55SBarry Smith PetscErrorCode  MatDenseGetArray(Mat A,PetscScalar **array)
188173a71a0fSBarry Smith {
188273a71a0fSBarry Smith   PetscErrorCode ierr;
188373a71a0fSBarry Smith 
188473a71a0fSBarry Smith   PetscFunctionBegin;
1885d5ea218eSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
1886d5ea218eSStefano Zampini   PetscValidPointer(array,2);
18878c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
188873a71a0fSBarry Smith   PetscFunctionReturn(0);
188973a71a0fSBarry Smith }
189073a71a0fSBarry Smith 
1891dec5eb66SMatthew G Knepley /*@C
1892579dbff0SBarry Smith    MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray()
189373a71a0fSBarry Smith 
18948572280aSBarry Smith    Logically Collective on Mat
18958572280aSBarry Smith 
18968572280aSBarry Smith    Input Parameters:
18976947451fSStefano Zampini +  mat - a dense matrix
1898a2b725a8SWilliam Gropp -  array - pointer to the data
18998572280aSBarry Smith 
19008572280aSBarry Smith    Level: intermediate
19018572280aSBarry Smith 
19026947451fSStefano Zampini .seealso: MatDenseGetArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead(), MatDenseGetArrayWrite(), MatDenseRestoreArrayWrite()
19038572280aSBarry Smith @*/
19048572280aSBarry Smith PetscErrorCode  MatDenseRestoreArray(Mat A,PetscScalar **array)
19058572280aSBarry Smith {
19068572280aSBarry Smith   PetscErrorCode ierr;
19078572280aSBarry Smith 
19088572280aSBarry Smith   PetscFunctionBegin;
1909d5ea218eSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
1910d5ea218eSStefano Zampini   PetscValidPointer(array,2);
19118572280aSBarry Smith   ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
19128572280aSBarry Smith   ierr = PetscObjectStateIncrease((PetscObject)A);CHKERRQ(ierr);
1913637a0070SStefano Zampini #if defined(PETSC_HAVE_CUDA)
1914637a0070SStefano Zampini   A->offloadmask = PETSC_OFFLOAD_CPU;
1915637a0070SStefano Zampini #endif
19168572280aSBarry Smith   PetscFunctionReturn(0);
19178572280aSBarry Smith }
19188572280aSBarry Smith 
19198572280aSBarry Smith /*@C
19206947451fSStefano Zampini    MatDenseGetArrayRead - gives read-only access to the array where the data for a dense matrix is stored
19218572280aSBarry Smith 
19228572280aSBarry Smith    Not Collective
19238572280aSBarry Smith 
19248572280aSBarry Smith    Input Parameter:
19256947451fSStefano Zampini .  mat - a dense matrix
19268572280aSBarry Smith 
19278572280aSBarry Smith    Output Parameter:
19288572280aSBarry Smith .   array - pointer to the data
19298572280aSBarry Smith 
19308572280aSBarry Smith    Level: intermediate
19318572280aSBarry Smith 
19326947451fSStefano Zampini .seealso: MatDenseRestoreArrayRead(), MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayWrite(), MatDenseRestoreArrayWrite()
19338572280aSBarry Smith @*/
19348572280aSBarry Smith PetscErrorCode  MatDenseGetArrayRead(Mat A,const PetscScalar **array)
19358572280aSBarry Smith {
19368572280aSBarry Smith   PetscErrorCode ierr;
19378572280aSBarry Smith 
19388572280aSBarry Smith   PetscFunctionBegin;
1939d5ea218eSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
1940d5ea218eSStefano Zampini   PetscValidPointer(array,2);
19418572280aSBarry Smith   ierr = PetscUseMethod(A,"MatDenseGetArrayRead_C",(Mat,const PetscScalar**),(A,array));CHKERRQ(ierr);
19428572280aSBarry Smith   PetscFunctionReturn(0);
19438572280aSBarry Smith }
19448572280aSBarry Smith 
19458572280aSBarry Smith /*@C
19466947451fSStefano Zampini    MatDenseRestoreArrayRead - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArrayRead()
19478572280aSBarry Smith 
194873a71a0fSBarry Smith    Not Collective
194973a71a0fSBarry Smith 
195073a71a0fSBarry Smith    Input Parameters:
19516947451fSStefano Zampini +  mat - a dense matrix
1952a2b725a8SWilliam Gropp -  array - pointer to the data
195373a71a0fSBarry Smith 
195473a71a0fSBarry Smith    Level: intermediate
195573a71a0fSBarry Smith 
19566947451fSStefano Zampini .seealso: MatDenseGetArrayRead(), MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayWrite(), MatDenseRestoreArrayWrite()
195773a71a0fSBarry Smith @*/
19588572280aSBarry Smith PetscErrorCode  MatDenseRestoreArrayRead(Mat A,const PetscScalar **array)
195973a71a0fSBarry Smith {
196073a71a0fSBarry Smith   PetscErrorCode ierr;
196173a71a0fSBarry Smith 
196273a71a0fSBarry Smith   PetscFunctionBegin;
1963d5ea218eSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
1964d5ea218eSStefano Zampini   PetscValidPointer(array,2);
19658572280aSBarry Smith   ierr = PetscUseMethod(A,"MatDenseRestoreArrayRead_C",(Mat,const PetscScalar**),(A,array));CHKERRQ(ierr);
196673a71a0fSBarry Smith   PetscFunctionReturn(0);
196773a71a0fSBarry Smith }
196873a71a0fSBarry Smith 
19696947451fSStefano Zampini /*@C
19706947451fSStefano Zampini    MatDenseGetArrayWrite - gives write-only access to the array where the data for a dense matrix is stored
19716947451fSStefano Zampini 
19726947451fSStefano Zampini    Not Collective
19736947451fSStefano Zampini 
19746947451fSStefano Zampini    Input Parameter:
19756947451fSStefano Zampini .  mat - a dense matrix
19766947451fSStefano Zampini 
19776947451fSStefano Zampini    Output Parameter:
19786947451fSStefano Zampini .   array - pointer to the data
19796947451fSStefano Zampini 
19806947451fSStefano Zampini    Level: intermediate
19816947451fSStefano Zampini 
19826947451fSStefano Zampini .seealso: MatDenseRestoreArrayWrite(), MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead()
19836947451fSStefano Zampini @*/
19846947451fSStefano Zampini PetscErrorCode  MatDenseGetArrayWrite(Mat A,PetscScalar **array)
19856947451fSStefano Zampini {
19866947451fSStefano Zampini   PetscErrorCode ierr;
19876947451fSStefano Zampini 
19886947451fSStefano Zampini   PetscFunctionBegin;
1989d5ea218eSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
1990d5ea218eSStefano Zampini   PetscValidPointer(array,2);
19916947451fSStefano Zampini   ierr = PetscUseMethod(A,"MatDenseGetArrayWrite_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
19926947451fSStefano Zampini   PetscFunctionReturn(0);
19936947451fSStefano Zampini }
19946947451fSStefano Zampini 
19956947451fSStefano Zampini /*@C
19966947451fSStefano Zampini    MatDenseRestoreArrayWrite - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArrayWrite()
19976947451fSStefano Zampini 
19986947451fSStefano Zampini    Not Collective
19996947451fSStefano Zampini 
20006947451fSStefano Zampini    Input Parameters:
20016947451fSStefano Zampini +  mat - a dense matrix
20026947451fSStefano Zampini -  array - pointer to the data
20036947451fSStefano Zampini 
20046947451fSStefano Zampini    Level: intermediate
20056947451fSStefano Zampini 
20066947451fSStefano Zampini .seealso: MatDenseGetArrayWrite(), MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead()
20076947451fSStefano Zampini @*/
20086947451fSStefano Zampini PetscErrorCode  MatDenseRestoreArrayWrite(Mat A,PetscScalar **array)
20096947451fSStefano Zampini {
20106947451fSStefano Zampini   PetscErrorCode ierr;
20116947451fSStefano Zampini 
20126947451fSStefano Zampini   PetscFunctionBegin;
2013d5ea218eSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
2014d5ea218eSStefano Zampini   PetscValidPointer(array,2);
20156947451fSStefano Zampini   ierr = PetscUseMethod(A,"MatDenseRestoreArrayWrite_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
20166947451fSStefano Zampini   ierr = PetscObjectStateIncrease((PetscObject)A);CHKERRQ(ierr);
20176947451fSStefano Zampini #if defined(PETSC_HAVE_CUDA)
20186947451fSStefano Zampini   A->offloadmask = PETSC_OFFLOAD_CPU;
20196947451fSStefano Zampini #endif
20206947451fSStefano Zampini   PetscFunctionReturn(0);
20216947451fSStefano Zampini }
20226947451fSStefano Zampini 
20237dae84e0SHong Zhang static PetscErrorCode MatCreateSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B)
20240754003eSLois Curfman McInnes {
2025c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
20266849ba73SBarry Smith   PetscErrorCode ierr;
2027ca15aa20SStefano Zampini   PetscInt       i,j,nrows,ncols,blda;
20285d0c19d7SBarry Smith   const PetscInt *irow,*icol;
202987828ca2SBarry Smith   PetscScalar    *av,*bv,*v = mat->v;
20300754003eSLois Curfman McInnes   Mat            newmat;
20310754003eSLois Curfman McInnes 
20323a40ed3dSBarry Smith   PetscFunctionBegin;
203378b31e54SBarry Smith   ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr);
203478b31e54SBarry Smith   ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr);
2035e03a110bSBarry Smith   ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr);
2036e03a110bSBarry Smith   ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr);
20370754003eSLois Curfman McInnes 
2038182d2002SSatish Balay   /* Check submatrixcall */
2039182d2002SSatish Balay   if (scall == MAT_REUSE_MATRIX) {
204013f74950SBarry Smith     PetscInt n_cols,n_rows;
2041182d2002SSatish Balay     ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr);
204221a2c019SBarry Smith     if (n_rows != nrows || n_cols != ncols) {
2043f746d493SDmitry Karpeev       /* resize the result matrix to match number of requested rows/columns */
2044c61587bbSBarry Smith       ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
204521a2c019SBarry Smith     }
2046182d2002SSatish Balay     newmat = *B;
2047182d2002SSatish Balay   } else {
20480754003eSLois Curfman McInnes     /* Create and fill new matrix */
2049ce94432eSBarry Smith     ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr);
2050f69a0ea3SMatthew Knepley     ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
20517adad957SLisandro Dalcin     ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
20520298fd71SBarry Smith     ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr);
2053182d2002SSatish Balay   }
2054182d2002SSatish Balay 
2055182d2002SSatish Balay   /* Now extract the data pointers and do the copy,column at a time */
2056ca15aa20SStefano Zampini   ierr = MatDenseGetArray(newmat,&bv);CHKERRQ(ierr);
2057ca15aa20SStefano Zampini   ierr = MatDenseGetLDA(newmat,&blda);CHKERRQ(ierr);
2058182d2002SSatish Balay   for (i=0; i<ncols; i++) {
20596de62eeeSBarry Smith     av = v + mat->lda*icol[i];
2060ca15aa20SStefano Zampini     for (j=0; j<nrows; j++) bv[j] = av[irow[j]];
2061ca15aa20SStefano Zampini     bv += blda;
20620754003eSLois Curfman McInnes   }
2063ca15aa20SStefano Zampini   ierr = MatDenseRestoreArray(newmat,&bv);CHKERRQ(ierr);
2064182d2002SSatish Balay 
2065182d2002SSatish Balay   /* Assemble the matrices so that the correct flags are set */
20666d4a8577SBarry Smith   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
20676d4a8577SBarry Smith   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
20680754003eSLois Curfman McInnes 
20690754003eSLois Curfman McInnes   /* Free work space */
207078b31e54SBarry Smith   ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr);
207178b31e54SBarry Smith   ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr);
2072182d2002SSatish Balay   *B   = newmat;
20733a40ed3dSBarry Smith   PetscFunctionReturn(0);
20740754003eSLois Curfman McInnes }
20750754003eSLois Curfman McInnes 
20767dae84e0SHong Zhang static PetscErrorCode MatCreateSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[])
2077905e6a2fSBarry Smith {
20786849ba73SBarry Smith   PetscErrorCode ierr;
207913f74950SBarry Smith   PetscInt       i;
2080905e6a2fSBarry Smith 
20813a40ed3dSBarry Smith   PetscFunctionBegin;
2082905e6a2fSBarry Smith   if (scall == MAT_INITIAL_MATRIX) {
2083df750dc8SHong Zhang     ierr = PetscCalloc1(n+1,B);CHKERRQ(ierr);
2084905e6a2fSBarry Smith   }
2085905e6a2fSBarry Smith 
2086905e6a2fSBarry Smith   for (i=0; i<n; i++) {
20877dae84e0SHong Zhang     ierr = MatCreateSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr);
2088905e6a2fSBarry Smith   }
20893a40ed3dSBarry Smith   PetscFunctionReturn(0);
2090905e6a2fSBarry Smith }
2091905e6a2fSBarry Smith 
2092e0877f53SBarry Smith static PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode)
2093c0aa2d19SHong Zhang {
2094c0aa2d19SHong Zhang   PetscFunctionBegin;
2095c0aa2d19SHong Zhang   PetscFunctionReturn(0);
2096c0aa2d19SHong Zhang }
2097c0aa2d19SHong Zhang 
2098e0877f53SBarry Smith static PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode)
2099c0aa2d19SHong Zhang {
2100c0aa2d19SHong Zhang   PetscFunctionBegin;
2101c0aa2d19SHong Zhang   PetscFunctionReturn(0);
2102c0aa2d19SHong Zhang }
2103c0aa2d19SHong Zhang 
2104e0877f53SBarry Smith static PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str)
21054b0e389bSBarry Smith {
21064b0e389bSBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data;
21076849ba73SBarry Smith   PetscErrorCode    ierr;
2108ca15aa20SStefano Zampini   const PetscScalar *va;
2109ca15aa20SStefano Zampini   PetscScalar       *vb;
2110d0f46423SBarry Smith   PetscInt          lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j;
21113a40ed3dSBarry Smith 
21123a40ed3dSBarry Smith   PetscFunctionBegin;
211333f4a19fSKris Buschelman   /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */
211433f4a19fSKris Buschelman   if (A->ops->copy != B->ops->copy) {
2115cb5b572fSBarry Smith     ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr);
21163a40ed3dSBarry Smith     PetscFunctionReturn(0);
21173a40ed3dSBarry Smith   }
2118e32f2f54SBarry Smith   if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)");
2119ca15aa20SStefano Zampini   ierr = MatDenseGetArrayRead(A,&va);CHKERRQ(ierr);
2120ca15aa20SStefano Zampini   ierr = MatDenseGetArray(B,&vb);CHKERRQ(ierr);
2121a5ce6ee0Svictorle   if (lda1>m || lda2>m) {
21220dbb7854Svictorle     for (j=0; j<n; j++) {
2123ca15aa20SStefano Zampini       ierr = PetscArraycpy(vb+j*lda2,va+j*lda1,m);CHKERRQ(ierr);
2124a5ce6ee0Svictorle     }
2125a5ce6ee0Svictorle   } else {
2126ca15aa20SStefano Zampini     ierr = PetscArraycpy(vb,va,A->rmap->n*A->cmap->n);CHKERRQ(ierr);
2127a5ce6ee0Svictorle   }
2128ca15aa20SStefano Zampini   ierr = MatDenseRestoreArray(B,&vb);CHKERRQ(ierr);
2129ca15aa20SStefano Zampini   ierr = MatDenseRestoreArrayRead(A,&va);CHKERRQ(ierr);
2130ca15aa20SStefano Zampini   ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2131ca15aa20SStefano Zampini   ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2132273d9f13SBarry Smith   PetscFunctionReturn(0);
2133273d9f13SBarry Smith }
2134273d9f13SBarry Smith 
2135e0877f53SBarry Smith static PetscErrorCode MatSetUp_SeqDense(Mat A)
2136273d9f13SBarry Smith {
2137dfbe8321SBarry Smith   PetscErrorCode ierr;
2138273d9f13SBarry Smith 
2139273d9f13SBarry Smith   PetscFunctionBegin;
214018992e5dSStefano Zampini   ierr = PetscLayoutSetUp(A->rmap);CHKERRQ(ierr);
214118992e5dSStefano Zampini   ierr = PetscLayoutSetUp(A->cmap);CHKERRQ(ierr);
214218992e5dSStefano Zampini   if (!A->preallocated) {
2143f4259b30SLisandro Dalcin     ierr = MatSeqDenseSetPreallocation(A,NULL);CHKERRQ(ierr);
214418992e5dSStefano Zampini   }
21453a40ed3dSBarry Smith   PetscFunctionReturn(0);
21464b0e389bSBarry Smith }
21474b0e389bSBarry Smith 
2148ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A)
2149ba337c44SJed Brown {
2150ba337c44SJed Brown   PetscInt       i,nz = A->rmap->n*A->cmap->n;
2151ca15aa20SStefano Zampini   PetscScalar    *aa;
2152ca15aa20SStefano Zampini   PetscErrorCode ierr;
2153ba337c44SJed Brown 
2154ba337c44SJed Brown   PetscFunctionBegin;
2155ca15aa20SStefano Zampini   ierr = MatDenseGetArray(A,&aa);CHKERRQ(ierr);
2156ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]);
2157ca15aa20SStefano Zampini   ierr = MatDenseRestoreArray(A,&aa);CHKERRQ(ierr);
2158ba337c44SJed Brown   PetscFunctionReturn(0);
2159ba337c44SJed Brown }
2160ba337c44SJed Brown 
2161ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A)
2162ba337c44SJed Brown {
2163ba337c44SJed Brown   PetscInt       i,nz = A->rmap->n*A->cmap->n;
2164ca15aa20SStefano Zampini   PetscScalar    *aa;
2165ca15aa20SStefano Zampini   PetscErrorCode ierr;
2166ba337c44SJed Brown 
2167ba337c44SJed Brown   PetscFunctionBegin;
2168ca15aa20SStefano Zampini   ierr = MatDenseGetArray(A,&aa);CHKERRQ(ierr);
2169ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]);
2170ca15aa20SStefano Zampini   ierr = MatDenseRestoreArray(A,&aa);CHKERRQ(ierr);
2171ba337c44SJed Brown   PetscFunctionReturn(0);
2172ba337c44SJed Brown }
2173ba337c44SJed Brown 
2174ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A)
2175ba337c44SJed Brown {
2176ba337c44SJed Brown   PetscInt       i,nz = A->rmap->n*A->cmap->n;
2177ca15aa20SStefano Zampini   PetscScalar    *aa;
2178ca15aa20SStefano Zampini   PetscErrorCode ierr;
2179ba337c44SJed Brown 
2180ba337c44SJed Brown   PetscFunctionBegin;
2181ca15aa20SStefano Zampini   ierr = MatDenseGetArray(A,&aa);CHKERRQ(ierr);
2182ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]);
2183ca15aa20SStefano Zampini   ierr = MatDenseRestoreArray(A,&aa);CHKERRQ(ierr);
2184ba337c44SJed Brown   PetscFunctionReturn(0);
2185ba337c44SJed Brown }
2186284134d9SBarry Smith 
2187a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/
21884222ddf1SHong Zhang PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat C)
2189a9fe9ddaSSatish Balay {
2190ee16a9a1SHong Zhang   PetscErrorCode ierr;
2191d0f46423SBarry Smith   PetscInt       m=A->rmap->n,n=B->cmap->n;
21927a3c3d58SStefano Zampini   PetscBool      cisdense;
2193a9fe9ddaSSatish Balay 
2194ee16a9a1SHong Zhang   PetscFunctionBegin;
21954222ddf1SHong Zhang   ierr = MatSetSizes(C,m,n,m,n);CHKERRQ(ierr);
21967a3c3d58SStefano Zampini   ierr = PetscObjectTypeCompareAny((PetscObject)C,&cisdense,MATSEQDENSE,MATSEQDENSECUDA,"");CHKERRQ(ierr);
21977a3c3d58SStefano Zampini   if (!cisdense) {
21987a3c3d58SStefano Zampini     PetscBool flg;
21997a3c3d58SStefano Zampini 
2200ca15aa20SStefano Zampini     ierr = PetscObjectTypeCompare((PetscObject)B,((PetscObject)A)->type_name,&flg);CHKERRQ(ierr);
22014222ddf1SHong Zhang     ierr = MatSetType(C,flg ? ((PetscObject)A)->type_name : MATDENSE);CHKERRQ(ierr);
22027a3c3d58SStefano Zampini   }
220318992e5dSStefano Zampini   ierr = MatSetUp(C);CHKERRQ(ierr);
2204ee16a9a1SHong Zhang   PetscFunctionReturn(0);
2205ee16a9a1SHong Zhang }
2206a9fe9ddaSSatish Balay 
2207a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
2208a9fe9ddaSSatish Balay {
22096718818eSStefano Zampini   Mat_SeqDense       *a=(Mat_SeqDense*)A->data,*b=(Mat_SeqDense*)B->data,*c=(Mat_SeqDense*)C->data;
22100805154bSBarry Smith   PetscBLASInt       m,n,k;
2211ca15aa20SStefano Zampini   const PetscScalar *av,*bv;
2212ca15aa20SStefano Zampini   PetscScalar       *cv;
2213a9fe9ddaSSatish Balay   PetscScalar       _DOne=1.0,_DZero=0.0;
2214c2916339SPierre Jolivet   PetscErrorCode    ierr;
2215a9fe9ddaSSatish Balay 
2216a9fe9ddaSSatish Balay   PetscFunctionBegin;
22178208b9aeSStefano Zampini   ierr = PetscBLASIntCast(C->rmap->n,&m);CHKERRQ(ierr);
22188208b9aeSStefano Zampini   ierr = PetscBLASIntCast(C->cmap->n,&n);CHKERRQ(ierr);
2219c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr);
222049d0e964SStefano Zampini   if (!m || !n || !k) PetscFunctionReturn(0);
2221ca15aa20SStefano Zampini   ierr = MatDenseGetArrayRead(A,&av);CHKERRQ(ierr);
2222ca15aa20SStefano Zampini   ierr = MatDenseGetArrayRead(B,&bv);CHKERRQ(ierr);
22236718818eSStefano Zampini   ierr = MatDenseGetArrayWrite(C,&cv);CHKERRQ(ierr);
2224ca15aa20SStefano Zampini   PetscStackCallBLAS("BLASgemm",BLASgemm_("N","N",&m,&n,&k,&_DOne,av,&a->lda,bv,&b->lda,&_DZero,cv,&c->lda));
2225ca15aa20SStefano Zampini   ierr = PetscLogFlops(1.0*m*n*k + 1.0*m*n*(k-1));CHKERRQ(ierr);
2226ca15aa20SStefano Zampini   ierr = MatDenseRestoreArrayRead(A,&av);CHKERRQ(ierr);
2227ca15aa20SStefano Zampini   ierr = MatDenseRestoreArrayRead(B,&bv);CHKERRQ(ierr);
22286718818eSStefano Zampini   ierr = MatDenseRestoreArrayWrite(C,&cv);CHKERRQ(ierr);
2229a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
2230a9fe9ddaSSatish Balay }
2231a9fe9ddaSSatish Balay 
22324222ddf1SHong Zhang PetscErrorCode MatMatTransposeMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat C)
223369f65d41SStefano Zampini {
223469f65d41SStefano Zampini   PetscErrorCode ierr;
223569f65d41SStefano Zampini   PetscInt       m=A->rmap->n,n=B->rmap->n;
22367a3c3d58SStefano Zampini   PetscBool      cisdense;
223769f65d41SStefano Zampini 
223869f65d41SStefano Zampini   PetscFunctionBegin;
22394222ddf1SHong Zhang   ierr = MatSetSizes(C,m,n,m,n);CHKERRQ(ierr);
22407a3c3d58SStefano Zampini   ierr = PetscObjectTypeCompareAny((PetscObject)C,&cisdense,MATSEQDENSE,MATSEQDENSECUDA,"");CHKERRQ(ierr);
22417a3c3d58SStefano Zampini   if (!cisdense) {
22427a3c3d58SStefano Zampini     PetscBool flg;
22437a3c3d58SStefano Zampini 
2244ca15aa20SStefano Zampini     ierr = PetscObjectTypeCompare((PetscObject)B,((PetscObject)A)->type_name,&flg);CHKERRQ(ierr);
22454222ddf1SHong Zhang     ierr = MatSetType(C,flg ? ((PetscObject)A)->type_name : MATDENSE);CHKERRQ(ierr);
22467a3c3d58SStefano Zampini   }
224718992e5dSStefano Zampini   ierr = MatSetUp(C);CHKERRQ(ierr);
224869f65d41SStefano Zampini   PetscFunctionReturn(0);
224969f65d41SStefano Zampini }
225069f65d41SStefano Zampini 
225169f65d41SStefano Zampini PetscErrorCode MatMatTransposeMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
225269f65d41SStefano Zampini {
225369f65d41SStefano Zampini   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
225469f65d41SStefano Zampini   Mat_SeqDense      *b = (Mat_SeqDense*)B->data;
225569f65d41SStefano Zampini   Mat_SeqDense      *c = (Mat_SeqDense*)C->data;
22566718818eSStefano Zampini   const PetscScalar *av,*bv;
22576718818eSStefano Zampini   PetscScalar       *cv;
225869f65d41SStefano Zampini   PetscBLASInt      m,n,k;
225969f65d41SStefano Zampini   PetscScalar       _DOne=1.0,_DZero=0.0;
226069f65d41SStefano Zampini   PetscErrorCode    ierr;
226169f65d41SStefano Zampini 
226269f65d41SStefano Zampini   PetscFunctionBegin;
226349d0e964SStefano Zampini   ierr = PetscBLASIntCast(C->rmap->n,&m);CHKERRQ(ierr);
226449d0e964SStefano Zampini   ierr = PetscBLASIntCast(C->cmap->n,&n);CHKERRQ(ierr);
226569f65d41SStefano Zampini   ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr);
226649d0e964SStefano Zampini   if (!m || !n || !k) PetscFunctionReturn(0);
22676718818eSStefano Zampini   ierr = MatDenseGetArrayRead(A,&av);CHKERRQ(ierr);
22686718818eSStefano Zampini   ierr = MatDenseGetArrayRead(B,&bv);CHKERRQ(ierr);
22696718818eSStefano Zampini   ierr = MatDenseGetArrayWrite(C,&cv);CHKERRQ(ierr);
22706718818eSStefano Zampini   PetscStackCallBLAS("BLASgemm",BLASgemm_("N","T",&m,&n,&k,&_DOne,av,&a->lda,bv,&b->lda,&_DZero,cv,&c->lda));
22716718818eSStefano Zampini   ierr = MatDenseRestoreArrayRead(A,&av);CHKERRQ(ierr);
22726718818eSStefano Zampini   ierr = MatDenseRestoreArrayRead(B,&bv);CHKERRQ(ierr);
22736718818eSStefano Zampini   ierr = MatDenseRestoreArrayWrite(C,&cv);CHKERRQ(ierr);
2274ca15aa20SStefano Zampini   ierr = PetscLogFlops(1.0*m*n*k + 1.0*m*n*(k-1));CHKERRQ(ierr);
227569f65d41SStefano Zampini   PetscFunctionReturn(0);
227669f65d41SStefano Zampini }
227769f65d41SStefano Zampini 
22784222ddf1SHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat C)
2279a9fe9ddaSSatish Balay {
2280ee16a9a1SHong Zhang   PetscErrorCode ierr;
2281d0f46423SBarry Smith   PetscInt       m=A->cmap->n,n=B->cmap->n;
22827a3c3d58SStefano Zampini   PetscBool      cisdense;
2283a9fe9ddaSSatish Balay 
2284ee16a9a1SHong Zhang   PetscFunctionBegin;
22854222ddf1SHong Zhang   ierr = MatSetSizes(C,m,n,m,n);CHKERRQ(ierr);
22867a3c3d58SStefano Zampini   ierr = PetscObjectTypeCompareAny((PetscObject)C,&cisdense,MATSEQDENSE,MATSEQDENSECUDA,"");CHKERRQ(ierr);
22877a3c3d58SStefano Zampini   if (!cisdense) {
22887a3c3d58SStefano Zampini     PetscBool flg;
22897a3c3d58SStefano Zampini 
2290ca15aa20SStefano Zampini     ierr = PetscObjectTypeCompare((PetscObject)B,((PetscObject)A)->type_name,&flg);CHKERRQ(ierr);
22914222ddf1SHong Zhang     ierr = MatSetType(C,flg ? ((PetscObject)A)->type_name : MATDENSE);CHKERRQ(ierr);
22927a3c3d58SStefano Zampini   }
229318992e5dSStefano Zampini   ierr = MatSetUp(C);CHKERRQ(ierr);
2294ee16a9a1SHong Zhang   PetscFunctionReturn(0);
2295ee16a9a1SHong Zhang }
2296a9fe9ddaSSatish Balay 
229775648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
2298a9fe9ddaSSatish Balay {
2299a9fe9ddaSSatish Balay   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
2300a9fe9ddaSSatish Balay   Mat_SeqDense      *b = (Mat_SeqDense*)B->data;
2301a9fe9ddaSSatish Balay   Mat_SeqDense      *c = (Mat_SeqDense*)C->data;
23026718818eSStefano Zampini   const PetscScalar *av,*bv;
23036718818eSStefano Zampini   PetscScalar       *cv;
23040805154bSBarry Smith   PetscBLASInt      m,n,k;
2305a9fe9ddaSSatish Balay   PetscScalar       _DOne=1.0,_DZero=0.0;
2306c5df96a5SBarry Smith   PetscErrorCode    ierr;
2307a9fe9ddaSSatish Balay 
2308a9fe9ddaSSatish Balay   PetscFunctionBegin;
23098208b9aeSStefano Zampini   ierr = PetscBLASIntCast(C->rmap->n,&m);CHKERRQ(ierr);
23108208b9aeSStefano Zampini   ierr = PetscBLASIntCast(C->cmap->n,&n);CHKERRQ(ierr);
2311c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr);
231249d0e964SStefano Zampini   if (!m || !n || !k) PetscFunctionReturn(0);
23136718818eSStefano Zampini   ierr = MatDenseGetArrayRead(A,&av);CHKERRQ(ierr);
23146718818eSStefano Zampini   ierr = MatDenseGetArrayRead(B,&bv);CHKERRQ(ierr);
23156718818eSStefano Zampini   ierr = MatDenseGetArrayWrite(C,&cv);CHKERRQ(ierr);
23166718818eSStefano Zampini   PetscStackCallBLAS("BLASgemm",BLASgemm_("T","N",&m,&n,&k,&_DOne,av,&a->lda,bv,&b->lda,&_DZero,cv,&c->lda));
23176718818eSStefano Zampini   ierr = MatDenseRestoreArrayRead(A,&av);CHKERRQ(ierr);
23186718818eSStefano Zampini   ierr = MatDenseRestoreArrayRead(B,&bv);CHKERRQ(ierr);
23196718818eSStefano Zampini   ierr = MatDenseRestoreArrayWrite(C,&cv);CHKERRQ(ierr);
2320ca15aa20SStefano Zampini   ierr = PetscLogFlops(1.0*m*n*k + 1.0*m*n*(k-1));CHKERRQ(ierr);
2321a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
2322a9fe9ddaSSatish Balay }
2323985db425SBarry Smith 
23244222ddf1SHong Zhang /* ----------------------------------------------- */
23254222ddf1SHong Zhang static PetscErrorCode MatProductSetFromOptions_SeqDense_AB(Mat C)
23264222ddf1SHong Zhang {
23274222ddf1SHong Zhang   PetscFunctionBegin;
23284222ddf1SHong Zhang   C->ops->matmultsymbolic = MatMatMultSymbolic_SeqDense_SeqDense;
23294222ddf1SHong Zhang   C->ops->productsymbolic = MatProductSymbolic_AB;
23304222ddf1SHong Zhang   PetscFunctionReturn(0);
23314222ddf1SHong Zhang }
23324222ddf1SHong Zhang 
23334222ddf1SHong Zhang static PetscErrorCode MatProductSetFromOptions_SeqDense_AtB(Mat C)
23344222ddf1SHong Zhang {
23354222ddf1SHong Zhang   PetscFunctionBegin;
23364222ddf1SHong Zhang   C->ops->transposematmultsymbolic = MatTransposeMatMultSymbolic_SeqDense_SeqDense;
23374222ddf1SHong Zhang   C->ops->productsymbolic          = MatProductSymbolic_AtB;
23384222ddf1SHong Zhang   PetscFunctionReturn(0);
23394222ddf1SHong Zhang }
23404222ddf1SHong Zhang 
23414222ddf1SHong Zhang static PetscErrorCode MatProductSetFromOptions_SeqDense_ABt(Mat C)
23424222ddf1SHong Zhang {
23434222ddf1SHong Zhang   PetscFunctionBegin;
23444222ddf1SHong Zhang   C->ops->mattransposemultsymbolic = MatMatTransposeMultSymbolic_SeqDense_SeqDense;
23454222ddf1SHong Zhang   C->ops->productsymbolic          = MatProductSymbolic_ABt;
23464222ddf1SHong Zhang   PetscFunctionReturn(0);
23474222ddf1SHong Zhang }
23484222ddf1SHong Zhang 
23494222ddf1SHong Zhang PETSC_INTERN PetscErrorCode MatProductSetFromOptions_SeqDense(Mat C)
23504222ddf1SHong Zhang {
23514222ddf1SHong Zhang   PetscErrorCode ierr;
23524222ddf1SHong Zhang   Mat_Product    *product = C->product;
23534222ddf1SHong Zhang 
23544222ddf1SHong Zhang   PetscFunctionBegin;
23554222ddf1SHong Zhang   switch (product->type) {
23564222ddf1SHong Zhang   case MATPRODUCT_AB:
23574222ddf1SHong Zhang     ierr = MatProductSetFromOptions_SeqDense_AB(C);CHKERRQ(ierr);
23584222ddf1SHong Zhang     break;
23594222ddf1SHong Zhang   case MATPRODUCT_AtB:
23604222ddf1SHong Zhang     ierr = MatProductSetFromOptions_SeqDense_AtB(C);CHKERRQ(ierr);
23614222ddf1SHong Zhang     break;
23624222ddf1SHong Zhang   case MATPRODUCT_ABt:
23634222ddf1SHong Zhang     ierr = MatProductSetFromOptions_SeqDense_ABt(C);CHKERRQ(ierr);
23644222ddf1SHong Zhang     break;
23656718818eSStefano Zampini   default:
23664222ddf1SHong Zhang     break;
23674222ddf1SHong Zhang   }
23684222ddf1SHong Zhang   PetscFunctionReturn(0);
23694222ddf1SHong Zhang }
23704222ddf1SHong Zhang /* ----------------------------------------------- */
23714222ddf1SHong Zhang 
2372e0877f53SBarry Smith static PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[])
2373985db425SBarry Smith {
2374985db425SBarry Smith   Mat_SeqDense       *a = (Mat_SeqDense*)A->data;
2375985db425SBarry Smith   PetscErrorCode     ierr;
2376d0f46423SBarry Smith   PetscInt           i,j,m = A->rmap->n,n = A->cmap->n,p;
2377985db425SBarry Smith   PetscScalar        *x;
2378ca15aa20SStefano Zampini   const PetscScalar *aa;
2379985db425SBarry Smith 
2380985db425SBarry Smith   PetscFunctionBegin;
2381e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2382985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
2383985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
2384ca15aa20SStefano Zampini   ierr = MatDenseGetArrayRead(A,&aa);CHKERRQ(ierr);
2385e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
2386985db425SBarry Smith   for (i=0; i<m; i++) {
2387985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
2388985db425SBarry Smith     for (j=1; j<n; j++) {
2389ca15aa20SStefano Zampini       if (PetscRealPart(x[i]) < PetscRealPart(aa[i+a->lda*j])) {x[i] = aa[i + a->lda*j]; if (idx) idx[i] = j;}
2390985db425SBarry Smith     }
2391985db425SBarry Smith   }
2392ca15aa20SStefano Zampini   ierr = MatDenseRestoreArrayRead(A,&aa);CHKERRQ(ierr);
2393985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
2394985db425SBarry Smith   PetscFunctionReturn(0);
2395985db425SBarry Smith }
2396985db425SBarry Smith 
2397e0877f53SBarry Smith static PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[])
2398985db425SBarry Smith {
2399985db425SBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
2400985db425SBarry Smith   PetscErrorCode    ierr;
2401d0f46423SBarry Smith   PetscInt          i,j,m = A->rmap->n,n = A->cmap->n,p;
2402985db425SBarry Smith   PetscScalar       *x;
2403985db425SBarry Smith   PetscReal         atmp;
2404ca15aa20SStefano Zampini   const PetscScalar *aa;
2405985db425SBarry Smith 
2406985db425SBarry Smith   PetscFunctionBegin;
2407e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2408985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
2409985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
2410ca15aa20SStefano Zampini   ierr = MatDenseGetArrayRead(A,&aa);CHKERRQ(ierr);
2411e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
2412985db425SBarry Smith   for (i=0; i<m; i++) {
24139189402eSHong Zhang     x[i] = PetscAbsScalar(aa[i]);
2414985db425SBarry Smith     for (j=1; j<n; j++) {
2415ca15aa20SStefano Zampini       atmp = PetscAbsScalar(aa[i+a->lda*j]);
2416985db425SBarry Smith       if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;}
2417985db425SBarry Smith     }
2418985db425SBarry Smith   }
2419ca15aa20SStefano Zampini   ierr = MatDenseRestoreArrayRead(A,&aa);CHKERRQ(ierr);
2420985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
2421985db425SBarry Smith   PetscFunctionReturn(0);
2422985db425SBarry Smith }
2423985db425SBarry Smith 
2424e0877f53SBarry Smith static PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[])
2425985db425SBarry Smith {
2426985db425SBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
2427985db425SBarry Smith   PetscErrorCode    ierr;
2428d0f46423SBarry Smith   PetscInt          i,j,m = A->rmap->n,n = A->cmap->n,p;
2429985db425SBarry Smith   PetscScalar       *x;
2430ca15aa20SStefano Zampini   const PetscScalar *aa;
2431985db425SBarry Smith 
2432985db425SBarry 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);
2435985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
2436985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
2437e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
2438985db425SBarry Smith   for (i=0; i<m; i++) {
2439985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
2440985db425SBarry Smith     for (j=1; j<n; j++) {
2441ca15aa20SStefano Zampini       if (PetscRealPart(x[i]) > PetscRealPart(aa[i+a->lda*j])) {x[i] = aa[i + a->lda*j]; if (idx) idx[i] = j;}
2442985db425SBarry Smith     }
2443985db425SBarry Smith   }
2444985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
2445ca15aa20SStefano Zampini   ierr = MatDenseRestoreArrayRead(A,&aa);CHKERRQ(ierr);
2446985db425SBarry Smith   PetscFunctionReturn(0);
2447985db425SBarry Smith }
2448985db425SBarry Smith 
2449637a0070SStefano Zampini PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col)
24508d0534beSBarry Smith {
24518d0534beSBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
24528d0534beSBarry Smith   PetscErrorCode    ierr;
24538d0534beSBarry Smith   PetscScalar       *x;
2454ca15aa20SStefano Zampini   const PetscScalar *aa;
24558d0534beSBarry Smith 
24568d0534beSBarry Smith   PetscFunctionBegin;
2457e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2458ca15aa20SStefano Zampini   ierr = MatDenseGetArrayRead(A,&aa);CHKERRQ(ierr);
24598d0534beSBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
2460ca15aa20SStefano Zampini   ierr = PetscArraycpy(x,aa+col*a->lda,A->rmap->n);CHKERRQ(ierr);
24618d0534beSBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
2462ca15aa20SStefano Zampini   ierr = MatDenseRestoreArrayRead(A,&aa);CHKERRQ(ierr);
24638d0534beSBarry Smith   PetscFunctionReturn(0);
24648d0534beSBarry Smith }
24658d0534beSBarry Smith 
246652c5f739Sprj- PETSC_INTERN PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms)
24670716a85fSBarry Smith {
24680716a85fSBarry Smith   PetscErrorCode    ierr;
24690716a85fSBarry Smith   PetscInt          i,j,m,n;
24701683a169SBarry Smith   const PetscScalar *a;
24710716a85fSBarry Smith 
24720716a85fSBarry Smith   PetscFunctionBegin;
24730716a85fSBarry Smith   ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr);
2474580bdb30SBarry Smith   ierr = PetscArrayzero(norms,n);CHKERRQ(ierr);
24751683a169SBarry Smith   ierr = MatDenseGetArrayRead(A,&a);CHKERRQ(ierr);
24760716a85fSBarry Smith   if (type == NORM_2) {
24770716a85fSBarry Smith     for (i=0; i<n; i++) {
24780716a85fSBarry Smith       for (j=0; j<m; j++) {
24790716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]*a[j]);
24800716a85fSBarry Smith       }
24810716a85fSBarry Smith       a += m;
24820716a85fSBarry Smith     }
24830716a85fSBarry Smith   } else if (type == NORM_1) {
24840716a85fSBarry Smith     for (i=0; i<n; i++) {
24850716a85fSBarry Smith       for (j=0; j<m; j++) {
24860716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]);
24870716a85fSBarry Smith       }
24880716a85fSBarry Smith       a += m;
24890716a85fSBarry Smith     }
24900716a85fSBarry Smith   } else if (type == NORM_INFINITY) {
24910716a85fSBarry Smith     for (i=0; i<n; i++) {
24920716a85fSBarry Smith       for (j=0; j<m; j++) {
24930716a85fSBarry Smith         norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]);
24940716a85fSBarry Smith       }
24950716a85fSBarry Smith       a += m;
24960716a85fSBarry Smith     }
2497ce94432eSBarry Smith   } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType");
24981683a169SBarry Smith   ierr = MatDenseRestoreArrayRead(A,&a);CHKERRQ(ierr);
24990716a85fSBarry Smith   if (type == NORM_2) {
25008f1a2a5eSBarry Smith     for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]);
25010716a85fSBarry Smith   }
25020716a85fSBarry Smith   PetscFunctionReturn(0);
25030716a85fSBarry Smith }
25040716a85fSBarry Smith 
250573a71a0fSBarry Smith static PetscErrorCode  MatSetRandom_SeqDense(Mat x,PetscRandom rctx)
250673a71a0fSBarry Smith {
250773a71a0fSBarry Smith   PetscErrorCode ierr;
250873a71a0fSBarry Smith   PetscScalar    *a;
2509637a0070SStefano Zampini   PetscInt       lda,m,n,i,j;
251073a71a0fSBarry Smith 
251173a71a0fSBarry Smith   PetscFunctionBegin;
251273a71a0fSBarry Smith   ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr);
2513637a0070SStefano Zampini   ierr = MatDenseGetLDA(x,&lda);CHKERRQ(ierr);
25148c778c55SBarry Smith   ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr);
2515637a0070SStefano Zampini   for (j=0; j<n; j++) {
2516637a0070SStefano Zampini     for (i=0; i<m; i++) {
2517637a0070SStefano Zampini       ierr = PetscRandomGetValue(rctx,a+j*lda+i);CHKERRQ(ierr);
2518637a0070SStefano Zampini     }
251973a71a0fSBarry Smith   }
25208c778c55SBarry Smith   ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr);
252173a71a0fSBarry Smith   PetscFunctionReturn(0);
252273a71a0fSBarry Smith }
252373a71a0fSBarry Smith 
25243b49f96aSBarry Smith static PetscErrorCode MatMissingDiagonal_SeqDense(Mat A,PetscBool  *missing,PetscInt *d)
25253b49f96aSBarry Smith {
25263b49f96aSBarry Smith   PetscFunctionBegin;
25273b49f96aSBarry Smith   *missing = PETSC_FALSE;
25283b49f96aSBarry Smith   PetscFunctionReturn(0);
25293b49f96aSBarry Smith }
253073a71a0fSBarry Smith 
2531ca15aa20SStefano Zampini /* vals is not const */
2532af53bab2SHong Zhang static PetscErrorCode MatDenseGetColumn_SeqDense(Mat A,PetscInt col,PetscScalar **vals)
253386aefd0dSHong Zhang {
2534ca15aa20SStefano Zampini   PetscErrorCode ierr;
253586aefd0dSHong Zhang   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
2536ca15aa20SStefano Zampini   PetscScalar    *v;
253786aefd0dSHong Zhang 
253886aefd0dSHong Zhang   PetscFunctionBegin;
253986aefd0dSHong Zhang   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2540ca15aa20SStefano Zampini   ierr  = MatDenseGetArray(A,&v);CHKERRQ(ierr);
2541ca15aa20SStefano Zampini   *vals = v+col*a->lda;
2542ca15aa20SStefano Zampini   ierr  = MatDenseRestoreArray(A,&v);CHKERRQ(ierr);
254386aefd0dSHong Zhang   PetscFunctionReturn(0);
254486aefd0dSHong Zhang }
254586aefd0dSHong Zhang 
2546af53bab2SHong Zhang static PetscErrorCode MatDenseRestoreColumn_SeqDense(Mat A,PetscScalar **vals)
254786aefd0dSHong Zhang {
254886aefd0dSHong Zhang   PetscFunctionBegin;
2549f4259b30SLisandro Dalcin   *vals = NULL; /* user cannot accidently use the array later */
255086aefd0dSHong Zhang   PetscFunctionReturn(0);
255186aefd0dSHong Zhang }
2552abc3b08eSStefano Zampini 
2553289bc588SBarry Smith /* -------------------------------------------------------------------*/
2554a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense,
2555905e6a2fSBarry Smith                                         MatGetRow_SeqDense,
2556905e6a2fSBarry Smith                                         MatRestoreRow_SeqDense,
2557905e6a2fSBarry Smith                                         MatMult_SeqDense,
255897304618SKris Buschelman                                 /*  4*/ MatMultAdd_SeqDense,
25597c922b88SBarry Smith                                         MatMultTranspose_SeqDense,
25607c922b88SBarry Smith                                         MatMultTransposeAdd_SeqDense,
2561f4259b30SLisandro Dalcin                                         NULL,
2562f4259b30SLisandro Dalcin                                         NULL,
2563f4259b30SLisandro Dalcin                                         NULL,
2564f4259b30SLisandro Dalcin                                 /* 10*/ NULL,
2565905e6a2fSBarry Smith                                         MatLUFactor_SeqDense,
2566905e6a2fSBarry Smith                                         MatCholeskyFactor_SeqDense,
256741f059aeSBarry Smith                                         MatSOR_SeqDense,
2568ec8511deSBarry Smith                                         MatTranspose_SeqDense,
256997304618SKris Buschelman                                 /* 15*/ MatGetInfo_SeqDense,
2570905e6a2fSBarry Smith                                         MatEqual_SeqDense,
2571905e6a2fSBarry Smith                                         MatGetDiagonal_SeqDense,
2572905e6a2fSBarry Smith                                         MatDiagonalScale_SeqDense,
2573905e6a2fSBarry Smith                                         MatNorm_SeqDense,
2574c0aa2d19SHong Zhang                                 /* 20*/ MatAssemblyBegin_SeqDense,
2575c0aa2d19SHong Zhang                                         MatAssemblyEnd_SeqDense,
2576905e6a2fSBarry Smith                                         MatSetOption_SeqDense,
2577905e6a2fSBarry Smith                                         MatZeroEntries_SeqDense,
2578d519adbfSMatthew Knepley                                 /* 24*/ MatZeroRows_SeqDense,
2579f4259b30SLisandro Dalcin                                         NULL,
2580f4259b30SLisandro Dalcin                                         NULL,
2581f4259b30SLisandro Dalcin                                         NULL,
2582f4259b30SLisandro Dalcin                                         NULL,
25834994cf47SJed Brown                                 /* 29*/ MatSetUp_SeqDense,
2584f4259b30SLisandro Dalcin                                         NULL,
2585f4259b30SLisandro Dalcin                                         NULL,
2586f4259b30SLisandro Dalcin                                         NULL,
2587f4259b30SLisandro Dalcin                                         NULL,
2588d519adbfSMatthew Knepley                                 /* 34*/ MatDuplicate_SeqDense,
2589f4259b30SLisandro Dalcin                                         NULL,
2590f4259b30SLisandro Dalcin                                         NULL,
2591f4259b30SLisandro Dalcin                                         NULL,
2592f4259b30SLisandro Dalcin                                         NULL,
2593d519adbfSMatthew Knepley                                 /* 39*/ MatAXPY_SeqDense,
25947dae84e0SHong Zhang                                         MatCreateSubMatrices_SeqDense,
2595f4259b30SLisandro Dalcin                                         NULL,
25964b0e389bSBarry Smith                                         MatGetValues_SeqDense,
2597a5ae1ecdSBarry Smith                                         MatCopy_SeqDense,
2598d519adbfSMatthew Knepley                                 /* 44*/ MatGetRowMax_SeqDense,
2599a5ae1ecdSBarry Smith                                         MatScale_SeqDense,
26007d68702bSBarry Smith                                         MatShift_Basic,
2601f4259b30SLisandro Dalcin                                         NULL,
26023f49a652SStefano Zampini                                         MatZeroRowsColumns_SeqDense,
260373a71a0fSBarry Smith                                 /* 49*/ MatSetRandom_SeqDense,
2604f4259b30SLisandro Dalcin                                         NULL,
2605f4259b30SLisandro Dalcin                                         NULL,
2606f4259b30SLisandro Dalcin                                         NULL,
2607f4259b30SLisandro Dalcin                                         NULL,
2608f4259b30SLisandro Dalcin                                 /* 54*/ NULL,
2609f4259b30SLisandro Dalcin                                         NULL,
2610f4259b30SLisandro Dalcin                                         NULL,
2611f4259b30SLisandro Dalcin                                         NULL,
2612f4259b30SLisandro Dalcin                                         NULL,
2613f4259b30SLisandro Dalcin                                 /* 59*/ NULL,
2614e03a110bSBarry Smith                                         MatDestroy_SeqDense,
2615e03a110bSBarry Smith                                         MatView_SeqDense,
2616f4259b30SLisandro Dalcin                                         NULL,
2617f4259b30SLisandro Dalcin                                         NULL,
2618f4259b30SLisandro Dalcin                                 /* 64*/ NULL,
2619f4259b30SLisandro Dalcin                                         NULL,
2620f4259b30SLisandro Dalcin                                         NULL,
2621f4259b30SLisandro Dalcin                                         NULL,
2622f4259b30SLisandro Dalcin                                         NULL,
2623d519adbfSMatthew Knepley                                 /* 69*/ MatGetRowMaxAbs_SeqDense,
2624f4259b30SLisandro Dalcin                                         NULL,
2625f4259b30SLisandro Dalcin                                         NULL,
2626f4259b30SLisandro Dalcin                                         NULL,
2627f4259b30SLisandro Dalcin                                         NULL,
2628f4259b30SLisandro Dalcin                                 /* 74*/ NULL,
2629f4259b30SLisandro Dalcin                                         NULL,
2630f4259b30SLisandro Dalcin                                         NULL,
2631f4259b30SLisandro Dalcin                                         NULL,
2632f4259b30SLisandro Dalcin                                         NULL,
2633f4259b30SLisandro Dalcin                                 /* 79*/ NULL,
2634f4259b30SLisandro Dalcin                                         NULL,
2635f4259b30SLisandro Dalcin                                         NULL,
2636f4259b30SLisandro Dalcin                                         NULL,
26375bba2384SShri Abhyankar                                 /* 83*/ MatLoad_SeqDense,
2638637a0070SStefano Zampini                                         MatIsSymmetric_SeqDense,
26391cbb95d3SBarry Smith                                         MatIsHermitian_SeqDense,
2640f4259b30SLisandro Dalcin                                         NULL,
2641f4259b30SLisandro Dalcin                                         NULL,
2642f4259b30SLisandro Dalcin                                         NULL,
2643f4259b30SLisandro Dalcin                                 /* 89*/ NULL,
2644f4259b30SLisandro Dalcin                                         NULL,
2645a9fe9ddaSSatish Balay                                         MatMatMultNumeric_SeqDense_SeqDense,
2646f4259b30SLisandro Dalcin                                         NULL,
2647f4259b30SLisandro Dalcin                                         NULL,
2648f4259b30SLisandro Dalcin                                 /* 94*/ NULL,
2649f4259b30SLisandro Dalcin                                         NULL,
2650f4259b30SLisandro Dalcin                                         NULL,
265169f65d41SStefano Zampini                                         MatMatTransposeMultNumeric_SeqDense_SeqDense,
2652f4259b30SLisandro Dalcin                                         NULL,
26534222ddf1SHong Zhang                                 /* 99*/ MatProductSetFromOptions_SeqDense,
2654f4259b30SLisandro Dalcin                                         NULL,
2655f4259b30SLisandro Dalcin                                         NULL,
2656ba337c44SJed Brown                                         MatConjugate_SeqDense,
2657f4259b30SLisandro Dalcin                                         NULL,
2658f4259b30SLisandro Dalcin                                 /*104*/ NULL,
2659ba337c44SJed Brown                                         MatRealPart_SeqDense,
2660ba337c44SJed Brown                                         MatImaginaryPart_SeqDense,
2661f4259b30SLisandro Dalcin                                         NULL,
2662f4259b30SLisandro Dalcin                                         NULL,
2663f4259b30SLisandro Dalcin                                 /*109*/ NULL,
2664f4259b30SLisandro Dalcin                                         NULL,
26658d0534beSBarry Smith                                         MatGetRowMin_SeqDense,
2666aabbc4fbSShri Abhyankar                                         MatGetColumnVector_SeqDense,
26673b49f96aSBarry Smith                                         MatMissingDiagonal_SeqDense,
2668f4259b30SLisandro Dalcin                                 /*114*/ NULL,
2669f4259b30SLisandro Dalcin                                         NULL,
2670f4259b30SLisandro Dalcin                                         NULL,
2671f4259b30SLisandro Dalcin                                         NULL,
2672f4259b30SLisandro Dalcin                                         NULL,
2673f4259b30SLisandro Dalcin                                 /*119*/ NULL,
2674f4259b30SLisandro Dalcin                                         NULL,
2675f4259b30SLisandro Dalcin                                         NULL,
2676f4259b30SLisandro Dalcin                                         NULL,
2677f4259b30SLisandro Dalcin                                         NULL,
2678f4259b30SLisandro Dalcin                                 /*124*/ NULL,
26795df89d91SHong Zhang                                         MatGetColumnNorms_SeqDense,
2680f4259b30SLisandro Dalcin                                         NULL,
2681f4259b30SLisandro Dalcin                                         NULL,
2682f4259b30SLisandro Dalcin                                         NULL,
2683f4259b30SLisandro Dalcin                                 /*129*/ NULL,
2684f4259b30SLisandro Dalcin                                         NULL,
2685f4259b30SLisandro Dalcin                                         NULL,
268675648e8dSHong Zhang                                         MatTransposeMatMultNumeric_SeqDense_SeqDense,
2687f4259b30SLisandro Dalcin                                         NULL,
2688f4259b30SLisandro Dalcin                                 /*134*/ NULL,
2689f4259b30SLisandro Dalcin                                         NULL,
2690f4259b30SLisandro Dalcin                                         NULL,
2691f4259b30SLisandro Dalcin                                         NULL,
2692f4259b30SLisandro Dalcin                                         NULL,
2693f4259b30SLisandro Dalcin                                 /*139*/ NULL,
2694f4259b30SLisandro Dalcin                                         NULL,
2695f4259b30SLisandro Dalcin                                         NULL,
2696f4259b30SLisandro Dalcin                                         NULL,
2697f4259b30SLisandro Dalcin                                         NULL,
26984222ddf1SHong Zhang                                         MatCreateMPIMatConcatenateSeqMat_SeqDense,
2699f4259b30SLisandro Dalcin                                 /*145*/ NULL,
2700f4259b30SLisandro Dalcin                                         NULL,
2701f4259b30SLisandro Dalcin                                         NULL
2702985db425SBarry Smith };
270390ace30eSBarry Smith 
27044b828684SBarry Smith /*@C
2705fafbff53SBarry Smith    MatCreateSeqDense - Creates a sequential dense matrix that
2706d65003e9SLois Curfman McInnes    is stored in column major order (the usual Fortran 77 manner). Many
2707d65003e9SLois Curfman McInnes    of the matrix operations use the BLAS and LAPACK routines.
2708289bc588SBarry Smith 
2709d083f849SBarry Smith    Collective
2710db81eaa0SLois Curfman McInnes 
271120563c6bSBarry Smith    Input Parameters:
2712db81eaa0SLois Curfman McInnes +  comm - MPI communicator, set to PETSC_COMM_SELF
27130c775827SLois Curfman McInnes .  m - number of rows
271418f449edSLois Curfman McInnes .  n - number of columns
27150298fd71SBarry Smith -  data - optional location of matrix data in column major order.  Set data=NULL for PETSc
2716dfc5480cSLois Curfman McInnes    to control all matrix memory allocation.
271720563c6bSBarry Smith 
271820563c6bSBarry Smith    Output Parameter:
271944cd7ae7SLois Curfman McInnes .  A - the matrix
272020563c6bSBarry Smith 
2721b259b22eSLois Curfman McInnes    Notes:
272218f449edSLois Curfman McInnes    The data input variable is intended primarily for Fortran programmers
272318f449edSLois Curfman McInnes    who wish to allocate their own matrix memory space.  Most users should
27240298fd71SBarry Smith    set data=NULL.
272518f449edSLois Curfman McInnes 
2726027ccd11SLois Curfman McInnes    Level: intermediate
2727027ccd11SLois Curfman McInnes 
272869b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues()
272920563c6bSBarry Smith @*/
27307087cfbeSBarry Smith PetscErrorCode  MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A)
2731289bc588SBarry Smith {
2732dfbe8321SBarry Smith   PetscErrorCode ierr;
27333b2fbd54SBarry Smith 
27343a40ed3dSBarry Smith   PetscFunctionBegin;
2735f69a0ea3SMatthew Knepley   ierr = MatCreate(comm,A);CHKERRQ(ierr);
2736f69a0ea3SMatthew Knepley   ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr);
2737273d9f13SBarry Smith   ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr);
2738273d9f13SBarry Smith   ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr);
2739273d9f13SBarry Smith   PetscFunctionReturn(0);
2740273d9f13SBarry Smith }
2741273d9f13SBarry Smith 
2742273d9f13SBarry Smith /*@C
2743273d9f13SBarry Smith    MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements
2744273d9f13SBarry Smith 
2745d083f849SBarry Smith    Collective
2746273d9f13SBarry Smith 
2747273d9f13SBarry Smith    Input Parameters:
27481c4f3114SJed Brown +  B - the matrix
27490298fd71SBarry Smith -  data - the array (or NULL)
2750273d9f13SBarry Smith 
2751273d9f13SBarry Smith    Notes:
2752273d9f13SBarry Smith    The data input variable is intended primarily for Fortran programmers
2753273d9f13SBarry Smith    who wish to allocate their own matrix memory space.  Most users should
2754284134d9SBarry Smith    need not call this routine.
2755273d9f13SBarry Smith 
2756273d9f13SBarry Smith    Level: intermediate
2757273d9f13SBarry Smith 
2758ad16ce7aSStefano Zampini .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatDenseSetLDA()
2759867c911aSBarry Smith 
2760273d9f13SBarry Smith @*/
27617087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation(Mat B,PetscScalar data[])
2762273d9f13SBarry Smith {
27634ac538c5SBarry Smith   PetscErrorCode ierr;
2764a23d5eceSKris Buschelman 
2765a23d5eceSKris Buschelman   PetscFunctionBegin;
2766d5ea218eSStefano Zampini   PetscValidHeaderSpecific(B,MAT_CLASSID,1);
27674ac538c5SBarry Smith   ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr);
2768a23d5eceSKris Buschelman   PetscFunctionReturn(0);
2769a23d5eceSKris Buschelman }
2770a23d5eceSKris Buschelman 
27717087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data)
2772a23d5eceSKris Buschelman {
2773ad16ce7aSStefano Zampini   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
2774dfbe8321SBarry Smith   PetscErrorCode ierr;
2775273d9f13SBarry Smith 
2776273d9f13SBarry Smith   PetscFunctionBegin;
2777616b8fbbSStefano Zampini   if (b->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first");
2778273d9f13SBarry Smith   B->preallocated = PETSC_TRUE;
2779a868139aSShri Abhyankar 
278034ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr);
278134ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr);
278234ef9618SShri Abhyankar 
2783ad16ce7aSStefano Zampini   if (b->lda <= 0) b->lda = B->rmap->n;
278486d161a7SShri Abhyankar 
2785ad16ce7aSStefano Zampini   ierr = PetscIntMultError(b->lda,B->cmap->n,NULL);CHKERRQ(ierr);
27869e8f95c4SLisandro Dalcin   if (!data) { /* petsc-allocated storage */
27879e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2788ad16ce7aSStefano Zampini     ierr = PetscCalloc1((size_t)b->lda*B->cmap->n,&b->v);CHKERRQ(ierr);
2789ad16ce7aSStefano Zampini     ierr = PetscLogObjectMemory((PetscObject)B,b->lda*B->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
27902205254eSKarl Rupp 
27919e8f95c4SLisandro Dalcin     b->user_alloc = PETSC_FALSE;
2792273d9f13SBarry Smith   } else { /* user-allocated storage */
27939e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2794273d9f13SBarry Smith     b->v          = data;
2795273d9f13SBarry Smith     b->user_alloc = PETSC_TRUE;
2796273d9f13SBarry Smith   }
27970450473dSBarry Smith   B->assembled = PETSC_TRUE;
2798273d9f13SBarry Smith   PetscFunctionReturn(0);
2799273d9f13SBarry Smith }
2800273d9f13SBarry Smith 
280165b80a83SHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
2802cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat)
28038baccfbdSHong Zhang {
2804d77f618aSHong Zhang   Mat               mat_elemental;
2805d77f618aSHong Zhang   PetscErrorCode    ierr;
28061683a169SBarry Smith   const PetscScalar *array;
28071683a169SBarry Smith   PetscScalar       *v_colwise;
2808d77f618aSHong Zhang   PetscInt          M=A->rmap->N,N=A->cmap->N,i,j,k,*rows,*cols;
2809d77f618aSHong Zhang 
28108baccfbdSHong Zhang   PetscFunctionBegin;
2811d77f618aSHong Zhang   ierr = PetscMalloc3(M*N,&v_colwise,M,&rows,N,&cols);CHKERRQ(ierr);
28121683a169SBarry Smith   ierr = MatDenseGetArrayRead(A,&array);CHKERRQ(ierr);
2813d77f618aSHong Zhang   /* convert column-wise array into row-wise v_colwise, see MatSetValues_Elemental() */
2814d77f618aSHong Zhang   k = 0;
2815d77f618aSHong Zhang   for (j=0; j<N; j++) {
2816d77f618aSHong Zhang     cols[j] = j;
2817d77f618aSHong Zhang     for (i=0; i<M; i++) {
2818d77f618aSHong Zhang       v_colwise[j*M+i] = array[k++];
2819d77f618aSHong Zhang     }
2820d77f618aSHong Zhang   }
2821d77f618aSHong Zhang   for (i=0; i<M; i++) {
2822d77f618aSHong Zhang     rows[i] = i;
2823d77f618aSHong Zhang   }
28241683a169SBarry Smith   ierr = MatDenseRestoreArrayRead(A,&array);CHKERRQ(ierr);
2825d77f618aSHong Zhang 
2826d77f618aSHong Zhang   ierr = MatCreate(PetscObjectComm((PetscObject)A), &mat_elemental);CHKERRQ(ierr);
2827d77f618aSHong Zhang   ierr = MatSetSizes(mat_elemental,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr);
2828d77f618aSHong Zhang   ierr = MatSetType(mat_elemental,MATELEMENTAL);CHKERRQ(ierr);
2829d77f618aSHong Zhang   ierr = MatSetUp(mat_elemental);CHKERRQ(ierr);
2830d77f618aSHong Zhang 
2831d77f618aSHong Zhang   /* PETSc-Elemental interaface uses axpy for setting off-processor entries, only ADD_VALUES is allowed */
2832d77f618aSHong Zhang   ierr = MatSetValues(mat_elemental,M,rows,N,cols,v_colwise,ADD_VALUES);CHKERRQ(ierr);
2833d77f618aSHong Zhang   ierr = MatAssemblyBegin(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2834d77f618aSHong Zhang   ierr = MatAssemblyEnd(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2835d77f618aSHong Zhang   ierr = PetscFree3(v_colwise,rows,cols);CHKERRQ(ierr);
2836d77f618aSHong Zhang 
2837511c6705SHong Zhang   if (reuse == MAT_INPLACE_MATRIX) {
283828be2f97SBarry Smith     ierr = MatHeaderReplace(A,&mat_elemental);CHKERRQ(ierr);
2839d77f618aSHong Zhang   } else {
2840d77f618aSHong Zhang     *newmat = mat_elemental;
2841d77f618aSHong Zhang   }
28428baccfbdSHong Zhang   PetscFunctionReturn(0);
28438baccfbdSHong Zhang }
284465b80a83SHong Zhang #endif
28458baccfbdSHong Zhang 
284617359960SJose E. Roman PetscErrorCode  MatDenseSetLDA_SeqDense(Mat B,PetscInt lda)
28471b807ce4Svictorle {
28481b807ce4Svictorle   Mat_SeqDense *b = (Mat_SeqDense*)B->data;
28497422da62SJose E. Roman   PetscBool    data;
285021a2c019SBarry Smith 
28511b807ce4Svictorle   PetscFunctionBegin;
28527422da62SJose E. Roman   data = (PetscBool)((B->rmap->n > 0 && B->cmap->n > 0) ? (b->v ? PETSC_TRUE : PETSC_FALSE) : PETSC_FALSE);
28537422da62SJose E. Roman   if (!b->user_alloc && data && b->lda!=lda) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"LDA cannot be changed after allocation of internal storage");
2854e32f2f54SBarry 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);
28551b807ce4Svictorle   b->lda = lda;
28561b807ce4Svictorle   PetscFunctionReturn(0);
28571b807ce4Svictorle }
28581b807ce4Svictorle 
2859d528f656SJakub Kruzik PetscErrorCode MatCreateMPIMatConcatenateSeqMat_SeqDense(MPI_Comm comm,Mat inmat,PetscInt n,MatReuse scall,Mat *outmat)
2860d528f656SJakub Kruzik {
2861d528f656SJakub Kruzik   PetscErrorCode ierr;
2862d528f656SJakub Kruzik   PetscMPIInt    size;
2863d528f656SJakub Kruzik 
2864d528f656SJakub Kruzik   PetscFunctionBegin;
2865d528f656SJakub Kruzik   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
2866d528f656SJakub Kruzik   if (size == 1) {
2867d528f656SJakub Kruzik     if (scall == MAT_INITIAL_MATRIX) {
2868d528f656SJakub Kruzik       ierr = MatDuplicate(inmat,MAT_COPY_VALUES,outmat);CHKERRQ(ierr);
2869d528f656SJakub Kruzik     } else {
2870d528f656SJakub Kruzik       ierr = MatCopy(inmat,*outmat,SAME_NONZERO_PATTERN);CHKERRQ(ierr);
2871d528f656SJakub Kruzik     }
2872d528f656SJakub Kruzik   } else {
2873d528f656SJakub Kruzik     ierr = MatCreateMPIMatConcatenateSeqMat_MPIDense(comm,inmat,n,scall,outmat);CHKERRQ(ierr);
2874d528f656SJakub Kruzik   }
2875d528f656SJakub Kruzik   PetscFunctionReturn(0);
2876d528f656SJakub Kruzik }
2877d528f656SJakub Kruzik 
28786947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVec_SeqDense(Mat A,PetscInt col,Vec *v)
28796947451fSStefano Zampini {
28806947451fSStefano Zampini   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
28816947451fSStefano Zampini   PetscErrorCode ierr;
28826947451fSStefano Zampini 
28836947451fSStefano Zampini   PetscFunctionBegin;
28845ea7661aSPierre Jolivet   if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first");
28855ea7661aSPierre Jolivet   if (a->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first");
28866947451fSStefano Zampini   if (!a->cvec) {
28876947451fSStefano Zampini     ierr = VecCreateSeqWithArray(PetscObjectComm((PetscObject)A),A->rmap->bs,A->rmap->n,NULL,&a->cvec);CHKERRQ(ierr);
2888616b8fbbSStefano Zampini     ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)a->cvec);CHKERRQ(ierr);
28896947451fSStefano Zampini   }
28906947451fSStefano Zampini   a->vecinuse = col + 1;
28916947451fSStefano Zampini   ierr = MatDenseGetArray(A,(PetscScalar**)&a->ptrinuse);CHKERRQ(ierr);
28926947451fSStefano Zampini   ierr = VecPlaceArray(a->cvec,a->ptrinuse + (size_t)col * (size_t)a->lda);CHKERRQ(ierr);
28936947451fSStefano Zampini   *v   = a->cvec;
28946947451fSStefano Zampini   PetscFunctionReturn(0);
28956947451fSStefano Zampini }
28966947451fSStefano Zampini 
28976947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVec_SeqDense(Mat A,PetscInt col,Vec *v)
28986947451fSStefano Zampini {
28996947451fSStefano Zampini   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
29006947451fSStefano Zampini   PetscErrorCode ierr;
29016947451fSStefano Zampini 
29026947451fSStefano Zampini   PetscFunctionBegin;
29035ea7661aSPierre Jolivet   if (!a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseGetColumnVec() first");
29046947451fSStefano Zampini   if (!a->cvec) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing internal column vector");
29056947451fSStefano Zampini   a->vecinuse = 0;
29066947451fSStefano Zampini   ierr = MatDenseRestoreArray(A,(PetscScalar**)&a->ptrinuse);CHKERRQ(ierr);
29076947451fSStefano Zampini   ierr = VecResetArray(a->cvec);CHKERRQ(ierr);
29086947451fSStefano Zampini   *v   = NULL;
29096947451fSStefano Zampini   PetscFunctionReturn(0);
29106947451fSStefano Zampini }
29116947451fSStefano Zampini 
29126947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVecRead_SeqDense(Mat A,PetscInt col,Vec *v)
29136947451fSStefano Zampini {
29146947451fSStefano Zampini   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
29156947451fSStefano Zampini   PetscErrorCode ierr;
29166947451fSStefano Zampini 
29176947451fSStefano Zampini   PetscFunctionBegin;
29185ea7661aSPierre Jolivet   if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first");
29195ea7661aSPierre Jolivet   if (a->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first");
29206947451fSStefano Zampini   if (!a->cvec) {
29216947451fSStefano Zampini     ierr = VecCreateSeqWithArray(PetscObjectComm((PetscObject)A),A->rmap->bs,A->rmap->n,NULL,&a->cvec);CHKERRQ(ierr);
2922616b8fbbSStefano Zampini     ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)a->cvec);CHKERRQ(ierr);
29236947451fSStefano Zampini   }
29246947451fSStefano Zampini   a->vecinuse = col + 1;
29256947451fSStefano Zampini   ierr = MatDenseGetArrayRead(A,&a->ptrinuse);CHKERRQ(ierr);
29266947451fSStefano Zampini   ierr = VecPlaceArray(a->cvec,a->ptrinuse + (size_t)col * (size_t)a->lda);CHKERRQ(ierr);
29276947451fSStefano Zampini   ierr = VecLockReadPush(a->cvec);CHKERRQ(ierr);
29286947451fSStefano Zampini   *v   = a->cvec;
29296947451fSStefano Zampini   PetscFunctionReturn(0);
29306947451fSStefano Zampini }
29316947451fSStefano Zampini 
29326947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVecRead_SeqDense(Mat A,PetscInt col,Vec *v)
29336947451fSStefano Zampini {
29346947451fSStefano Zampini   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
29356947451fSStefano Zampini   PetscErrorCode ierr;
29366947451fSStefano Zampini 
29376947451fSStefano Zampini   PetscFunctionBegin;
29385ea7661aSPierre Jolivet   if (!a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseGetColumnVec() first");
29396947451fSStefano Zampini   if (!a->cvec) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing internal column vector");
29406947451fSStefano Zampini   a->vecinuse = 0;
29416947451fSStefano Zampini   ierr = MatDenseRestoreArrayRead(A,&a->ptrinuse);CHKERRQ(ierr);
29426947451fSStefano Zampini   ierr = VecLockReadPop(a->cvec);CHKERRQ(ierr);
29436947451fSStefano Zampini   ierr = VecResetArray(a->cvec);CHKERRQ(ierr);
29446947451fSStefano Zampini   *v   = NULL;
29456947451fSStefano Zampini   PetscFunctionReturn(0);
29466947451fSStefano Zampini }
29476947451fSStefano Zampini 
29486947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVecWrite_SeqDense(Mat A,PetscInt col,Vec *v)
29496947451fSStefano Zampini {
29506947451fSStefano Zampini   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
29516947451fSStefano Zampini   PetscErrorCode ierr;
29526947451fSStefano Zampini 
29536947451fSStefano Zampini   PetscFunctionBegin;
29545ea7661aSPierre Jolivet   if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first");
29555ea7661aSPierre Jolivet   if (a->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first");
29566947451fSStefano Zampini   if (!a->cvec) {
29576947451fSStefano Zampini     ierr = VecCreateSeqWithArray(PetscObjectComm((PetscObject)A),A->rmap->bs,A->rmap->n,NULL,&a->cvec);CHKERRQ(ierr);
2958616b8fbbSStefano Zampini     ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)a->cvec);CHKERRQ(ierr);
29596947451fSStefano Zampini   }
29606947451fSStefano Zampini   a->vecinuse = col + 1;
29616947451fSStefano Zampini   ierr = MatDenseGetArrayWrite(A,(PetscScalar**)&a->ptrinuse);CHKERRQ(ierr);
29626947451fSStefano Zampini   ierr = VecPlaceArray(a->cvec,a->ptrinuse + (size_t)col * (size_t)a->lda);CHKERRQ(ierr);
29636947451fSStefano Zampini   *v   = a->cvec;
29646947451fSStefano Zampini   PetscFunctionReturn(0);
29656947451fSStefano Zampini }
29666947451fSStefano Zampini 
29676947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVecWrite_SeqDense(Mat A,PetscInt col,Vec *v)
29686947451fSStefano Zampini {
29696947451fSStefano Zampini   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
29706947451fSStefano Zampini   PetscErrorCode ierr;
29716947451fSStefano Zampini 
29726947451fSStefano Zampini   PetscFunctionBegin;
29735ea7661aSPierre Jolivet   if (!a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseGetColumnVec() first");
29746947451fSStefano Zampini   if (!a->cvec) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing internal column vector");
29756947451fSStefano Zampini   a->vecinuse = 0;
29766947451fSStefano Zampini   ierr = MatDenseRestoreArrayWrite(A,(PetscScalar**)&a->ptrinuse);CHKERRQ(ierr);
29776947451fSStefano Zampini   ierr = VecResetArray(a->cvec);CHKERRQ(ierr);
29786947451fSStefano Zampini   *v   = NULL;
29796947451fSStefano Zampini   PetscFunctionReturn(0);
29806947451fSStefano Zampini }
29816947451fSStefano Zampini 
29825ea7661aSPierre Jolivet PetscErrorCode MatDenseGetSubMatrix_SeqDense(Mat A,PetscInt cbegin,PetscInt cend,Mat *v)
29835ea7661aSPierre Jolivet {
29845ea7661aSPierre Jolivet   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
29855ea7661aSPierre Jolivet   PetscErrorCode ierr;
29865ea7661aSPierre Jolivet 
29875ea7661aSPierre Jolivet   PetscFunctionBegin;
29885ea7661aSPierre Jolivet   if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first");
29895ea7661aSPierre Jolivet   if (a->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first");
29905ea7661aSPierre Jolivet   if (a->cmat && cend-cbegin != a->cmat->cmap->N) {
29915ea7661aSPierre Jolivet     ierr = MatDestroy(&a->cmat);CHKERRQ(ierr);
29925ea7661aSPierre Jolivet   }
29935ea7661aSPierre Jolivet   if (!a->cmat) {
2994616b8fbbSStefano Zampini     ierr = MatCreateDense(PetscObjectComm((PetscObject)A),A->rmap->n,PETSC_DECIDE,A->rmap->N,cend-cbegin,(PetscScalar*)a->v + (size_t)cbegin * (size_t)a->lda,&a->cmat);CHKERRQ(ierr);
2995616b8fbbSStefano Zampini     ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)a->cmat);CHKERRQ(ierr);
29965ea7661aSPierre Jolivet   } else {
2997616b8fbbSStefano Zampini     ierr = MatDensePlaceArray(a->cmat,a->v + (size_t)cbegin * (size_t)a->lda);CHKERRQ(ierr);
29985ea7661aSPierre Jolivet   }
2999616b8fbbSStefano Zampini   ierr = MatDenseSetLDA(a->cmat,a->lda);CHKERRQ(ierr);
30005ea7661aSPierre Jolivet   a->matinuse = cbegin + 1;
30015ea7661aSPierre Jolivet   *v = a->cmat;
30025ea7661aSPierre Jolivet   PetscFunctionReturn(0);
30035ea7661aSPierre Jolivet }
30045ea7661aSPierre Jolivet 
30055ea7661aSPierre Jolivet PetscErrorCode MatDenseRestoreSubMatrix_SeqDense(Mat A,Mat *v)
30065ea7661aSPierre Jolivet {
30075ea7661aSPierre Jolivet   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
30085ea7661aSPierre Jolivet   PetscErrorCode ierr;
30095ea7661aSPierre Jolivet 
30105ea7661aSPierre Jolivet   PetscFunctionBegin;
30115ea7661aSPierre Jolivet   if (!a->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseGetSubMatrix() first");
30125ea7661aSPierre Jolivet   if (!a->cmat) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing internal column matrix");
3013616b8fbbSStefano Zampini   if (*v != a->cmat) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not the matrix obtained from MatDenseGetSubMatrix()");
30145ea7661aSPierre Jolivet   a->matinuse = 0;
30155ea7661aSPierre Jolivet   ierr = MatDenseResetArray(a->cmat);CHKERRQ(ierr);
30165ea7661aSPierre Jolivet   *v   = NULL;
30175ea7661aSPierre Jolivet   PetscFunctionReturn(0);
30185ea7661aSPierre Jolivet }
30195ea7661aSPierre Jolivet 
30200bad9183SKris Buschelman /*MC
3021fafad747SKris Buschelman    MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices.
30220bad9183SKris Buschelman 
30230bad9183SKris Buschelman    Options Database Keys:
30240bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions()
30250bad9183SKris Buschelman 
30260bad9183SKris Buschelman   Level: beginner
30270bad9183SKris Buschelman 
302889665df3SBarry Smith .seealso: MatCreateSeqDense()
302989665df3SBarry Smith 
30300bad9183SKris Buschelman M*/
3031ca15aa20SStefano Zampini PetscErrorCode MatCreate_SeqDense(Mat B)
3032273d9f13SBarry Smith {
3033273d9f13SBarry Smith   Mat_SeqDense   *b;
3034dfbe8321SBarry Smith   PetscErrorCode ierr;
30357c334f02SBarry Smith   PetscMPIInt    size;
3036273d9f13SBarry Smith 
3037273d9f13SBarry Smith   PetscFunctionBegin;
3038ce94432eSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr);
3039e32f2f54SBarry Smith   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1");
304055659b69SBarry Smith 
3041b00a9115SJed Brown   ierr    = PetscNewLog(B,&b);CHKERRQ(ierr);
3042549d3d68SSatish Balay   ierr    = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr);
304344cd7ae7SLois Curfman McInnes   B->data = (void*)b;
304418f449edSLois Curfman McInnes 
3045273d9f13SBarry Smith   b->roworiented = PETSC_TRUE;
30464e220ebcSLois Curfman McInnes 
304749a6ff4bSBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetLDA_C",MatDenseGetLDA_SeqDense);CHKERRQ(ierr);
3048ad16ce7aSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseSetLDA_C",MatDenseSetLDA_SeqDense);CHKERRQ(ierr);
3049bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr);
30508572280aSBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr);
3051d3042a70SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDensePlaceArray_C",MatDensePlaceArray_SeqDense);CHKERRQ(ierr);
3052d3042a70SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseResetArray_C",MatDenseResetArray_SeqDense);CHKERRQ(ierr);
3053d5ea218eSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseReplaceArray_C",MatDenseReplaceArray_SeqDense);CHKERRQ(ierr);
30548572280aSBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArrayRead_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr);
3055715b7558SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArrayRead_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr);
30566947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArrayWrite_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr);
30576947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArrayWrite_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr);
3058bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr);
30598baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
30608baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr);
30618baccfbdSHong Zhang #endif
3062d24d4204SJose E. Roman #if defined(PETSC_HAVE_SCALAPACK)
3063d24d4204SJose E. Roman   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_scalapack_C",MatConvert_Dense_ScaLAPACK);CHKERRQ(ierr);
3064d24d4204SJose E. Roman #endif
30652bf066beSStefano Zampini #if defined(PETSC_HAVE_CUDA)
30662bf066beSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqdensecuda_C",MatConvert_SeqDense_SeqDenseCUDA);CHKERRQ(ierr);
30674222ddf1SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqdensecuda_seqdensecuda_C",MatProductSetFromOptions_SeqDense);CHKERRQ(ierr);
30684222ddf1SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqdensecuda_seqdense_C",MatProductSetFromOptions_SeqDense);CHKERRQ(ierr);
3069637a0070SStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqdense_seqdensecuda_C",MatProductSetFromOptions_SeqDense);CHKERRQ(ierr);
30702bf066beSStefano Zampini #endif
3071bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr);
30724222ddf1SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqaij_seqdense_C",MatProductSetFromOptions_SeqAIJ_SeqDense);CHKERRQ(ierr);
30734222ddf1SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqdense_seqdense_C",MatProductSetFromOptions_SeqDense);CHKERRQ(ierr);
30744222ddf1SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqbaij_seqdense_C",MatProductSetFromOptions_SeqXBAIJ_SeqDense);CHKERRQ(ierr);
30754222ddf1SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqsbaij_seqdense_C",MatProductSetFromOptions_SeqXBAIJ_SeqDense);CHKERRQ(ierr);
307696e6d5c4SRichard Tran Mills 
3077af53bab2SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumn_C",MatDenseGetColumn_SeqDense);CHKERRQ(ierr);
3078af53bab2SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumn_C",MatDenseRestoreColumn_SeqDense);CHKERRQ(ierr);
30796947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumnVec_C",MatDenseGetColumnVec_SeqDense);CHKERRQ(ierr);
30806947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumnVec_C",MatDenseRestoreColumnVec_SeqDense);CHKERRQ(ierr);
30816947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumnVecRead_C",MatDenseGetColumnVecRead_SeqDense);CHKERRQ(ierr);
30826947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumnVecRead_C",MatDenseRestoreColumnVecRead_SeqDense);CHKERRQ(ierr);
30836947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumnVecWrite_C",MatDenseGetColumnVecWrite_SeqDense);CHKERRQ(ierr);
30846947451fSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumnVecWrite_C",MatDenseRestoreColumnVecWrite_SeqDense);CHKERRQ(ierr);
30855ea7661aSPierre Jolivet   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetSubMatrix_C",MatDenseGetSubMatrix_SeqDense);CHKERRQ(ierr);
30865ea7661aSPierre Jolivet   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreSubMatrix_C",MatDenseRestoreSubMatrix_SeqDense);CHKERRQ(ierr);
308717667f90SBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr);
30883a40ed3dSBarry Smith   PetscFunctionReturn(0);
3089289bc588SBarry Smith }
309086aefd0dSHong Zhang 
309186aefd0dSHong Zhang /*@C
3092af53bab2SHong 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.
309386aefd0dSHong Zhang 
309486aefd0dSHong Zhang    Not Collective
309586aefd0dSHong Zhang 
30965ea7661aSPierre Jolivet    Input Parameters:
309786aefd0dSHong Zhang +  mat - a MATSEQDENSE or MATMPIDENSE matrix
309886aefd0dSHong Zhang -  col - column index
309986aefd0dSHong Zhang 
310086aefd0dSHong Zhang    Output Parameter:
310186aefd0dSHong Zhang .  vals - pointer to the data
310286aefd0dSHong Zhang 
310386aefd0dSHong Zhang    Level: intermediate
310486aefd0dSHong Zhang 
310586aefd0dSHong Zhang .seealso: MatDenseRestoreColumn()
310686aefd0dSHong Zhang @*/
310786aefd0dSHong Zhang PetscErrorCode MatDenseGetColumn(Mat A,PetscInt col,PetscScalar **vals)
310886aefd0dSHong Zhang {
310986aefd0dSHong Zhang   PetscErrorCode ierr;
311086aefd0dSHong Zhang 
311186aefd0dSHong Zhang   PetscFunctionBegin;
3112d5ea218eSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
3113d5ea218eSStefano Zampini   PetscValidLogicalCollectiveInt(A,col,2);
3114d5ea218eSStefano Zampini   PetscValidPointer(vals,3);
311586aefd0dSHong Zhang   ierr = PetscUseMethod(A,"MatDenseGetColumn_C",(Mat,PetscInt,PetscScalar**),(A,col,vals));CHKERRQ(ierr);
311686aefd0dSHong Zhang   PetscFunctionReturn(0);
311786aefd0dSHong Zhang }
311886aefd0dSHong Zhang 
311986aefd0dSHong Zhang /*@C
312086aefd0dSHong Zhang    MatDenseRestoreColumn - returns access to a column of a dense matrix which is returned by MatDenseGetColumn().
312186aefd0dSHong Zhang 
312286aefd0dSHong Zhang    Not Collective
312386aefd0dSHong Zhang 
312486aefd0dSHong Zhang    Input Parameter:
312586aefd0dSHong Zhang .  mat - a MATSEQDENSE or MATMPIDENSE matrix
312686aefd0dSHong Zhang 
312786aefd0dSHong Zhang    Output Parameter:
312886aefd0dSHong Zhang .  vals - pointer to the data
312986aefd0dSHong Zhang 
313086aefd0dSHong Zhang    Level: intermediate
313186aefd0dSHong Zhang 
313286aefd0dSHong Zhang .seealso: MatDenseGetColumn()
313386aefd0dSHong Zhang @*/
313486aefd0dSHong Zhang PetscErrorCode MatDenseRestoreColumn(Mat A,PetscScalar **vals)
313586aefd0dSHong Zhang {
313686aefd0dSHong Zhang   PetscErrorCode ierr;
313786aefd0dSHong Zhang 
313886aefd0dSHong Zhang   PetscFunctionBegin;
3139d5ea218eSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
3140d5ea218eSStefano Zampini   PetscValidPointer(vals,2);
314186aefd0dSHong Zhang   ierr = PetscUseMethod(A,"MatDenseRestoreColumn_C",(Mat,PetscScalar**),(A,vals));CHKERRQ(ierr);
314286aefd0dSHong Zhang   PetscFunctionReturn(0);
314386aefd0dSHong Zhang }
31446947451fSStefano Zampini 
31456947451fSStefano Zampini /*@C
31466947451fSStefano Zampini    MatDenseGetColumnVec - Gives read-write access to a column of a dense matrix, represented as a Vec.
31476947451fSStefano Zampini 
31486947451fSStefano Zampini    Collective
31496947451fSStefano Zampini 
31505ea7661aSPierre Jolivet    Input Parameters:
31516947451fSStefano Zampini +  mat - the Mat object
31526947451fSStefano Zampini -  col - the column index
31536947451fSStefano Zampini 
31546947451fSStefano Zampini    Output Parameter:
31556947451fSStefano Zampini .  v - the vector
31566947451fSStefano Zampini 
31576947451fSStefano Zampini    Notes:
31586947451fSStefano Zampini      The vector is owned by PETSc. Users need to call MatDenseRestoreColumnVec() when the vector is no longer needed.
31596947451fSStefano Zampini      Use MatDenseGetColumnVecRead() to obtain read-only access or MatDenseGetColumnVecWrite() for write-only access.
31606947451fSStefano Zampini 
31616947451fSStefano Zampini    Level: intermediate
31626947451fSStefano Zampini 
31636947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVecRead(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecRead(), MatDenseRestoreColumnVecWrite()
31646947451fSStefano Zampini @*/
31656947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVec(Mat A,PetscInt col,Vec *v)
31666947451fSStefano Zampini {
31676947451fSStefano Zampini   PetscErrorCode ierr;
31686947451fSStefano Zampini 
31696947451fSStefano Zampini   PetscFunctionBegin;
31706947451fSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
31716947451fSStefano Zampini   PetscValidType(A,1);
31726947451fSStefano Zampini   PetscValidLogicalCollectiveInt(A,col,2);
31736947451fSStefano Zampini   PetscValidPointer(v,3);
31746947451fSStefano Zampini   if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated");
31756947451fSStefano 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);
31766947451fSStefano Zampini   ierr = PetscUseMethod(A,"MatDenseGetColumnVec_C",(Mat,PetscInt,Vec*),(A,col,v));CHKERRQ(ierr);
31776947451fSStefano Zampini   PetscFunctionReturn(0);
31786947451fSStefano Zampini }
31796947451fSStefano Zampini 
31806947451fSStefano Zampini /*@C
31816947451fSStefano Zampini    MatDenseRestoreColumnVec - Returns access to a column of a dense matrix obtained from MatDenseGetColumnVec().
31826947451fSStefano Zampini 
31836947451fSStefano Zampini    Collective
31846947451fSStefano Zampini 
31855ea7661aSPierre Jolivet    Input Parameters:
31866947451fSStefano Zampini +  mat - the Mat object
31876947451fSStefano Zampini .  col - the column index
31886947451fSStefano Zampini -  v - the Vec object
31896947451fSStefano Zampini 
31906947451fSStefano Zampini    Level: intermediate
31916947451fSStefano Zampini 
31926947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecRead(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVecRead(), MatDenseRestoreColumnVecWrite()
31936947451fSStefano Zampini @*/
31946947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVec(Mat A,PetscInt col,Vec *v)
31956947451fSStefano Zampini {
31966947451fSStefano Zampini   PetscErrorCode ierr;
31976947451fSStefano Zampini 
31986947451fSStefano Zampini   PetscFunctionBegin;
31996947451fSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
32006947451fSStefano Zampini   PetscValidType(A,1);
32016947451fSStefano Zampini   PetscValidLogicalCollectiveInt(A,col,2);
32026947451fSStefano Zampini   PetscValidPointer(v,3);
32036947451fSStefano Zampini   if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated");
32046947451fSStefano 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);
32056947451fSStefano Zampini   ierr = PetscUseMethod(A,"MatDenseRestoreColumnVec_C",(Mat,PetscInt,Vec*),(A,col,v));CHKERRQ(ierr);
32066947451fSStefano Zampini   PetscFunctionReturn(0);
32076947451fSStefano Zampini }
32086947451fSStefano Zampini 
32096947451fSStefano Zampini /*@C
32106947451fSStefano Zampini    MatDenseGetColumnVecRead - Gives read-only access to a column of a dense matrix, represented as a Vec.
32116947451fSStefano Zampini 
32126947451fSStefano Zampini    Collective
32136947451fSStefano Zampini 
32145ea7661aSPierre Jolivet    Input Parameters:
32156947451fSStefano Zampini +  mat - the Mat object
32166947451fSStefano Zampini -  col - the column index
32176947451fSStefano Zampini 
32186947451fSStefano Zampini    Output Parameter:
32196947451fSStefano Zampini .  v - the vector
32206947451fSStefano Zampini 
32216947451fSStefano Zampini    Notes:
32226947451fSStefano Zampini      The vector is owned by PETSc and users cannot modify it.
32236947451fSStefano Zampini      Users need to call MatDenseRestoreColumnVecRead() when the vector is no longer needed.
32246947451fSStefano Zampini      Use MatDenseGetColumnVec() to obtain read-write access or MatDenseGetColumnVecWrite() for write-only access.
32256947451fSStefano Zampini 
32266947451fSStefano Zampini    Level: intermediate
32276947451fSStefano Zampini 
32286947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecRead(), MatDenseRestoreColumnVecWrite()
32296947451fSStefano Zampini @*/
32306947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVecRead(Mat A,PetscInt col,Vec *v)
32316947451fSStefano Zampini {
32326947451fSStefano Zampini   PetscErrorCode ierr;
32336947451fSStefano Zampini 
32346947451fSStefano Zampini   PetscFunctionBegin;
32356947451fSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
32366947451fSStefano Zampini   PetscValidType(A,1);
32376947451fSStefano Zampini   PetscValidLogicalCollectiveInt(A,col,2);
32386947451fSStefano Zampini   PetscValidPointer(v,3);
32396947451fSStefano Zampini   if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated");
32406947451fSStefano 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);
32416947451fSStefano Zampini   ierr = PetscUseMethod(A,"MatDenseGetColumnVecRead_C",(Mat,PetscInt,Vec*),(A,col,v));CHKERRQ(ierr);
32426947451fSStefano Zampini   PetscFunctionReturn(0);
32436947451fSStefano Zampini }
32446947451fSStefano Zampini 
32456947451fSStefano Zampini /*@C
32466947451fSStefano Zampini    MatDenseRestoreColumnVecRead - Returns access to a column of a dense matrix obtained from MatDenseGetColumnVecRead().
32476947451fSStefano Zampini 
32486947451fSStefano Zampini    Collective
32496947451fSStefano Zampini 
32505ea7661aSPierre Jolivet    Input Parameters:
32516947451fSStefano Zampini +  mat - the Mat object
32526947451fSStefano Zampini .  col - the column index
32536947451fSStefano Zampini -  v - the Vec object
32546947451fSStefano Zampini 
32556947451fSStefano Zampini    Level: intermediate
32566947451fSStefano Zampini 
32576947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecRead(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecWrite()
32586947451fSStefano Zampini @*/
32596947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVecRead(Mat A,PetscInt col,Vec *v)
32606947451fSStefano Zampini {
32616947451fSStefano Zampini   PetscErrorCode ierr;
32626947451fSStefano Zampini 
32636947451fSStefano Zampini   PetscFunctionBegin;
32646947451fSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
32656947451fSStefano Zampini   PetscValidType(A,1);
32666947451fSStefano Zampini   PetscValidLogicalCollectiveInt(A,col,2);
32676947451fSStefano Zampini   PetscValidPointer(v,3);
32686947451fSStefano Zampini   if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated");
32696947451fSStefano 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);
32706947451fSStefano Zampini   ierr = PetscUseMethod(A,"MatDenseRestoreColumnVecRead_C",(Mat,PetscInt,Vec*),(A,col,v));CHKERRQ(ierr);
32716947451fSStefano Zampini   PetscFunctionReturn(0);
32726947451fSStefano Zampini }
32736947451fSStefano Zampini 
32746947451fSStefano Zampini /*@C
32756947451fSStefano Zampini    MatDenseGetColumnVecWrite - Gives write-only access to a column of a dense matrix, represented as a Vec.
32766947451fSStefano Zampini 
32776947451fSStefano Zampini    Collective
32786947451fSStefano Zampini 
32795ea7661aSPierre Jolivet    Input Parameters:
32806947451fSStefano Zampini +  mat - the Mat object
32816947451fSStefano Zampini -  col - the column index
32826947451fSStefano Zampini 
32836947451fSStefano Zampini    Output Parameter:
32846947451fSStefano Zampini .  v - the vector
32856947451fSStefano Zampini 
32866947451fSStefano Zampini    Notes:
32876947451fSStefano Zampini      The vector is owned by PETSc. Users need to call MatDenseRestoreColumnVecWrite() when the vector is no longer needed.
32886947451fSStefano Zampini      Use MatDenseGetColumnVec() to obtain read-write access or MatDenseGetColumnVecRead() for read-only access.
32896947451fSStefano Zampini 
32906947451fSStefano Zampini    Level: intermediate
32916947451fSStefano Zampini 
32926947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecRead(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecRead(), MatDenseRestoreColumnVecWrite()
32936947451fSStefano Zampini @*/
32946947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVecWrite(Mat A,PetscInt col,Vec *v)
32956947451fSStefano Zampini {
32966947451fSStefano Zampini   PetscErrorCode ierr;
32976947451fSStefano Zampini 
32986947451fSStefano Zampini   PetscFunctionBegin;
32996947451fSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
33006947451fSStefano Zampini   PetscValidType(A,1);
33016947451fSStefano Zampini   PetscValidLogicalCollectiveInt(A,col,2);
33026947451fSStefano Zampini   PetscValidPointer(v,3);
33036947451fSStefano Zampini   if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated");
33046947451fSStefano 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);
33056947451fSStefano Zampini   ierr = PetscUseMethod(A,"MatDenseGetColumnVecWrite_C",(Mat,PetscInt,Vec*),(A,col,v));CHKERRQ(ierr);
33066947451fSStefano Zampini   PetscFunctionReturn(0);
33076947451fSStefano Zampini }
33086947451fSStefano Zampini 
33096947451fSStefano Zampini /*@C
33106947451fSStefano Zampini    MatDenseRestoreColumnVecWrite - Returns access to a column of a dense matrix obtained from MatDenseGetColumnVecWrite().
33116947451fSStefano Zampini 
33126947451fSStefano Zampini    Collective
33136947451fSStefano Zampini 
33145ea7661aSPierre Jolivet    Input Parameters:
33156947451fSStefano Zampini +  mat - the Mat object
33166947451fSStefano Zampini .  col - the column index
33176947451fSStefano Zampini -  v - the Vec object
33186947451fSStefano Zampini 
33196947451fSStefano Zampini    Level: intermediate
33206947451fSStefano Zampini 
33216947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecRead(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecRead()
33226947451fSStefano Zampini @*/
33236947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVecWrite(Mat A,PetscInt col,Vec *v)
33246947451fSStefano Zampini {
33256947451fSStefano Zampini   PetscErrorCode ierr;
33266947451fSStefano Zampini 
33276947451fSStefano Zampini   PetscFunctionBegin;
33286947451fSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
33296947451fSStefano Zampini   PetscValidType(A,1);
33306947451fSStefano Zampini   PetscValidLogicalCollectiveInt(A,col,2);
33316947451fSStefano Zampini   PetscValidPointer(v,3);
33326947451fSStefano Zampini   if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated");
33336947451fSStefano 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);
33346947451fSStefano Zampini   ierr = PetscUseMethod(A,"MatDenseRestoreColumnVecWrite_C",(Mat,PetscInt,Vec*),(A,col,v));CHKERRQ(ierr);
33356947451fSStefano Zampini   PetscFunctionReturn(0);
33366947451fSStefano Zampini }
33375ea7661aSPierre Jolivet 
33385ea7661aSPierre Jolivet /*@C
33395ea7661aSPierre Jolivet    MatDenseGetSubMatrix - Gives access to a block of columns of a dense matrix, represented as a Mat.
33405ea7661aSPierre Jolivet 
33415ea7661aSPierre Jolivet    Collective
33425ea7661aSPierre Jolivet 
33435ea7661aSPierre Jolivet    Input Parameters:
33445ea7661aSPierre Jolivet +  mat - the Mat object
33455ea7661aSPierre Jolivet .  cbegin - the first index in the block
33465ea7661aSPierre Jolivet -  cend - the last index in the block
33475ea7661aSPierre Jolivet 
33485ea7661aSPierre Jolivet    Output Parameter:
33495ea7661aSPierre Jolivet .  v - the matrix
33505ea7661aSPierre Jolivet 
33515ea7661aSPierre Jolivet    Notes:
33525ea7661aSPierre Jolivet      The matrix is owned by PETSc. Users need to call MatDenseRestoreSubMatrix() when the matrix is no longer needed.
33535ea7661aSPierre Jolivet 
33545ea7661aSPierre Jolivet    Level: intermediate
33555ea7661aSPierre Jolivet 
33565ea7661aSPierre Jolivet .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseRestoreColumnVec(), MatDenseRestoreSubMatrix()
33575ea7661aSPierre Jolivet @*/
33585ea7661aSPierre Jolivet PetscErrorCode MatDenseGetSubMatrix(Mat A,PetscInt cbegin,PetscInt cend,Mat *v)
33595ea7661aSPierre Jolivet {
33605ea7661aSPierre Jolivet   PetscErrorCode ierr;
33615ea7661aSPierre Jolivet 
33625ea7661aSPierre Jolivet   PetscFunctionBegin;
33635ea7661aSPierre Jolivet   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
33645ea7661aSPierre Jolivet   PetscValidType(A,1);
33655ea7661aSPierre Jolivet   PetscValidLogicalCollectiveInt(A,cbegin,2);
33665ea7661aSPierre Jolivet   PetscValidLogicalCollectiveInt(A,cend,3);
33675ea7661aSPierre Jolivet   PetscValidPointer(v,4);
33685ea7661aSPierre Jolivet   if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated");
33695ea7661aSPierre Jolivet   if (cbegin < 0 || cbegin > A->cmap->N) SETERRQ2(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid cbegin %D, should be in [0,%D)",cbegin,A->cmap->N);
3370616b8fbbSStefano Zampini   if (cend < cbegin || cend > A->cmap->N) SETERRQ3(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid cend %D, should be in [%D,%D)",cend,cbegin,A->cmap->N);
33715ea7661aSPierre Jolivet   ierr = PetscUseMethod(A,"MatDenseGetSubMatrix_C",(Mat,PetscInt,PetscInt,Mat*),(A,cbegin,cend,v));CHKERRQ(ierr);
33725ea7661aSPierre Jolivet   PetscFunctionReturn(0);
33735ea7661aSPierre Jolivet }
33745ea7661aSPierre Jolivet 
33755ea7661aSPierre Jolivet /*@C
33765ea7661aSPierre Jolivet    MatDenseRestoreSubMatrix - Returns access to a block of columns of a dense matrix obtained from MatDenseGetSubMatrix().
33775ea7661aSPierre Jolivet 
33785ea7661aSPierre Jolivet    Collective
33795ea7661aSPierre Jolivet 
33805ea7661aSPierre Jolivet    Input Parameters:
33815ea7661aSPierre Jolivet +  mat - the Mat object
33825ea7661aSPierre Jolivet -  v - the Mat object
33835ea7661aSPierre Jolivet 
33845ea7661aSPierre Jolivet    Level: intermediate
33855ea7661aSPierre Jolivet 
33865ea7661aSPierre Jolivet .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseRestoreColumnVec(), MatDenseGetSubMatrix()
33875ea7661aSPierre Jolivet @*/
33885ea7661aSPierre Jolivet PetscErrorCode MatDenseRestoreSubMatrix(Mat A,Mat *v)
33895ea7661aSPierre Jolivet {
33905ea7661aSPierre Jolivet   PetscErrorCode ierr;
33915ea7661aSPierre Jolivet 
33925ea7661aSPierre Jolivet   PetscFunctionBegin;
33935ea7661aSPierre Jolivet   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
33945ea7661aSPierre Jolivet   PetscValidType(A,1);
33955ea7661aSPierre Jolivet   PetscValidPointer(v,2);
33965ea7661aSPierre Jolivet   ierr = PetscUseMethod(A,"MatDenseRestoreSubMatrix_C",(Mat,Mat*),(A,v));CHKERRQ(ierr);
33975ea7661aSPierre Jolivet   PetscFunctionReturn(0);
33985ea7661aSPierre Jolivet }
3399