xref: /petsc/src/mat/impls/dense/seq/dense.c (revision 28b400f66ebc7ae0049166a2294dfcd3df27e64b)
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;
168c178816SStefano Zampini 
178c178816SStefano Zampini   PetscFunctionBegin;
182c71b3e2SJacob Faibussowitsch   PetscCheckFalse(A->rmap->n != A->cmap->n,PetscObjectComm((PetscObject)A),PETSC_ERR_SUP,"Cannot symmetrize a rectangular matrix");
195f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArray(A,&v));
208c178816SStefano Zampini   if (!hermitian) {
218c178816SStefano Zampini     for (k=0;k<n;k++) {
228c178816SStefano Zampini       for (j=k;j<n;j++) {
23ca15aa20SStefano Zampini         v[j*mat->lda + k] = v[k*mat->lda + j];
248c178816SStefano Zampini       }
258c178816SStefano Zampini     }
268c178816SStefano Zampini   } else {
278c178816SStefano Zampini     for (k=0;k<n;k++) {
288c178816SStefano Zampini       for (j=k;j<n;j++) {
29ca15aa20SStefano Zampini         v[j*mat->lda + k] = PetscConj(v[k*mat->lda + j]);
308c178816SStefano Zampini       }
318c178816SStefano Zampini     }
328c178816SStefano Zampini   }
335f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArray(A,&v));
348c178816SStefano Zampini   PetscFunctionReturn(0);
358c178816SStefano Zampini }
368c178816SStefano Zampini 
3705709791SSatish Balay PETSC_EXTERN PetscErrorCode MatSeqDenseInvertFactors_Private(Mat A)
388c178816SStefano Zampini {
398c178816SStefano Zampini   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
408c178816SStefano Zampini   PetscBLASInt   info,n;
418c178816SStefano Zampini 
428c178816SStefano Zampini   PetscFunctionBegin;
438c178816SStefano Zampini   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
445f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(A->cmap->n,&n));
458c178816SStefano Zampini   if (A->factortype == MAT_FACTOR_LU) {
46*28b400f6SJacob Faibussowitsch     PetscCheck(mat->pivots,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Pivots not present");
478c178816SStefano Zampini     if (!mat->fwork) {
488c178816SStefano Zampini       mat->lfwork = n;
495f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscMalloc1(mat->lfwork,&mat->fwork));
505f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscLogObjectMemory((PetscObject)A,mat->lfwork*sizeof(PetscBLASInt)));
518c178816SStefano Zampini     }
525f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
538c178816SStefano Zampini     PetscStackCallBLAS("LAPACKgetri",LAPACKgetri_(&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&mat->lfwork,&info));
545f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFPTrapPop());
555f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0));
568c178816SStefano Zampini   } else if (A->factortype == MAT_FACTOR_CHOLESKY) {
578c178816SStefano Zampini     if (A->spd) {
585f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
598c178816SStefano Zampini       PetscStackCallBLAS("LAPACKpotri",LAPACKpotri_("L",&n,mat->v,&mat->lda,&info));
605f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscFPTrapPop());
615f80ce2aSJacob Faibussowitsch       CHKERRQ(MatSeqDenseSymmetrize_Private(A,PETSC_TRUE));
628c178816SStefano Zampini #if defined(PETSC_USE_COMPLEX)
638c178816SStefano Zampini     } else if (A->hermitian) {
64*28b400f6SJacob Faibussowitsch       PetscCheck(mat->pivots,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Pivots not present");
65*28b400f6SJacob Faibussowitsch       PetscCheck(mat->fwork,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Fwork not present");
665f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
678c178816SStefano Zampini       PetscStackCallBLAS("LAPACKhetri",LAPACKhetri_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&info));
685f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscFPTrapPop());
695f80ce2aSJacob Faibussowitsch       CHKERRQ(MatSeqDenseSymmetrize_Private(A,PETSC_TRUE));
708c178816SStefano Zampini #endif
718c178816SStefano Zampini     } else { /* symmetric case */
72*28b400f6SJacob Faibussowitsch       PetscCheck(mat->pivots,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Pivots not present");
73*28b400f6SJacob Faibussowitsch       PetscCheck(mat->fwork,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Fwork not present");
745f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
758c178816SStefano Zampini       PetscStackCallBLAS("LAPACKsytri",LAPACKsytri_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&info));
765f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscFPTrapPop());
775f80ce2aSJacob Faibussowitsch       CHKERRQ(MatSeqDenseSymmetrize_Private(A,PETSC_FALSE));
788c178816SStefano Zampini     }
79*28b400f6SJacob Faibussowitsch     PetscCheck(!info,PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad Inversion: zero pivot in row %" PetscInt_FMT,(PetscInt)info-1);
805f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0));
818c178816SStefano Zampini   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
828c178816SStefano Zampini 
838c178816SStefano Zampini   A->ops->solve             = NULL;
848c178816SStefano Zampini   A->ops->matsolve          = NULL;
858c178816SStefano Zampini   A->ops->solvetranspose    = NULL;
868c178816SStefano Zampini   A->ops->matsolvetranspose = NULL;
878c178816SStefano Zampini   A->ops->solveadd          = NULL;
888c178816SStefano Zampini   A->ops->solvetransposeadd = NULL;
898c178816SStefano Zampini   A->factortype             = MAT_FACTOR_NONE;
905f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(A->solvertype));
918c178816SStefano Zampini   PetscFunctionReturn(0);
928c178816SStefano Zampini }
938c178816SStefano Zampini 
943f49a652SStefano Zampini PetscErrorCode MatZeroRowsColumns_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b)
953f49a652SStefano Zampini {
963f49a652SStefano Zampini   Mat_SeqDense      *l = (Mat_SeqDense*)A->data;
973f49a652SStefano Zampini   PetscInt          m  = l->lda, n = A->cmap->n,r = A->rmap->n, i,j;
98ca15aa20SStefano Zampini   PetscScalar       *slot,*bb,*v;
993f49a652SStefano Zampini   const PetscScalar *xx;
1003f49a652SStefano Zampini 
1013f49a652SStefano Zampini   PetscFunctionBegin;
10276bd3646SJed Brown   if (PetscDefined(USE_DEBUG)) {
1033f49a652SStefano Zampini     for (i=0; i<N; i++) {
1042c71b3e2SJacob Faibussowitsch       PetscCheckFalse(rows[i] < 0,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed");
1052c71b3e2SJacob Faibussowitsch       PetscCheckFalse(rows[i] >= A->rmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row %" PetscInt_FMT " requested to be zeroed greater than or equal number of rows %" PetscInt_FMT,rows[i],A->rmap->n);
1062c71b3e2SJacob Faibussowitsch       PetscCheckFalse(rows[i] >= A->cmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Col %" PetscInt_FMT " requested to be zeroed greater than or equal number of cols %" PetscInt_FMT,rows[i],A->cmap->n);
1073f49a652SStefano Zampini     }
10876bd3646SJed Brown   }
109ca15aa20SStefano Zampini   if (!N) PetscFunctionReturn(0);
1103f49a652SStefano Zampini 
1113f49a652SStefano Zampini   /* fix right hand side if needed */
1123f49a652SStefano Zampini   if (x && b) {
1136c4d906cSStefano Zampini     Vec xt;
1146c4d906cSStefano Zampini 
1152c71b3e2SJacob Faibussowitsch     PetscCheckFalse(A->rmap->n != A->cmap->n,PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices");
1165f80ce2aSJacob Faibussowitsch     CHKERRQ(VecDuplicate(x,&xt));
1175f80ce2aSJacob Faibussowitsch     CHKERRQ(VecCopy(x,xt));
1185f80ce2aSJacob Faibussowitsch     CHKERRQ(VecScale(xt,-1.0));
1195f80ce2aSJacob Faibussowitsch     CHKERRQ(MatMultAdd(A,xt,b,b));
1205f80ce2aSJacob Faibussowitsch     CHKERRQ(VecDestroy(&xt));
1215f80ce2aSJacob Faibussowitsch     CHKERRQ(VecGetArrayRead(x,&xx));
1225f80ce2aSJacob Faibussowitsch     CHKERRQ(VecGetArray(b,&bb));
1233f49a652SStefano Zampini     for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]];
1245f80ce2aSJacob Faibussowitsch     CHKERRQ(VecRestoreArrayRead(x,&xx));
1255f80ce2aSJacob Faibussowitsch     CHKERRQ(VecRestoreArray(b,&bb));
1263f49a652SStefano Zampini   }
1273f49a652SStefano Zampini 
1285f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArray(A,&v));
1293f49a652SStefano Zampini   for (i=0; i<N; i++) {
130ca15aa20SStefano Zampini     slot = v + rows[i]*m;
1315f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscArrayzero(slot,r));
1323f49a652SStefano Zampini   }
1333f49a652SStefano Zampini   for (i=0; i<N; i++) {
134ca15aa20SStefano Zampini     slot = v + rows[i];
1353f49a652SStefano Zampini     for (j=0; j<n; j++) { *slot = 0.0; slot += m;}
1363f49a652SStefano Zampini   }
1373f49a652SStefano Zampini   if (diag != 0.0) {
1382c71b3e2SJacob Faibussowitsch     PetscCheckFalse(A->rmap->n != A->cmap->n,PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices");
1393f49a652SStefano Zampini     for (i=0; i<N; i++) {
140ca15aa20SStefano Zampini       slot  = v + (m+1)*rows[i];
1413f49a652SStefano Zampini       *slot = diag;
1423f49a652SStefano Zampini     }
1433f49a652SStefano Zampini   }
1445f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArray(A,&v));
1453f49a652SStefano Zampini   PetscFunctionReturn(0);
1463f49a652SStefano Zampini }
1473f49a652SStefano Zampini 
148abc3b08eSStefano Zampini PetscErrorCode MatPtAPNumeric_SeqDense_SeqDense(Mat A,Mat P,Mat C)
149abc3b08eSStefano Zampini {
150abc3b08eSStefano Zampini   Mat_SeqDense   *c = (Mat_SeqDense*)(C->data);
151abc3b08eSStefano Zampini 
152abc3b08eSStefano Zampini   PetscFunctionBegin;
153ca15aa20SStefano Zampini   if (c->ptapwork) {
1545f80ce2aSJacob Faibussowitsch     CHKERRQ((*C->ops->matmultnumeric)(A,P,c->ptapwork));
1555f80ce2aSJacob Faibussowitsch     CHKERRQ((*C->ops->transposematmultnumeric)(P,c->ptapwork,C));
1564222ddf1SHong Zhang   } else SETERRQ(PetscObjectComm((PetscObject)C),PETSC_ERR_SUP,"Must call MatPtAPSymbolic_SeqDense_SeqDense() first");
157abc3b08eSStefano Zampini   PetscFunctionReturn(0);
158abc3b08eSStefano Zampini }
159abc3b08eSStefano Zampini 
1604222ddf1SHong Zhang PetscErrorCode MatPtAPSymbolic_SeqDense_SeqDense(Mat A,Mat P,PetscReal fill,Mat C)
161abc3b08eSStefano Zampini {
162abc3b08eSStefano Zampini   Mat_SeqDense   *c;
1637a3c3d58SStefano Zampini   PetscBool      cisdense;
164abc3b08eSStefano Zampini 
165abc3b08eSStefano Zampini   PetscFunctionBegin;
1665f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetSizes(C,P->cmap->n,P->cmap->n,P->cmap->N,P->cmap->N));
1675f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectTypeCompareAny((PetscObject)C,&cisdense,MATSEQDENSE,MATSEQDENSECUDA,""));
1687a3c3d58SStefano Zampini   if (!cisdense) {
1697a3c3d58SStefano Zampini     PetscBool flg;
1707a3c3d58SStefano Zampini 
1715f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectTypeCompare((PetscObject)P,((PetscObject)A)->type_name,&flg));
1725f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSetType(C,flg ? ((PetscObject)A)->type_name : MATDENSE));
1737a3c3d58SStefano Zampini   }
1745f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetUp(C));
1754222ddf1SHong Zhang   c    = (Mat_SeqDense*)C->data;
1765f80ce2aSJacob Faibussowitsch   CHKERRQ(MatCreate(PetscObjectComm((PetscObject)A),&c->ptapwork));
1775f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetSizes(c->ptapwork,A->rmap->n,P->cmap->n,A->rmap->N,P->cmap->N));
1785f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetType(c->ptapwork,((PetscObject)C)->type_name));
1795f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetUp(c->ptapwork));
180abc3b08eSStefano Zampini   PetscFunctionReturn(0);
181abc3b08eSStefano Zampini }
182abc3b08eSStefano Zampini 
183cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqAIJ_SeqDense(Mat A,MatType newtype,MatReuse reuse,Mat *newmat)
184b49cda9fSStefano Zampini {
185a13144ffSStefano Zampini   Mat             B = NULL;
186b49cda9fSStefano Zampini   Mat_SeqAIJ      *a = (Mat_SeqAIJ*)A->data;
187b49cda9fSStefano Zampini   Mat_SeqDense    *b;
188b49cda9fSStefano Zampini   PetscInt        *ai=a->i,*aj=a->j,m=A->rmap->N,n=A->cmap->N,i;
1892e5835c6SStefano Zampini   const MatScalar *av;
190a13144ffSStefano Zampini   PetscBool       isseqdense;
191b49cda9fSStefano Zampini 
192b49cda9fSStefano Zampini   PetscFunctionBegin;
193a13144ffSStefano Zampini   if (reuse == MAT_REUSE_MATRIX) {
1945f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectTypeCompare((PetscObject)*newmat,MATSEQDENSE,&isseqdense));
195*28b400f6SJacob Faibussowitsch     PetscCheck(isseqdense,PetscObjectComm((PetscObject)*newmat),PETSC_ERR_USER,"Cannot reuse matrix of type %s",((PetscObject)(*newmat))->type_name);
196a13144ffSStefano Zampini   }
197a13144ffSStefano Zampini   if (reuse != MAT_REUSE_MATRIX) {
1985f80ce2aSJacob Faibussowitsch     CHKERRQ(MatCreate(PetscObjectComm((PetscObject)A),&B));
1995f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSetSizes(B,m,n,m,n));
2005f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSetType(B,MATSEQDENSE));
2015f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSeqDenseSetPreallocation(B,NULL));
202b49cda9fSStefano Zampini     b    = (Mat_SeqDense*)(B->data);
203a13144ffSStefano Zampini   } else {
204a13144ffSStefano Zampini     b    = (Mat_SeqDense*)((*newmat)->data);
2055f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscArrayzero(b->v,m*n));
206a13144ffSStefano Zampini   }
2075f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSeqAIJGetArrayRead(A,&av));
208b49cda9fSStefano Zampini   for (i=0; i<m; i++) {
209b49cda9fSStefano Zampini     PetscInt j;
210b49cda9fSStefano Zampini     for (j=0;j<ai[1]-ai[0];j++) {
211b49cda9fSStefano Zampini       b->v[*aj*m+i] = *av;
212b49cda9fSStefano Zampini       aj++;
213b49cda9fSStefano Zampini       av++;
214b49cda9fSStefano Zampini     }
215b49cda9fSStefano Zampini     ai++;
216b49cda9fSStefano Zampini   }
2175f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSeqAIJRestoreArrayRead(A,&av));
218b49cda9fSStefano Zampini 
219511c6705SHong Zhang   if (reuse == MAT_INPLACE_MATRIX) {
2205f80ce2aSJacob Faibussowitsch     CHKERRQ(MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY));
2215f80ce2aSJacob Faibussowitsch     CHKERRQ(MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY));
2225f80ce2aSJacob Faibussowitsch     CHKERRQ(MatHeaderReplace(A,&B));
223b49cda9fSStefano Zampini   } else {
224a13144ffSStefano Zampini     if (B) *newmat = B;
2255f80ce2aSJacob Faibussowitsch     CHKERRQ(MatAssemblyBegin(*newmat,MAT_FINAL_ASSEMBLY));
2265f80ce2aSJacob Faibussowitsch     CHKERRQ(MatAssemblyEnd(*newmat,MAT_FINAL_ASSEMBLY));
227b49cda9fSStefano Zampini   }
228b49cda9fSStefano Zampini   PetscFunctionReturn(0);
229b49cda9fSStefano Zampini }
230b49cda9fSStefano Zampini 
231cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqDense_SeqAIJ(Mat A, MatType newtype,MatReuse reuse,Mat *newmat)
2326a63e612SBarry Smith {
2336d4ec7b0SPierre Jolivet   Mat            B = NULL;
2346a63e612SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
2359399e1b8SMatthew G. Knepley   PetscInt       i, j;
2369399e1b8SMatthew G. Knepley   PetscInt       *rows, *nnz;
2379399e1b8SMatthew G. Knepley   MatScalar      *aa = a->v, *vals;
2386a63e612SBarry Smith 
2396a63e612SBarry Smith   PetscFunctionBegin;
2405f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscCalloc3(A->rmap->n,&rows,A->rmap->n,&nnz,A->rmap->n,&vals));
2416d4ec7b0SPierre Jolivet   if (reuse != MAT_REUSE_MATRIX) {
2425f80ce2aSJacob Faibussowitsch     CHKERRQ(MatCreate(PetscObjectComm((PetscObject)A),&B));
2435f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N));
2445f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSetType(B,MATSEQAIJ));
2459399e1b8SMatthew G. Knepley     for (j=0; j<A->cmap->n; j++) {
2466d4ec7b0SPierre Jolivet       for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || (i == j && A->cmap->n == A->rmap->n)) ++nnz[i];
2476a63e612SBarry Smith       aa += a->lda;
2486a63e612SBarry Smith     }
2495f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSeqAIJSetPreallocation(B,PETSC_DETERMINE,nnz));
2506d4ec7b0SPierre Jolivet   } else B = *newmat;
2519399e1b8SMatthew G. Knepley   aa = a->v;
2529399e1b8SMatthew G. Knepley   for (j=0; j<A->cmap->n; j++) {
2539399e1b8SMatthew G. Knepley     PetscInt numRows = 0;
2546d4ec7b0SPierre Jolivet     for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || (i == j && A->cmap->n == A->rmap->n)) {rows[numRows] = i; vals[numRows++] = aa[i];}
2555f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSetValues(B,numRows,rows,1,&j,vals,INSERT_VALUES));
2569399e1b8SMatthew G. Knepley     aa  += a->lda;
2579399e1b8SMatthew G. Knepley   }
2585f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree3(rows,nnz,vals));
2595f80ce2aSJacob Faibussowitsch   CHKERRQ(MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY));
2605f80ce2aSJacob Faibussowitsch   CHKERRQ(MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY));
2616a63e612SBarry Smith 
262511c6705SHong Zhang   if (reuse == MAT_INPLACE_MATRIX) {
2635f80ce2aSJacob Faibussowitsch     CHKERRQ(MatHeaderReplace(A,&B));
2646d4ec7b0SPierre Jolivet   } else if (reuse != MAT_REUSE_MATRIX) *newmat = B;
2656a63e612SBarry Smith   PetscFunctionReturn(0);
2666a63e612SBarry Smith }
2676a63e612SBarry Smith 
268ca15aa20SStefano Zampini PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str)
2691987afe7SBarry Smith {
2701987afe7SBarry Smith   Mat_SeqDense      *x = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data;
271ca15aa20SStefano Zampini   const PetscScalar *xv;
272ca15aa20SStefano Zampini   PetscScalar       *yv;
27323fff9afSBarry Smith   PetscBLASInt      N,m,ldax = 0,lday = 0,one = 1;
2743a40ed3dSBarry Smith 
2753a40ed3dSBarry Smith   PetscFunctionBegin;
2765f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayRead(X,&xv));
2775f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArray(Y,&yv));
2785f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(X->rmap->n*X->cmap->n,&N));
2795f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(X->rmap->n,&m));
2805f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(x->lda,&ldax));
2815f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(y->lda,&lday));
282a5ce6ee0Svictorle   if (ldax>m || lday>m) {
283ca15aa20SStefano Zampini     PetscInt j;
284ca15aa20SStefano Zampini 
285d0f46423SBarry Smith     for (j=0; j<X->cmap->n; j++) {
286ca15aa20SStefano Zampini       PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&m,&alpha,xv+j*ldax,&one,yv+j*lday,&one));
287a5ce6ee0Svictorle     }
288a5ce6ee0Svictorle   } else {
289ca15aa20SStefano Zampini     PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&N,&alpha,xv,&one,yv,&one));
290a5ce6ee0Svictorle   }
2915f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayRead(X,&xv));
2925f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArray(Y,&yv));
2935f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogFlops(PetscMax(2.0*N-1,0)));
2943a40ed3dSBarry Smith   PetscFunctionReturn(0);
2951987afe7SBarry Smith }
2961987afe7SBarry Smith 
297e0877f53SBarry Smith static PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info)
298289bc588SBarry Smith {
299ca15aa20SStefano Zampini   PetscLogDouble N = A->rmap->n*A->cmap->n;
3003a40ed3dSBarry Smith 
3013a40ed3dSBarry Smith   PetscFunctionBegin;
3024e220ebcSLois Curfman McInnes   info->block_size        = 1.0;
303ca15aa20SStefano Zampini   info->nz_allocated      = N;
304ca15aa20SStefano Zampini   info->nz_used           = N;
305ca15aa20SStefano Zampini   info->nz_unneeded       = 0;
306ca15aa20SStefano Zampini   info->assemblies        = A->num_ass;
3074e220ebcSLois Curfman McInnes   info->mallocs           = 0;
3087adad957SLisandro Dalcin   info->memory            = ((PetscObject)A)->mem;
3094e220ebcSLois Curfman McInnes   info->fill_ratio_given  = 0;
3104e220ebcSLois Curfman McInnes   info->fill_ratio_needed = 0;
3114e220ebcSLois Curfman McInnes   info->factor_mallocs    = 0;
3123a40ed3dSBarry Smith   PetscFunctionReturn(0);
313289bc588SBarry Smith }
314289bc588SBarry Smith 
315637a0070SStefano Zampini PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha)
31680cd9d93SLois Curfman McInnes {
317273d9f13SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
318ca15aa20SStefano Zampini   PetscScalar    *v;
31923fff9afSBarry Smith   PetscBLASInt   one = 1,j,nz,lda = 0;
32080cd9d93SLois Curfman McInnes 
3213a40ed3dSBarry Smith   PetscFunctionBegin;
3225f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArray(A,&v));
3235f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(a->lda,&lda));
324d0f46423SBarry Smith   if (lda>A->rmap->n) {
3255f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscBLASIntCast(A->rmap->n,&nz));
326d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
327ca15aa20SStefano Zampini       PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&alpha,v+j*lda,&one));
328a5ce6ee0Svictorle     }
329a5ce6ee0Svictorle   } else {
3305f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscBLASIntCast(A->rmap->n*A->cmap->n,&nz));
331ca15aa20SStefano Zampini     PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&alpha,v,&one));
332a5ce6ee0Svictorle   }
3335f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogFlops(nz));
3345f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArray(A,&v));
3353a40ed3dSBarry Smith   PetscFunctionReturn(0);
33680cd9d93SLois Curfman McInnes }
33780cd9d93SLois Curfman McInnes 
338e0877f53SBarry Smith static PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscBool  *fl)
3391cbb95d3SBarry Smith {
3401cbb95d3SBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
341ca15aa20SStefano Zampini   PetscInt          i,j,m = A->rmap->n,N = a->lda;
342ca15aa20SStefano Zampini   const PetscScalar *v;
3431cbb95d3SBarry Smith 
3441cbb95d3SBarry Smith   PetscFunctionBegin;
3451cbb95d3SBarry Smith   *fl = PETSC_FALSE;
346d0f46423SBarry Smith   if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0);
3475f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayRead(A,&v));
3481cbb95d3SBarry Smith   for (i=0; i<m; i++) {
349ca15aa20SStefano Zampini     for (j=i; j<m; j++) {
350637a0070SStefano Zampini       if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) {
351637a0070SStefano Zampini         goto restore;
3521cbb95d3SBarry Smith       }
3531cbb95d3SBarry Smith     }
354637a0070SStefano Zampini   }
3551cbb95d3SBarry Smith   *fl  = PETSC_TRUE;
356637a0070SStefano Zampini restore:
3575f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayRead(A,&v));
358637a0070SStefano Zampini   PetscFunctionReturn(0);
359637a0070SStefano Zampini }
360637a0070SStefano Zampini 
361637a0070SStefano Zampini static PetscErrorCode MatIsSymmetric_SeqDense(Mat A,PetscReal rtol,PetscBool  *fl)
362637a0070SStefano Zampini {
363637a0070SStefano Zampini   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
364637a0070SStefano Zampini   PetscInt          i,j,m = A->rmap->n,N = a->lda;
365637a0070SStefano Zampini   const PetscScalar *v;
366637a0070SStefano Zampini 
367637a0070SStefano Zampini   PetscFunctionBegin;
368637a0070SStefano Zampini   *fl = PETSC_FALSE;
369637a0070SStefano Zampini   if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0);
3705f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayRead(A,&v));
371637a0070SStefano Zampini   for (i=0; i<m; i++) {
372637a0070SStefano Zampini     for (j=i; j<m; j++) {
373637a0070SStefano Zampini       if (PetscAbsScalar(v[i+j*N] - v[j+i*N]) > rtol) {
374637a0070SStefano Zampini         goto restore;
375637a0070SStefano Zampini       }
376637a0070SStefano Zampini     }
377637a0070SStefano Zampini   }
378637a0070SStefano Zampini   *fl  = PETSC_TRUE;
379637a0070SStefano Zampini restore:
3805f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayRead(A,&v));
3811cbb95d3SBarry Smith   PetscFunctionReturn(0);
3821cbb95d3SBarry Smith }
3831cbb95d3SBarry Smith 
384ca15aa20SStefano Zampini PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat newi,Mat A,MatDuplicateOption cpvalues)
385b24902e0SBarry Smith {
386ca15aa20SStefano Zampini   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
38723fc5dcaSStefano Zampini   PetscInt       lda = (PetscInt)mat->lda,j,m,nlda = lda;
38875f6d85dSStefano Zampini   PetscBool      isdensecpu;
389b24902e0SBarry Smith 
390b24902e0SBarry Smith   PetscFunctionBegin;
3915f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLayoutReference(A->rmap,&newi->rmap));
3925f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLayoutReference(A->cmap,&newi->cmap));
39323fc5dcaSStefano Zampini   if (cpvalues == MAT_SHARE_NONZERO_PATTERN) { /* propagate LDA */
3945f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseSetLDA(newi,lda));
39523fc5dcaSStefano Zampini   }
3965f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectTypeCompare((PetscObject)newi,MATSEQDENSE,&isdensecpu));
3975f80ce2aSJacob Faibussowitsch   if (isdensecpu) CHKERRQ(MatSeqDenseSetPreallocation(newi,NULL));
398b24902e0SBarry Smith   if (cpvalues == MAT_COPY_VALUES) {
399ca15aa20SStefano Zampini     const PetscScalar *av;
400ca15aa20SStefano Zampini     PetscScalar       *v;
401ca15aa20SStefano Zampini 
4025f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseGetArrayRead(A,&av));
4035f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseGetArrayWrite(newi,&v));
4045f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseGetLDA(newi,&nlda));
405d0f46423SBarry Smith     m    = A->rmap->n;
40623fc5dcaSStefano Zampini     if (lda>m || nlda>m) {
407d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
4085f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscArraycpy(v+j*nlda,av+j*lda,m));
409b24902e0SBarry Smith       }
410b24902e0SBarry Smith     } else {
4115f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscArraycpy(v,av,A->rmap->n*A->cmap->n));
412b24902e0SBarry Smith     }
4135f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseRestoreArrayWrite(newi,&v));
4145f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseRestoreArrayRead(A,&av));
415b24902e0SBarry Smith   }
416b24902e0SBarry Smith   PetscFunctionReturn(0);
417b24902e0SBarry Smith }
418b24902e0SBarry Smith 
419ca15aa20SStefano Zampini PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat)
42002cad45dSBarry Smith {
4213a40ed3dSBarry Smith   PetscFunctionBegin;
4225f80ce2aSJacob Faibussowitsch   CHKERRQ(MatCreate(PetscObjectComm((PetscObject)A),newmat));
4235f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n));
4245f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetType(*newmat,((PetscObject)A)->type_name));
4255f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues));
426b24902e0SBarry Smith   PetscFunctionReturn(0);
427b24902e0SBarry Smith }
428b24902e0SBarry Smith 
429bf5a80bcSToby Isaac static PetscErrorCode MatSolve_SeqDense_Internal_LU(Mat A, PetscScalar *x, PetscBLASInt ldx, PetscBLASInt m, PetscBLASInt nrhs, PetscBLASInt k, PetscBool T)
430289bc588SBarry Smith {
431c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
4324396437dSToby Isaac   PetscBLASInt    info;
43367e560aaSBarry Smith 
4343a40ed3dSBarry Smith   PetscFunctionBegin;
4355f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
4364396437dSToby Isaac   PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_(T ? "T" : "N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info));
4375f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFPTrapPop());
438*28b400f6SJacob Faibussowitsch   PetscCheck(!info,PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
4395f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogFlops(nrhs*(2.0*m*m - m)));
4404396437dSToby Isaac   PetscFunctionReturn(0);
4414396437dSToby Isaac }
4424396437dSToby Isaac 
4434396437dSToby Isaac static PetscErrorCode MatConjugate_SeqDense(Mat);
4444396437dSToby Isaac 
445bf5a80bcSToby Isaac static PetscErrorCode MatSolve_SeqDense_Internal_Cholesky(Mat A, PetscScalar *x, PetscBLASInt ldx, PetscBLASInt m, PetscBLASInt nrhs, PetscBLASInt k, PetscBool T)
4464396437dSToby Isaac {
4474396437dSToby Isaac   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
4484396437dSToby Isaac   PetscBLASInt    info;
4494396437dSToby Isaac 
4504396437dSToby Isaac   PetscFunctionBegin;
451a49dc2a2SStefano Zampini   if (A->spd) {
4525f80ce2aSJacob Faibussowitsch     if (PetscDefined(USE_COMPLEX) && T) CHKERRQ(MatConjugate_SeqDense(A));
4535f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
4548b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info));
4555f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFPTrapPop());
456*28b400f6SJacob Faibussowitsch     PetscCheck(!info,PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
4575f80ce2aSJacob Faibussowitsch     if (PetscDefined(USE_COMPLEX) && T) CHKERRQ(MatConjugate_SeqDense(A));
458a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX)
459a49dc2a2SStefano Zampini   } else if (A->hermitian) {
4605f80ce2aSJacob Faibussowitsch     if (T) CHKERRQ(MatConjugate_SeqDense(A));
4615f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
462a49dc2a2SStefano Zampini     PetscStackCallBLAS("LAPACKhetrs",LAPACKhetrs_("L",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info));
4635f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFPTrapPop());
464*28b400f6SJacob Faibussowitsch     PetscCheck(!info,PETSC_COMM_SELF,PETSC_ERR_LIB,"HETRS Bad solve");
4655f80ce2aSJacob Faibussowitsch     if (T) CHKERRQ(MatConjugate_SeqDense(A));
466a49dc2a2SStefano Zampini #endif
467a49dc2a2SStefano Zampini   } else { /* symmetric case */
4685f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
469a49dc2a2SStefano Zampini     PetscStackCallBLAS("LAPACKsytrs",LAPACKsytrs_("L",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info));
4705f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFPTrapPop());
471*28b400f6SJacob Faibussowitsch     PetscCheck(!info,PETSC_COMM_SELF,PETSC_ERR_LIB,"SYTRS Bad solve");
472a49dc2a2SStefano Zampini   }
4735f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogFlops(nrhs*(2.0*m*m - m)));
4744396437dSToby Isaac   PetscFunctionReturn(0);
4754396437dSToby Isaac }
47685e2c93fSHong Zhang 
477bf5a80bcSToby Isaac static PetscErrorCode MatSolve_SeqDense_Internal_QR(Mat A, PetscScalar *x, PetscBLASInt ldx, PetscBLASInt m, PetscBLASInt nrhs, PetscBLASInt k)
4784396437dSToby Isaac {
4794396437dSToby Isaac   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
4804396437dSToby Isaac   PetscBLASInt    info;
4814396437dSToby Isaac   char            trans;
4824396437dSToby Isaac 
4834396437dSToby Isaac   PetscFunctionBegin;
4844905a7bcSToby Isaac   if (PetscDefined(USE_COMPLEX)) {
4854905a7bcSToby Isaac     trans = 'C';
4864905a7bcSToby Isaac   } else {
4874905a7bcSToby Isaac     trans = 'T';
4884905a7bcSToby Isaac   }
4895f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
490bf5a80bcSToby Isaac   PetscStackCallBLAS("LAPACKormqr",LAPACKormqr_("L", &trans, &m,&nrhs,&mat->rank,mat->v,&mat->lda,mat->tau,x,&ldx,mat->fwork,&mat->lfwork,&info));
4915f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFPTrapPop());
492*28b400f6SJacob Faibussowitsch   PetscCheck(!info,PETSC_COMM_SELF,PETSC_ERR_LIB,"ORMQR - Bad orthogonal transform");
4935f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
494bf5a80bcSToby Isaac   PetscStackCallBLAS("LAPACKtrtrs",LAPACKtrtrs_("U", "N", "N", &mat->rank,&nrhs,mat->v,&mat->lda,x,&ldx,&info));
4955f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFPTrapPop());
496*28b400f6SJacob Faibussowitsch   PetscCheck(!info,PETSC_COMM_SELF,PETSC_ERR_LIB,"TRTRS - Bad triangular solve");
4974905a7bcSToby Isaac   for (PetscInt j = 0; j < nrhs; j++) {
4984905a7bcSToby Isaac     for (PetscInt i = mat->rank; i < k; i++) {
499bf5a80bcSToby Isaac       x[j*ldx + i] = 0.;
5004905a7bcSToby Isaac     }
5014905a7bcSToby Isaac   }
5025f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogFlops(nrhs*(4.0*m*mat->rank - PetscSqr(mat->rank))));
5034905a7bcSToby Isaac   PetscFunctionReturn(0);
5044905a7bcSToby Isaac }
5054905a7bcSToby Isaac 
506bf5a80bcSToby Isaac static PetscErrorCode MatSolveTranspose_SeqDense_Internal_QR(Mat A, PetscScalar *x, PetscBLASInt ldx, PetscBLASInt m, PetscBLASInt nrhs, PetscBLASInt k)
5074905a7bcSToby Isaac {
5084396437dSToby Isaac   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
5094396437dSToby Isaac   PetscBLASInt      info;
5104396437dSToby Isaac 
5114396437dSToby Isaac   PetscFunctionBegin;
5124396437dSToby Isaac   if (A->rmap->n == A->cmap->n && mat->rank == A->rmap->n) {
5135f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
514bf5a80bcSToby Isaac     PetscStackCallBLAS("LAPACKtrtrs",LAPACKtrtrs_("U", "T", "N", &m,&nrhs,mat->v,&mat->lda,x,&ldx,&info));
5155f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFPTrapPop());
516*28b400f6SJacob Faibussowitsch     PetscCheck(!info,PETSC_COMM_SELF,PETSC_ERR_LIB,"TRTRS - Bad triangular solve");
5175f80ce2aSJacob Faibussowitsch     if (PetscDefined(USE_COMPLEX)) CHKERRQ(MatConjugate_SeqDense(A));
5185f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
519bf5a80bcSToby Isaac     PetscStackCallBLAS("LAPACKormqr",LAPACKormqr_("L", "N", &m,&nrhs,&mat->rank,mat->v,&mat->lda,mat->tau,x,&ldx,mat->fwork,&mat->lfwork,&info));
5205f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFPTrapPop());
521*28b400f6SJacob Faibussowitsch     PetscCheck(!info,PETSC_COMM_SELF,PETSC_ERR_LIB,"ORMQR - Bad orthogonal transform");
5225f80ce2aSJacob Faibussowitsch     if (PetscDefined(USE_COMPLEX)) CHKERRQ(MatConjugate_SeqDense(A));
5234396437dSToby Isaac   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"QR factored matrix cannot be used for transpose solve");
5245f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogFlops(nrhs*(4.0*m*mat->rank - PetscSqr(mat->rank))));
5254396437dSToby Isaac   PetscFunctionReturn(0);
5264396437dSToby Isaac }
5274396437dSToby Isaac 
5284396437dSToby Isaac static PetscErrorCode MatSolve_SeqDense_SetUp(Mat A, Vec xx, Vec yy, PetscScalar **_y, PetscBLASInt *_m, PetscBLASInt *_k)
5294396437dSToby Isaac {
5304396437dSToby Isaac   Mat_SeqDense      *mat = (Mat_SeqDense *) A->data;
5314905a7bcSToby Isaac   PetscScalar       *y;
5324905a7bcSToby Isaac   PetscBLASInt      m=0, k=0;
5334905a7bcSToby Isaac 
5344905a7bcSToby Isaac   PetscFunctionBegin;
5355f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(A->rmap->n,&m));
5365f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(A->cmap->n,&k));
5374905a7bcSToby Isaac   if (k < m) {
5385f80ce2aSJacob Faibussowitsch     CHKERRQ(VecCopy(xx, mat->qrrhs));
5395f80ce2aSJacob Faibussowitsch     CHKERRQ(VecGetArray(mat->qrrhs,&y));
5404905a7bcSToby Isaac   } else {
5415f80ce2aSJacob Faibussowitsch     CHKERRQ(VecCopy(xx, yy));
5425f80ce2aSJacob Faibussowitsch     CHKERRQ(VecGetArray(yy,&y));
5434905a7bcSToby Isaac   }
5444396437dSToby Isaac   *_y = y;
5454396437dSToby Isaac   *_k = k;
5464396437dSToby Isaac   *_m = m;
5474396437dSToby Isaac   PetscFunctionReturn(0);
5484396437dSToby Isaac }
5494396437dSToby Isaac 
5504396437dSToby Isaac static PetscErrorCode MatSolve_SeqDense_TearDown(Mat A, Vec xx, Vec yy, PetscScalar **_y, PetscBLASInt *_m, PetscBLASInt *_k)
5514396437dSToby Isaac {
5524396437dSToby Isaac   Mat_SeqDense   *mat = (Mat_SeqDense *) A->data;
55342e9364cSSatish Balay   PetscScalar    *y = NULL;
5544396437dSToby Isaac   PetscBLASInt   m, k;
5554396437dSToby Isaac 
5564396437dSToby Isaac   PetscFunctionBegin;
5574396437dSToby Isaac   y   = *_y;
5584396437dSToby Isaac   *_y = NULL;
5594396437dSToby Isaac   k   = *_k;
5604396437dSToby Isaac   m   = *_m;
5614905a7bcSToby Isaac   if (k < m) {
5624905a7bcSToby Isaac     PetscScalar *yv;
5635f80ce2aSJacob Faibussowitsch     CHKERRQ(VecGetArray(yy,&yv));
5645f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscArraycpy(yv, y, k));
5655f80ce2aSJacob Faibussowitsch     CHKERRQ(VecRestoreArray(yy,&yv));
5665f80ce2aSJacob Faibussowitsch     CHKERRQ(VecRestoreArray(mat->qrrhs, &y));
5674905a7bcSToby Isaac   } else {
5685f80ce2aSJacob Faibussowitsch     CHKERRQ(VecRestoreArray(yy,&y));
5694905a7bcSToby Isaac   }
5704905a7bcSToby Isaac   PetscFunctionReturn(0);
5714905a7bcSToby Isaac }
5724905a7bcSToby Isaac 
5734396437dSToby Isaac static PetscErrorCode MatSolve_SeqDense_LU(Mat A, Vec xx, Vec yy)
5744396437dSToby Isaac {
57542e9364cSSatish Balay   PetscScalar    *y = NULL;
57642e9364cSSatish Balay   PetscBLASInt   m = 0, k = 0;
5774396437dSToby Isaac 
5784396437dSToby Isaac   PetscFunctionBegin;
5795f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSolve_SeqDense_SetUp(A, xx, yy, &y, &m, &k));
5805f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSolve_SeqDense_Internal_LU(A, y, m, m, 1, k, PETSC_FALSE));
5815f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSolve_SeqDense_TearDown(A, xx, yy, &y, &m, &k));
5824396437dSToby Isaac   PetscFunctionReturn(0);
5834396437dSToby Isaac }
5844396437dSToby Isaac 
5854396437dSToby Isaac static PetscErrorCode MatSolveTranspose_SeqDense_LU(Mat A, Vec xx, Vec yy)
5864396437dSToby Isaac {
58742e9364cSSatish Balay   PetscScalar    *y = NULL;
58842e9364cSSatish Balay   PetscBLASInt   m = 0, k = 0;
5894396437dSToby Isaac 
5904396437dSToby Isaac   PetscFunctionBegin;
5915f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSolve_SeqDense_SetUp(A, xx, yy, &y, &m, &k));
5925f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSolve_SeqDense_Internal_LU(A, y, m, m, 1, k, PETSC_TRUE));
5935f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSolve_SeqDense_TearDown(A, xx, yy, &y, &m, &k));
5944396437dSToby Isaac   PetscFunctionReturn(0);
5954396437dSToby Isaac }
5964396437dSToby Isaac 
5974396437dSToby Isaac static PetscErrorCode MatSolve_SeqDense_Cholesky(Mat A, Vec xx, Vec yy)
5984396437dSToby Isaac {
599e54beecaSStefano Zampini   PetscScalar    *y = NULL;
600e54beecaSStefano Zampini   PetscBLASInt   m = 0, k = 0;
6014396437dSToby Isaac 
6024396437dSToby Isaac   PetscFunctionBegin;
6035f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSolve_SeqDense_SetUp(A, xx, yy, &y, &m, &k));
6045f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSolve_SeqDense_Internal_Cholesky(A, y, m, m, 1, k, PETSC_FALSE));
6055f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSolve_SeqDense_TearDown(A, xx, yy, &y, &m, &k));
6064396437dSToby Isaac   PetscFunctionReturn(0);
6074396437dSToby Isaac }
6084396437dSToby Isaac 
6094396437dSToby Isaac static PetscErrorCode MatSolveTranspose_SeqDense_Cholesky(Mat A, Vec xx, Vec yy)
6104396437dSToby Isaac {
611e54beecaSStefano Zampini   PetscScalar    *y = NULL;
612e54beecaSStefano Zampini   PetscBLASInt   m = 0, k = 0;
6134396437dSToby Isaac 
6144396437dSToby Isaac   PetscFunctionBegin;
6155f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSolve_SeqDense_SetUp(A, xx, yy, &y, &m, &k));
6165f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSolve_SeqDense_Internal_Cholesky(A, y, m, m, 1, k, PETSC_TRUE));
6175f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSolve_SeqDense_TearDown(A, xx, yy, &y, &m, &k));
6184396437dSToby Isaac   PetscFunctionReturn(0);
6194396437dSToby Isaac }
6204396437dSToby Isaac 
6214396437dSToby Isaac static PetscErrorCode MatSolve_SeqDense_QR(Mat A, Vec xx, Vec yy)
6224396437dSToby Isaac {
623e54beecaSStefano Zampini   PetscScalar    *y = NULL;
624e54beecaSStefano Zampini   PetscBLASInt   m = 0, k = 0;
6254396437dSToby Isaac 
6264396437dSToby Isaac   PetscFunctionBegin;
6275f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSolve_SeqDense_SetUp(A, xx, yy, &y, &m, &k));
6285f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSolve_SeqDense_Internal_QR(A, y, PetscMax(m,k), m, 1, k));
6295f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSolve_SeqDense_TearDown(A, xx, yy, &y, &m, &k));
6304396437dSToby Isaac   PetscFunctionReturn(0);
6314396437dSToby Isaac }
6324396437dSToby Isaac 
6334396437dSToby Isaac static PetscErrorCode MatSolveTranspose_SeqDense_QR(Mat A, Vec xx, Vec yy)
6344396437dSToby Isaac {
63542e9364cSSatish Balay   PetscScalar    *y = NULL;
63642e9364cSSatish Balay   PetscBLASInt   m = 0, k = 0;
6374396437dSToby Isaac 
6384396437dSToby Isaac   PetscFunctionBegin;
6395f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSolve_SeqDense_SetUp(A, xx, yy, &y, &m, &k));
6405f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSolveTranspose_SeqDense_Internal_QR(A, y, PetscMax(m,k), m, 1, k));
6415f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSolve_SeqDense_TearDown(A, xx, yy, &y, &m, &k));
6424396437dSToby Isaac   PetscFunctionReturn(0);
6434396437dSToby Isaac }
6444396437dSToby Isaac 
645bf5a80bcSToby Isaac static PetscErrorCode MatMatSolve_SeqDense_SetUp(Mat A, Mat B, Mat X, PetscScalar **_y, PetscBLASInt *_ldy, PetscBLASInt *_m, PetscBLASInt *_nrhs, PetscBLASInt *_k)
6464905a7bcSToby Isaac {
6474905a7bcSToby Isaac   const PetscScalar *b;
6484396437dSToby Isaac   PetscScalar       *y;
649bf5a80bcSToby Isaac   PetscInt          n, _ldb, _ldx;
650bf5a80bcSToby Isaac   PetscBLASInt      nrhs=0,m=0,k=0,ldb=0,ldx=0,ldy=0;
6514905a7bcSToby Isaac 
6524905a7bcSToby Isaac   PetscFunctionBegin;
6536280eecaSJose E. Roman   *_ldy=0; *_m=0; *_nrhs=0; *_k=0; *_y = NULL;
6545f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(A->rmap->n,&m));
6555f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(A->cmap->n,&k));
6565f80ce2aSJacob Faibussowitsch   CHKERRQ(MatGetSize(B,NULL,&n));
6575f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(n,&nrhs));
6585f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetLDA(B,&_ldb));
6595f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(_ldb, &ldb));
6605f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetLDA(X,&_ldx));
6615f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(_ldx, &ldx));
662bf5a80bcSToby Isaac   if (ldx < m) {
6635f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseGetArrayRead(B,&b));
6645f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscMalloc1(nrhs * m, &y));
665bf5a80bcSToby Isaac     if (ldb == m) {
6665f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscArraycpy(y,b,ldb*nrhs));
6674905a7bcSToby Isaac     } else {
6684905a7bcSToby Isaac       for (PetscInt j = 0; j < nrhs; j++) {
6695f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscArraycpy(&y[j*m],&b[j*ldb],m));
6704905a7bcSToby Isaac       }
6714905a7bcSToby Isaac     }
672bf5a80bcSToby Isaac     ldy = m;
6735f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseRestoreArrayRead(B,&b));
6744905a7bcSToby Isaac   } else {
675bf5a80bcSToby Isaac     if (ldb == ldx) {
6765f80ce2aSJacob Faibussowitsch       CHKERRQ(MatCopy(B, X, SAME_NONZERO_PATTERN));
6775f80ce2aSJacob Faibussowitsch       CHKERRQ(MatDenseGetArray(X,&y));
6784905a7bcSToby Isaac     } else {
6795f80ce2aSJacob Faibussowitsch       CHKERRQ(MatDenseGetArray(X,&y));
6805f80ce2aSJacob Faibussowitsch       CHKERRQ(MatDenseGetArrayRead(B,&b));
6814905a7bcSToby Isaac       for (PetscInt j = 0; j < nrhs; j++) {
6825f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscArraycpy(&y[j*ldx],&b[j*ldb],m));
6834905a7bcSToby Isaac       }
6845f80ce2aSJacob Faibussowitsch       CHKERRQ(MatDenseRestoreArrayRead(B,&b));
6854905a7bcSToby Isaac     }
686bf5a80bcSToby Isaac     ldy = ldx;
6874905a7bcSToby Isaac   }
6884396437dSToby Isaac   *_y    = y;
689bf5a80bcSToby Isaac   *_ldy = ldy;
6904396437dSToby Isaac   *_k    = k;
6914396437dSToby Isaac   *_m    = m;
6924396437dSToby Isaac   *_nrhs = nrhs;
6934396437dSToby Isaac   PetscFunctionReturn(0);
6944396437dSToby Isaac }
6954396437dSToby Isaac 
696bf5a80bcSToby Isaac static PetscErrorCode MatMatSolve_SeqDense_TearDown(Mat A, Mat B, Mat X, PetscScalar **_y, PetscBLASInt *_ldy, PetscBLASInt *_m, PetscBLASInt *_nrhs, PetscBLASInt *_k)
6974396437dSToby Isaac {
6984396437dSToby Isaac   PetscScalar       *y;
699bf5a80bcSToby Isaac   PetscInt          _ldx;
700bf5a80bcSToby Isaac   PetscBLASInt      k,ldy,nrhs,ldx=0;
7014396437dSToby Isaac 
7024396437dSToby Isaac   PetscFunctionBegin;
7034396437dSToby Isaac   y    = *_y;
7044396437dSToby Isaac   *_y  = NULL;
7054396437dSToby Isaac   k    = *_k;
706bf5a80bcSToby Isaac   ldy = *_ldy;
7074396437dSToby Isaac   nrhs = *_nrhs;
7085f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetLDA(X,&_ldx));
7095f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(_ldx, &ldx));
710bf5a80bcSToby Isaac   if (ldx != ldy) {
7114905a7bcSToby Isaac     PetscScalar *xv;
7125f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseGetArray(X,&xv));
7134905a7bcSToby Isaac     for (PetscInt j = 0; j < nrhs; j++) {
7145f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscArraycpy(&xv[j*ldx],&y[j*ldy],k));
7154905a7bcSToby Isaac     }
7165f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseRestoreArray(X,&xv));
7175f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFree(y));
7184905a7bcSToby Isaac   } else {
7195f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseRestoreArray(X,&y));
7204905a7bcSToby Isaac   }
72185e2c93fSHong Zhang   PetscFunctionReturn(0);
72285e2c93fSHong Zhang }
72385e2c93fSHong Zhang 
7244396437dSToby Isaac static PetscErrorCode MatMatSolve_SeqDense_LU(Mat A, Mat B, Mat X)
7254396437dSToby Isaac {
7264396437dSToby Isaac   PetscScalar    *y;
727bf5a80bcSToby Isaac   PetscBLASInt   m, k, ldy, nrhs;
7284396437dSToby Isaac 
7294396437dSToby Isaac   PetscFunctionBegin;
7305f80ce2aSJacob Faibussowitsch   CHKERRQ(MatMatSolve_SeqDense_SetUp(A, B, X, &y, &ldy, &m, &nrhs, &k));
7315f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSolve_SeqDense_Internal_LU(A, y, ldy, m, nrhs, k, PETSC_FALSE));
7325f80ce2aSJacob Faibussowitsch   CHKERRQ(MatMatSolve_SeqDense_TearDown(A, B, X, &y, &ldy, &m, &nrhs, &k));
7334396437dSToby Isaac   PetscFunctionReturn(0);
7344396437dSToby Isaac }
7354396437dSToby Isaac 
7364396437dSToby Isaac static PetscErrorCode MatMatSolveTranspose_SeqDense_LU(Mat A, Mat B, Mat X)
7374396437dSToby Isaac {
7384396437dSToby Isaac   PetscScalar    *y;
739bf5a80bcSToby Isaac   PetscBLASInt   m, k, ldy, nrhs;
7404396437dSToby Isaac 
7414396437dSToby Isaac   PetscFunctionBegin;
7425f80ce2aSJacob Faibussowitsch   CHKERRQ(MatMatSolve_SeqDense_SetUp(A, B, X, &y, &ldy, &m, &nrhs, &k));
7435f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSolve_SeqDense_Internal_LU(A, y, ldy, m, nrhs, k, PETSC_TRUE));
7445f80ce2aSJacob Faibussowitsch   CHKERRQ(MatMatSolve_SeqDense_TearDown(A, B, X, &y, &ldy, &m, &nrhs, &k));
7454396437dSToby Isaac   PetscFunctionReturn(0);
7464396437dSToby Isaac }
7474396437dSToby Isaac 
7484396437dSToby Isaac static PetscErrorCode MatMatSolve_SeqDense_Cholesky(Mat A, Mat B, Mat X)
7494396437dSToby Isaac {
7504396437dSToby Isaac   PetscScalar    *y;
751bf5a80bcSToby Isaac   PetscBLASInt   m, k, ldy, nrhs;
7524396437dSToby Isaac 
7534396437dSToby Isaac   PetscFunctionBegin;
7545f80ce2aSJacob Faibussowitsch   CHKERRQ(MatMatSolve_SeqDense_SetUp(A, B, X, &y, &ldy, &m, &nrhs, &k));
7555f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSolve_SeqDense_Internal_Cholesky(A, y, ldy, m, nrhs, k, PETSC_FALSE));
7565f80ce2aSJacob Faibussowitsch   CHKERRQ(MatMatSolve_SeqDense_TearDown(A, B, X, &y, &ldy, &m, &nrhs, &k));
7574396437dSToby Isaac   PetscFunctionReturn(0);
7584396437dSToby Isaac }
7594396437dSToby Isaac 
7604396437dSToby Isaac static PetscErrorCode MatMatSolveTranspose_SeqDense_Cholesky(Mat A, Mat B, Mat X)
7614396437dSToby Isaac {
7624396437dSToby Isaac   PetscScalar    *y;
763bf5a80bcSToby Isaac   PetscBLASInt   m, k, ldy, nrhs;
7644396437dSToby Isaac 
7654396437dSToby Isaac   PetscFunctionBegin;
7665f80ce2aSJacob Faibussowitsch   CHKERRQ(MatMatSolve_SeqDense_SetUp(A, B, X, &y, &ldy, &m, &nrhs, &k));
7675f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSolve_SeqDense_Internal_Cholesky(A, y, ldy, m, nrhs, k, PETSC_TRUE));
7685f80ce2aSJacob Faibussowitsch   CHKERRQ(MatMatSolve_SeqDense_TearDown(A, B, X, &y, &ldy, &m, &nrhs, &k));
7694396437dSToby Isaac   PetscFunctionReturn(0);
7704396437dSToby Isaac }
7714396437dSToby Isaac 
7724396437dSToby Isaac static PetscErrorCode MatMatSolve_SeqDense_QR(Mat A, Mat B, Mat X)
7734396437dSToby Isaac {
7744396437dSToby Isaac   PetscScalar    *y;
775bf5a80bcSToby Isaac   PetscBLASInt   m, k, ldy, nrhs;
7764396437dSToby Isaac 
7774396437dSToby Isaac   PetscFunctionBegin;
7785f80ce2aSJacob Faibussowitsch   CHKERRQ(MatMatSolve_SeqDense_SetUp(A, B, X, &y, &ldy, &m, &nrhs, &k));
7795f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSolve_SeqDense_Internal_QR(A, y, ldy, m, nrhs, k));
7805f80ce2aSJacob Faibussowitsch   CHKERRQ(MatMatSolve_SeqDense_TearDown(A, B, X, &y, &ldy, &m, &nrhs, &k));
7814396437dSToby Isaac   PetscFunctionReturn(0);
7824396437dSToby Isaac }
7834396437dSToby Isaac 
7844396437dSToby Isaac static PetscErrorCode MatMatSolveTranspose_SeqDense_QR(Mat A, Mat B, Mat X)
7854396437dSToby Isaac {
7864396437dSToby Isaac   PetscScalar    *y;
787bf5a80bcSToby Isaac   PetscBLASInt   m, k, ldy, nrhs;
7884396437dSToby Isaac 
7894396437dSToby Isaac   PetscFunctionBegin;
7905f80ce2aSJacob Faibussowitsch   CHKERRQ(MatMatSolve_SeqDense_SetUp(A, B, X, &y, &ldy, &m, &nrhs, &k));
7915f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSolveTranspose_SeqDense_Internal_QR(A, y, ldy, m, nrhs, k));
7925f80ce2aSJacob Faibussowitsch   CHKERRQ(MatMatSolve_SeqDense_TearDown(A, B, X, &y, &ldy, &m, &nrhs, &k));
7934396437dSToby Isaac   PetscFunctionReturn(0);
7944396437dSToby Isaac }
7954396437dSToby Isaac 
79600121966SStefano Zampini static PetscErrorCode MatConjugate_SeqDense(Mat);
79700121966SStefano Zampini 
798db4efbfdSBarry Smith /* ---------------------------------------------------------------*/
799db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots,
800db4efbfdSBarry Smith    rather than put it in the Mat->row slot.*/
801ca15aa20SStefano Zampini PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo)
802db4efbfdSBarry Smith {
803db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
804db4efbfdSBarry Smith   PetscBLASInt   n,m,info;
805db4efbfdSBarry Smith 
806db4efbfdSBarry Smith   PetscFunctionBegin;
8075f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(A->cmap->n,&n));
8085f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(A->rmap->n,&m));
809db4efbfdSBarry Smith   if (!mat->pivots) {
8105f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscMalloc1(A->rmap->n,&mat->pivots));
8115f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt)));
812db4efbfdSBarry Smith   }
813db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
8145f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
8158b83055fSJed Brown   PetscStackCallBLAS("LAPACKgetrf",LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info));
8165f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFPTrapPop());
8178e57ea43SSatish Balay 
8182c71b3e2SJacob Faibussowitsch   PetscCheckFalse(info<0,PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization");
8192c71b3e2SJacob Faibussowitsch   PetscCheckFalse(info>0,PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization");
8208208b9aeSStefano Zampini 
8214396437dSToby Isaac   A->ops->solve             = MatSolve_SeqDense_LU;
8224396437dSToby Isaac   A->ops->matsolve          = MatMatSolve_SeqDense_LU;
8234396437dSToby Isaac   A->ops->solvetranspose    = MatSolveTranspose_SeqDense_LU;
8244396437dSToby Isaac   A->ops->matsolvetranspose = MatMatSolveTranspose_SeqDense_LU;
825d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_LU;
826db4efbfdSBarry Smith 
8275f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(A->solvertype));
8285f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrallocpy(MATSOLVERPETSC,&A->solvertype));
829f6224b95SHong Zhang 
8305f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3));
831db4efbfdSBarry Smith   PetscFunctionReturn(0);
832db4efbfdSBarry Smith }
833db4efbfdSBarry Smith 
8344396437dSToby Isaac static PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
8354396437dSToby Isaac {
8364396437dSToby Isaac   MatFactorInfo  info;
8374396437dSToby Isaac 
8384396437dSToby Isaac   PetscFunctionBegin;
8395f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES));
8405f80ce2aSJacob Faibussowitsch   CHKERRQ((*fact->ops->lufactor)(fact,NULL,NULL,&info));
8414396437dSToby Isaac   PetscFunctionReturn(0);
8424396437dSToby Isaac }
8434396437dSToby Isaac 
8444396437dSToby Isaac PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info)
8454396437dSToby Isaac {
8464396437dSToby Isaac   PetscFunctionBegin;
8474396437dSToby Isaac   fact->preallocated           = PETSC_TRUE;
8484396437dSToby Isaac   fact->assembled              = PETSC_TRUE;
8494396437dSToby Isaac   fact->ops->lufactornumeric   = MatLUFactorNumeric_SeqDense;
8504396437dSToby Isaac   PetscFunctionReturn(0);
8514396437dSToby Isaac }
8524396437dSToby Isaac 
853a49dc2a2SStefano Zampini /* Cholesky as L*L^T or L*D*L^T and the symmetric/hermitian complex variants */
854ca15aa20SStefano Zampini PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo)
855db4efbfdSBarry Smith {
856db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
857c5df96a5SBarry Smith   PetscBLASInt   info,n;
858db4efbfdSBarry Smith 
859db4efbfdSBarry Smith   PetscFunctionBegin;
8605f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(A->cmap->n,&n));
861db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
862a49dc2a2SStefano Zampini   if (A->spd) {
8635f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
8648b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrf",LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info));
8655f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFPTrapPop());
866a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX)
867a49dc2a2SStefano Zampini   } else if (A->hermitian) {
868a49dc2a2SStefano Zampini     if (!mat->pivots) {
8695f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscMalloc1(A->rmap->n,&mat->pivots));
8705f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt)));
871a49dc2a2SStefano Zampini     }
872a49dc2a2SStefano Zampini     if (!mat->fwork) {
873a49dc2a2SStefano Zampini       PetscScalar dummy;
874a49dc2a2SStefano Zampini 
875a49dc2a2SStefano Zampini       mat->lfwork = -1;
8765f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
877a49dc2a2SStefano Zampini       PetscStackCallBLAS("LAPACKhetrf",LAPACKhetrf_("L",&n,mat->v,&mat->lda,mat->pivots,&dummy,&mat->lfwork,&info));
8785f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscFPTrapPop());
879a49dc2a2SStefano Zampini       mat->lfwork = (PetscInt)PetscRealPart(dummy);
8805f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscMalloc1(mat->lfwork,&mat->fwork));
8815f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscLogObjectMemory((PetscObject)A,mat->lfwork*sizeof(PetscBLASInt)));
882a49dc2a2SStefano Zampini     }
8835f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
884a49dc2a2SStefano Zampini     PetscStackCallBLAS("LAPACKhetrf",LAPACKhetrf_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&mat->lfwork,&info));
8855f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFPTrapPop());
886a49dc2a2SStefano Zampini #endif
887a49dc2a2SStefano Zampini   } else { /* symmetric case */
888a49dc2a2SStefano Zampini     if (!mat->pivots) {
8895f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscMalloc1(A->rmap->n,&mat->pivots));
8905f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt)));
891a49dc2a2SStefano Zampini     }
892a49dc2a2SStefano Zampini     if (!mat->fwork) {
893a49dc2a2SStefano Zampini       PetscScalar dummy;
894a49dc2a2SStefano Zampini 
895a49dc2a2SStefano Zampini       mat->lfwork = -1;
8965f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
897a49dc2a2SStefano Zampini       PetscStackCallBLAS("LAPACKsytrf",LAPACKsytrf_("L",&n,mat->v,&mat->lda,mat->pivots,&dummy,&mat->lfwork,&info));
8985f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscFPTrapPop());
899a49dc2a2SStefano Zampini       mat->lfwork = (PetscInt)PetscRealPart(dummy);
9005f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscMalloc1(mat->lfwork,&mat->fwork));
9015f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscLogObjectMemory((PetscObject)A,mat->lfwork*sizeof(PetscBLASInt)));
902a49dc2a2SStefano Zampini     }
9035f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
904a49dc2a2SStefano Zampini     PetscStackCallBLAS("LAPACKsytrf",LAPACKsytrf_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&mat->lfwork,&info));
9055f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFPTrapPop());
906a49dc2a2SStefano Zampini   }
907*28b400f6SJacob Faibussowitsch   PetscCheck(!info,PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %" PetscInt_FMT,(PetscInt)info-1);
9088208b9aeSStefano Zampini 
9094396437dSToby Isaac   A->ops->solve             = MatSolve_SeqDense_Cholesky;
9104396437dSToby Isaac   A->ops->matsolve          = MatMatSolve_SeqDense_Cholesky;
9114396437dSToby Isaac   A->ops->solvetranspose    = MatSolveTranspose_SeqDense_Cholesky;
9124396437dSToby Isaac   A->ops->matsolvetranspose = MatMatSolveTranspose_SeqDense_Cholesky;
913d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_CHOLESKY;
9142205254eSKarl Rupp 
9155f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(A->solvertype));
9165f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrallocpy(MATSOLVERPETSC,&A->solvertype));
917f6224b95SHong Zhang 
9185f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0));
919db4efbfdSBarry Smith   PetscFunctionReturn(0);
920db4efbfdSBarry Smith }
921db4efbfdSBarry Smith 
9224396437dSToby Isaac static PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
923db4efbfdSBarry Smith {
924db4efbfdSBarry Smith   MatFactorInfo  info;
925db4efbfdSBarry Smith 
926db4efbfdSBarry Smith   PetscFunctionBegin;
927db4efbfdSBarry Smith   info.fill = 1.0;
9282205254eSKarl Rupp 
9295f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES));
9305f80ce2aSJacob Faibussowitsch   CHKERRQ((*fact->ops->choleskyfactor)(fact,NULL,&info));
931db4efbfdSBarry Smith   PetscFunctionReturn(0);
932db4efbfdSBarry Smith }
933db4efbfdSBarry Smith 
934ca15aa20SStefano Zampini PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info)
935db4efbfdSBarry Smith {
936db4efbfdSBarry Smith   PetscFunctionBegin;
937c3ef05f6SHong Zhang   fact->assembled                  = PETSC_TRUE;
9381bbcc794SSatish Balay   fact->preallocated               = PETSC_TRUE;
939719d5645SBarry Smith   fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense;
940db4efbfdSBarry Smith   PetscFunctionReturn(0);
941db4efbfdSBarry Smith }
942db4efbfdSBarry Smith 
943bf5a80bcSToby Isaac PetscErrorCode MatQRFactor_SeqDense(Mat A,IS col,const MatFactorInfo *minfo)
9444905a7bcSToby Isaac {
9454905a7bcSToby Isaac   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
9464905a7bcSToby Isaac   PetscBLASInt   n,m,info, min, max;
9474905a7bcSToby Isaac 
9484905a7bcSToby Isaac   PetscFunctionBegin;
9495f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(A->cmap->n,&n));
9505f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(A->rmap->n,&m));
9514396437dSToby Isaac   max = PetscMax(m, n);
9524396437dSToby Isaac   min = PetscMin(m, n);
9534905a7bcSToby Isaac   if (!mat->tau) {
9545f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscMalloc1(min,&mat->tau));
9555f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscLogObjectMemory((PetscObject)A,min*sizeof(PetscScalar)));
9564396437dSToby Isaac   }
9574396437dSToby Isaac   if (!mat->pivots) {
9585f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscMalloc1(n,&mat->pivots));
9595f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscLogObjectMemory((PetscObject)A,n*sizeof(PetscScalar)));
9604396437dSToby Isaac   }
9614396437dSToby Isaac   if (!mat->qrrhs) {
9625f80ce2aSJacob Faibussowitsch     CHKERRQ(MatCreateVecs(A, NULL, &(mat->qrrhs)));
9634905a7bcSToby Isaac   }
9644905a7bcSToby Isaac   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
9654905a7bcSToby Isaac   if (!mat->fwork) {
9664905a7bcSToby Isaac     PetscScalar dummy;
9674905a7bcSToby Isaac 
9684905a7bcSToby Isaac     mat->lfwork = -1;
9695f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
9704905a7bcSToby Isaac     PetscStackCallBLAS("LAPACKgeqrf",LAPACKgeqrf_(&m,&n,mat->v,&mat->lda,mat->tau,&dummy,&mat->lfwork,&info));
9715f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFPTrapPop());
9724905a7bcSToby Isaac     mat->lfwork = (PetscInt)PetscRealPart(dummy);
9735f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscMalloc1(mat->lfwork,&mat->fwork));
9745f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscLogObjectMemory((PetscObject)A,mat->lfwork*sizeof(PetscBLASInt)));
9754905a7bcSToby Isaac   }
9765f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
9774905a7bcSToby Isaac   PetscStackCallBLAS("LAPACKgeqrf",LAPACKgeqrf_(&m,&n,mat->v,&mat->lda,mat->tau,mat->fwork,&mat->lfwork,&info));
9785f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFPTrapPop());
979*28b400f6SJacob Faibussowitsch   PetscCheck(!info,PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to QR factorization");
9804905a7bcSToby Isaac   // TODO: try to estimate rank or test for and use geqp3 for rank revealing QR.  For now just say rank is min of m and n
9814905a7bcSToby Isaac   mat->rank = min;
9824905a7bcSToby Isaac 
9834396437dSToby Isaac   A->ops->solve             = MatSolve_SeqDense_QR;
9844396437dSToby Isaac   A->ops->matsolve          = MatMatSolve_SeqDense_QR;
9854905a7bcSToby Isaac   A->factortype             = MAT_FACTOR_QR;
9864905a7bcSToby Isaac   if (m == n) {
9874396437dSToby Isaac     A->ops->solvetranspose    = MatSolveTranspose_SeqDense_QR;
9884396437dSToby Isaac     A->ops->matsolvetranspose = MatMatSolveTranspose_SeqDense_QR;
9894905a7bcSToby Isaac   }
9904905a7bcSToby Isaac 
9915f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(A->solvertype));
9925f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrallocpy(MATSOLVERPETSC,&A->solvertype));
9934905a7bcSToby Isaac 
9945f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogFlops(2.0*min*min*(max-min/3.0)));
9954905a7bcSToby Isaac   PetscFunctionReturn(0);
9964905a7bcSToby Isaac }
9974905a7bcSToby Isaac 
9984905a7bcSToby Isaac static PetscErrorCode MatQRFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
9994905a7bcSToby Isaac {
10004905a7bcSToby Isaac   MatFactorInfo  info;
10014905a7bcSToby Isaac 
10024905a7bcSToby Isaac   PetscFunctionBegin;
10034905a7bcSToby Isaac   info.fill = 1.0;
10044905a7bcSToby Isaac 
10055f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES));
10065f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscUseMethod(fact,"MatQRFactor_C",(Mat,IS,const MatFactorInfo *),(fact,NULL,&info)));
10074905a7bcSToby Isaac   PetscFunctionReturn(0);
10084905a7bcSToby Isaac }
10094905a7bcSToby Isaac 
1010bf5a80bcSToby Isaac PetscErrorCode MatQRFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info)
10114905a7bcSToby Isaac {
10124905a7bcSToby Isaac   PetscFunctionBegin;
10134905a7bcSToby Isaac   fact->assembled                  = PETSC_TRUE;
10144905a7bcSToby Isaac   fact->preallocated               = PETSC_TRUE;
10155f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)fact,"MatQRFactorNumeric_C",MatQRFactorNumeric_SeqDense));
10164905a7bcSToby Isaac   PetscFunctionReturn(0);
10174905a7bcSToby Isaac }
10184905a7bcSToby Isaac 
1019ca15aa20SStefano Zampini /* uses LAPACK */
1020cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact)
1021db4efbfdSBarry Smith {
1022db4efbfdSBarry Smith   PetscFunctionBegin;
10235f80ce2aSJacob Faibussowitsch   CHKERRQ(MatCreate(PetscObjectComm((PetscObject)A),fact));
10245f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n));
10255f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetType(*fact,MATDENSE));
102666e17bc3SBarry Smith   (*fact)->trivialsymbolic = PETSC_TRUE;
10272a350339SBarry Smith   if (ftype == MAT_FACTOR_LU || ftype == MAT_FACTOR_ILU) {
1028db4efbfdSBarry Smith     (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense;
10292a350339SBarry Smith     (*fact)->ops->ilufactorsymbolic = MatLUFactorSymbolic_SeqDense;
1030bf5a80bcSToby Isaac   } else if (ftype == MAT_FACTOR_CHOLESKY || ftype == MAT_FACTOR_ICC) {
1031db4efbfdSBarry Smith     (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense;
1032bf5a80bcSToby Isaac   } else if (ftype == MAT_FACTOR_QR) {
10335f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectComposeFunction((PetscObject)(*fact),"MatQRFactorSymbolic_C",MatQRFactorSymbolic_SeqDense));
1034db4efbfdSBarry Smith   }
1035d5f3da31SBarry Smith   (*fact)->factortype = ftype;
103600c67f3bSHong Zhang 
10375f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree((*fact)->solvertype));
10385f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrallocpy(MATSOLVERPETSC,&(*fact)->solvertype));
10395f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrallocpy(MATORDERINGEXTERNAL,(char**)&(*fact)->preferredordering[MAT_FACTOR_LU]));
10405f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrallocpy(MATORDERINGEXTERNAL,(char**)&(*fact)->preferredordering[MAT_FACTOR_ILU]));
10415f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrallocpy(MATORDERINGEXTERNAL,(char**)&(*fact)->preferredordering[MAT_FACTOR_CHOLESKY]));
10425f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrallocpy(MATORDERINGEXTERNAL,(char**)&(*fact)->preferredordering[MAT_FACTOR_ICC]));
1043db4efbfdSBarry Smith   PetscFunctionReturn(0);
1044db4efbfdSBarry Smith }
1045db4efbfdSBarry Smith 
1046289bc588SBarry Smith /* ------------------------------------------------------------------*/
1047e0877f53SBarry Smith static PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx)
1048289bc588SBarry Smith {
1049c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
1050d9ca1df4SBarry Smith   PetscScalar       *x,*v = mat->v,zero = 0.0,xt;
1051d9ca1df4SBarry Smith   const PetscScalar *b;
1052d0f46423SBarry Smith   PetscInt          m = A->rmap->n,i;
105323fff9afSBarry Smith   PetscBLASInt      o = 1,bm = 0;
1054289bc588SBarry Smith 
10553a40ed3dSBarry Smith   PetscFunctionBegin;
1056ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA)
10572c71b3e2SJacob Faibussowitsch   PetscCheckFalse(A->offloadmask == PETSC_OFFLOAD_GPU,PETSC_COMM_SELF,PETSC_ERR_SUP,"Not implemented");
1058ca15aa20SStefano Zampini #endif
1059422a814eSBarry Smith   if (shift == -1) shift = 0.0; /* negative shift indicates do not error on zero diagonal; this code never zeros on zero diagonal */
10605f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(m,&bm));
1061289bc588SBarry Smith   if (flag & SOR_ZERO_INITIAL_GUESS) {
10623bffc371SBarry Smith     /* this is a hack fix, should have another version without the second BLASdotu */
10635f80ce2aSJacob Faibussowitsch     CHKERRQ(VecSet(xx,zero));
1064289bc588SBarry Smith   }
10655f80ce2aSJacob Faibussowitsch   CHKERRQ(VecGetArray(xx,&x));
10665f80ce2aSJacob Faibussowitsch   CHKERRQ(VecGetArrayRead(bb,&b));
1067b965ef7fSBarry Smith   its  = its*lits;
10682c71b3e2SJacob Faibussowitsch   PetscCheckFalse(its <= 0,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Relaxation requires global its %" PetscInt_FMT " and local its %" PetscInt_FMT " both positive",its,lits);
1069289bc588SBarry Smith   while (its--) {
1070fccaa45eSBarry Smith     if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) {
1071289bc588SBarry Smith       for (i=0; i<m; i++) {
10723bffc371SBarry Smith         PetscStackCallBLAS("BLASdotu",xt   = b[i] - BLASdotu_(&bm,v+i,&bm,x,&o));
107355a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
1074289bc588SBarry Smith       }
1075289bc588SBarry Smith     }
1076fccaa45eSBarry Smith     if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) {
1077289bc588SBarry Smith       for (i=m-1; i>=0; i--) {
10783bffc371SBarry Smith         PetscStackCallBLAS("BLASdotu",xt   = b[i] - BLASdotu_(&bm,v+i,&bm,x,&o));
107955a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
1080289bc588SBarry Smith       }
1081289bc588SBarry Smith     }
1082289bc588SBarry Smith   }
10835f80ce2aSJacob Faibussowitsch   CHKERRQ(VecRestoreArrayRead(bb,&b));
10845f80ce2aSJacob Faibussowitsch   CHKERRQ(VecRestoreArray(xx,&x));
10853a40ed3dSBarry Smith   PetscFunctionReturn(0);
1086289bc588SBarry Smith }
1087289bc588SBarry Smith 
1088289bc588SBarry Smith /* -----------------------------------------------------------------*/
1089ca15aa20SStefano Zampini PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy)
1090289bc588SBarry Smith {
1091c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
1092d9ca1df4SBarry Smith   const PetscScalar *v   = mat->v,*x;
1093d9ca1df4SBarry Smith   PetscScalar       *y;
10940805154bSBarry Smith   PetscBLASInt      m, n,_One=1;
1095ea709b57SSatish Balay   PetscScalar       _DOne=1.0,_DZero=0.0;
10963a40ed3dSBarry Smith 
10973a40ed3dSBarry Smith   PetscFunctionBegin;
10985f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(A->rmap->n,&m));
10995f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(A->cmap->n,&n));
11005f80ce2aSJacob Faibussowitsch   CHKERRQ(VecGetArrayRead(xx,&x));
11015f80ce2aSJacob Faibussowitsch   CHKERRQ(VecGetArrayWrite(yy,&y));
11025ac36cfcSBarry Smith   if (!A->rmap->n || !A->cmap->n) {
11035ac36cfcSBarry Smith     PetscBLASInt i;
11045ac36cfcSBarry Smith     for (i=0; i<n; i++) y[i] = 0.0;
11055ac36cfcSBarry Smith   } else {
11068b83055fSJed Brown     PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One));
11075f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n));
11085ac36cfcSBarry Smith   }
11095f80ce2aSJacob Faibussowitsch   CHKERRQ(VecRestoreArrayRead(xx,&x));
11105f80ce2aSJacob Faibussowitsch   CHKERRQ(VecRestoreArrayWrite(yy,&y));
11113a40ed3dSBarry Smith   PetscFunctionReturn(0);
1112289bc588SBarry Smith }
1113800995b7SMatthew Knepley 
1114ca15aa20SStefano Zampini PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy)
1115289bc588SBarry Smith {
1116c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
1117d9ca1df4SBarry Smith   PetscScalar       *y,_DOne=1.0,_DZero=0.0;
11180805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
1119d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
11203a40ed3dSBarry Smith 
11213a40ed3dSBarry Smith   PetscFunctionBegin;
11225f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(A->rmap->n,&m));
11235f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(A->cmap->n,&n));
11245f80ce2aSJacob Faibussowitsch   CHKERRQ(VecGetArrayRead(xx,&x));
11255f80ce2aSJacob Faibussowitsch   CHKERRQ(VecGetArrayWrite(yy,&y));
11265ac36cfcSBarry Smith   if (!A->rmap->n || !A->cmap->n) {
11275ac36cfcSBarry Smith     PetscBLASInt i;
11285ac36cfcSBarry Smith     for (i=0; i<m; i++) y[i] = 0.0;
11295ac36cfcSBarry Smith   } else {
11308b83055fSJed Brown     PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One));
11315f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n));
11325ac36cfcSBarry Smith   }
11335f80ce2aSJacob Faibussowitsch   CHKERRQ(VecRestoreArrayRead(xx,&x));
11345f80ce2aSJacob Faibussowitsch   CHKERRQ(VecRestoreArrayWrite(yy,&y));
11353a40ed3dSBarry Smith   PetscFunctionReturn(0);
1136289bc588SBarry Smith }
11376ee01492SSatish Balay 
1138ca15aa20SStefano Zampini PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
1139289bc588SBarry Smith {
1140c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
1141d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
1142d9ca1df4SBarry Smith   PetscScalar       *y,_DOne=1.0;
11430805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
11443a40ed3dSBarry Smith 
11453a40ed3dSBarry Smith   PetscFunctionBegin;
11465f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(A->rmap->n,&m));
11475f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(A->cmap->n,&n));
11485f80ce2aSJacob Faibussowitsch   CHKERRQ(VecCopy(zz,yy));
1149d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
11505f80ce2aSJacob Faibussowitsch   CHKERRQ(VecGetArrayRead(xx,&x));
11515f80ce2aSJacob Faibussowitsch   CHKERRQ(VecGetArray(yy,&y));
11528b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
11535f80ce2aSJacob Faibussowitsch   CHKERRQ(VecRestoreArrayRead(xx,&x));
11545f80ce2aSJacob Faibussowitsch   CHKERRQ(VecRestoreArray(yy,&y));
11555f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogFlops(2.0*A->rmap->n*A->cmap->n));
11563a40ed3dSBarry Smith   PetscFunctionReturn(0);
1157289bc588SBarry Smith }
11586ee01492SSatish Balay 
1159ca15aa20SStefano Zampini PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
1160289bc588SBarry Smith {
1161c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
1162d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
1163d9ca1df4SBarry Smith   PetscScalar       *y;
11640805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
116587828ca2SBarry Smith   PetscScalar       _DOne=1.0;
11663a40ed3dSBarry Smith 
11673a40ed3dSBarry Smith   PetscFunctionBegin;
11685f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(A->rmap->n,&m));
11695f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(A->cmap->n,&n));
11705f80ce2aSJacob Faibussowitsch   CHKERRQ(VecCopy(zz,yy));
1171d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
11725f80ce2aSJacob Faibussowitsch   CHKERRQ(VecGetArrayRead(xx,&x));
11735f80ce2aSJacob Faibussowitsch   CHKERRQ(VecGetArray(yy,&y));
11748b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
11755f80ce2aSJacob Faibussowitsch   CHKERRQ(VecRestoreArrayRead(xx,&x));
11765f80ce2aSJacob Faibussowitsch   CHKERRQ(VecRestoreArray(yy,&y));
11775f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogFlops(2.0*A->rmap->n*A->cmap->n));
11783a40ed3dSBarry Smith   PetscFunctionReturn(0);
1179289bc588SBarry Smith }
1180289bc588SBarry Smith 
1181289bc588SBarry Smith /* -----------------------------------------------------------------*/
1182e0877f53SBarry Smith static PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
1183289bc588SBarry Smith {
1184c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
118513f74950SBarry Smith   PetscInt       i;
118667e560aaSBarry Smith 
11873a40ed3dSBarry Smith   PetscFunctionBegin;
1188d0f46423SBarry Smith   *ncols = A->cmap->n;
1189289bc588SBarry Smith   if (cols) {
11905f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscMalloc1(A->cmap->n,cols));
1191d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) (*cols)[i] = i;
1192289bc588SBarry Smith   }
1193289bc588SBarry Smith   if (vals) {
1194ca15aa20SStefano Zampini     const PetscScalar *v;
1195ca15aa20SStefano Zampini 
11965f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseGetArrayRead(A,&v));
11975f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscMalloc1(A->cmap->n,vals));
1198ca15aa20SStefano Zampini     v   += row;
1199d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;}
12005f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseRestoreArrayRead(A,&v));
1201289bc588SBarry Smith   }
12023a40ed3dSBarry Smith   PetscFunctionReturn(0);
1203289bc588SBarry Smith }
12046ee01492SSatish Balay 
1205e0877f53SBarry Smith static PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
1206289bc588SBarry Smith {
1207606d414cSSatish Balay   PetscFunctionBegin;
1208cb4a9cd9SHong Zhang   if (ncols) *ncols = 0;
12095f80ce2aSJacob Faibussowitsch   if (cols) CHKERRQ(PetscFree(*cols));
12105f80ce2aSJacob Faibussowitsch   if (vals) CHKERRQ(PetscFree(*vals));
12113a40ed3dSBarry Smith   PetscFunctionReturn(0);
1212289bc588SBarry Smith }
1213289bc588SBarry Smith /* ----------------------------------------------------------------*/
1214e0877f53SBarry Smith static PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv)
1215289bc588SBarry Smith {
1216c0bbcb79SLois Curfman McInnes   Mat_SeqDense     *mat = (Mat_SeqDense*)A->data;
1217ca15aa20SStefano Zampini   PetscScalar      *av;
121813f74950SBarry Smith   PetscInt         i,j,idx=0;
1219ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA)
1220c70f7ee4SJunchao Zhang   PetscOffloadMask oldf;
1221ca15aa20SStefano Zampini #endif
1222d6dfbf8fSBarry Smith 
12233a40ed3dSBarry Smith   PetscFunctionBegin;
12245f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArray(A,&av));
1225289bc588SBarry Smith   if (!mat->roworiented) {
1226dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
1227289bc588SBarry Smith       for (j=0; j<n; j++) {
1228cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
12296bdcaf15SBarry Smith         PetscCheck(indexn[j] < A->cmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %" PetscInt_FMT " max %" PetscInt_FMT,indexn[j],A->cmap->n-1);
1230289bc588SBarry Smith         for (i=0; i<m; i++) {
1231cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
12326bdcaf15SBarry Smith           PetscCheck(indexm[i] < A->rmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %" PetscInt_FMT " max %" PetscInt_FMT,indexm[i],A->rmap->n-1);
1233ca15aa20SStefano Zampini           av[indexn[j]*mat->lda + indexm[i]] = v[idx++];
1234289bc588SBarry Smith         }
1235289bc588SBarry Smith       }
12363a40ed3dSBarry Smith     } else {
1237289bc588SBarry Smith       for (j=0; j<n; j++) {
1238cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
12396bdcaf15SBarry Smith         PetscCheck(indexn[j] < A->cmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %" PetscInt_FMT " max %" PetscInt_FMT,indexn[j],A->cmap->n-1);
1240289bc588SBarry Smith         for (i=0; i<m; i++) {
1241cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
12426bdcaf15SBarry Smith           PetscCheck(indexm[i] < A->rmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %" PetscInt_FMT " max %" PetscInt_FMT,indexm[i],A->rmap->n-1);
1243ca15aa20SStefano Zampini           av[indexn[j]*mat->lda + indexm[i]] += v[idx++];
1244289bc588SBarry Smith         }
1245289bc588SBarry Smith       }
1246289bc588SBarry Smith     }
12473a40ed3dSBarry Smith   } else {
1248dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
1249e8d4e0b9SBarry Smith       for (i=0; i<m; i++) {
1250cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
12516bdcaf15SBarry Smith         PetscCheck(indexm[i] < A->rmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %" PetscInt_FMT " max %" PetscInt_FMT,indexm[i],A->rmap->n-1);
1252e8d4e0b9SBarry Smith         for (j=0; j<n; j++) {
1253cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
12546bdcaf15SBarry Smith           PetscCheck(indexn[j] < A->cmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %" PetscInt_FMT " max %" PetscInt_FMT,indexn[j],A->cmap->n-1);
1255ca15aa20SStefano Zampini           av[indexn[j]*mat->lda + indexm[i]] = v[idx++];
1256e8d4e0b9SBarry Smith         }
1257e8d4e0b9SBarry Smith       }
12583a40ed3dSBarry Smith     } else {
1259289bc588SBarry Smith       for (i=0; i<m; i++) {
1260cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
12616bdcaf15SBarry Smith         PetscCheck(indexm[i] < A->rmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %" PetscInt_FMT " max %" PetscInt_FMT,indexm[i],A->rmap->n-1);
1262289bc588SBarry Smith         for (j=0; j<n; j++) {
1263cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
12646bdcaf15SBarry Smith           PetscCheck(indexn[j] < A->cmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %" PetscInt_FMT " max %" PetscInt_FMT,indexn[j],A->cmap->n-1);
1265ca15aa20SStefano Zampini           av[indexn[j]*mat->lda + indexm[i]] += v[idx++];
1266289bc588SBarry Smith         }
1267289bc588SBarry Smith       }
1268289bc588SBarry Smith     }
1269e8d4e0b9SBarry Smith   }
1270ca15aa20SStefano Zampini   /* hack to prevent unneeded copy to the GPU while returning the array */
1271ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA)
1272c70f7ee4SJunchao Zhang   oldf = A->offloadmask;
1273c70f7ee4SJunchao Zhang   A->offloadmask = PETSC_OFFLOAD_GPU;
1274ca15aa20SStefano Zampini #endif
12755f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArray(A,&av));
1276ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA)
1277c70f7ee4SJunchao Zhang   A->offloadmask = (oldf == PETSC_OFFLOAD_UNALLOCATED ? PETSC_OFFLOAD_UNALLOCATED : PETSC_OFFLOAD_CPU);
1278ca15aa20SStefano Zampini #endif
12793a40ed3dSBarry Smith   PetscFunctionReturn(0);
1280289bc588SBarry Smith }
1281e8d4e0b9SBarry Smith 
1282e0877f53SBarry Smith static PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[])
1283ae80bb75SLois Curfman McInnes {
1284ae80bb75SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
1285ca15aa20SStefano Zampini   const PetscScalar *vv;
128613f74950SBarry Smith   PetscInt          i,j;
1287ae80bb75SLois Curfman McInnes 
12883a40ed3dSBarry Smith   PetscFunctionBegin;
12895f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayRead(A,&vv));
1290ae80bb75SLois Curfman McInnes   /* row-oriented output */
1291ae80bb75SLois Curfman McInnes   for (i=0; i<m; i++) {
129297e567efSBarry Smith     if (indexm[i] < 0) {v += n;continue;}
12932c71b3e2SJacob Faibussowitsch     PetscCheckFalse(indexm[i] >= A->rmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row %" PetscInt_FMT " requested larger than number rows %" PetscInt_FMT,indexm[i],A->rmap->n);
1294ae80bb75SLois Curfman McInnes     for (j=0; j<n; j++) {
12956f31f424SBarry Smith       if (indexn[j] < 0) {v++; continue;}
12962c71b3e2SJacob Faibussowitsch       PetscCheckFalse(indexn[j] >= A->cmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column %" PetscInt_FMT " requested larger than number columns %" PetscInt_FMT,indexn[j],A->cmap->n);
1297ca15aa20SStefano Zampini       *v++ = vv[indexn[j]*mat->lda + indexm[i]];
1298ae80bb75SLois Curfman McInnes     }
1299ae80bb75SLois Curfman McInnes   }
13005f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayRead(A,&vv));
13013a40ed3dSBarry Smith   PetscFunctionReturn(0);
1302ae80bb75SLois Curfman McInnes }
1303ae80bb75SLois Curfman McInnes 
1304289bc588SBarry Smith /* -----------------------------------------------------------------*/
1305289bc588SBarry Smith 
13068491ab44SLisandro Dalcin PetscErrorCode MatView_Dense_Binary(Mat mat,PetscViewer viewer)
1307aabbc4fbSShri Abhyankar {
13088491ab44SLisandro Dalcin   PetscBool         skipHeader;
13098491ab44SLisandro Dalcin   PetscViewerFormat format;
13108491ab44SLisandro Dalcin   PetscInt          header[4],M,N,m,lda,i,j,k;
13118491ab44SLisandro Dalcin   const PetscScalar *v;
13128491ab44SLisandro Dalcin   PetscScalar       *vwork;
1313aabbc4fbSShri Abhyankar 
1314aabbc4fbSShri Abhyankar   PetscFunctionBegin;
13155f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerSetUp(viewer));
13165f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerBinaryGetSkipHeader(viewer,&skipHeader));
13175f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerGetFormat(viewer,&format));
13188491ab44SLisandro Dalcin   if (skipHeader) format = PETSC_VIEWER_NATIVE;
1319aabbc4fbSShri Abhyankar 
13205f80ce2aSJacob Faibussowitsch   CHKERRQ(MatGetSize(mat,&M,&N));
13218491ab44SLisandro Dalcin 
13228491ab44SLisandro Dalcin   /* write matrix header */
13238491ab44SLisandro Dalcin   header[0] = MAT_FILE_CLASSID; header[1] = M; header[2] = N;
13248491ab44SLisandro Dalcin   header[3] = (format == PETSC_VIEWER_NATIVE) ? MATRIX_BINARY_FORMAT_DENSE : M*N;
13255f80ce2aSJacob Faibussowitsch   if (!skipHeader) CHKERRQ(PetscViewerBinaryWrite(viewer,header,4,PETSC_INT));
13268491ab44SLisandro Dalcin 
13275f80ce2aSJacob Faibussowitsch   CHKERRQ(MatGetLocalSize(mat,&m,NULL));
13288491ab44SLisandro Dalcin   if (format != PETSC_VIEWER_NATIVE) {
13298491ab44SLisandro Dalcin     PetscInt nnz = m*N, *iwork;
13308491ab44SLisandro Dalcin     /* store row lengths for each row */
13315f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscMalloc1(nnz,&iwork));
13328491ab44SLisandro Dalcin     for (i=0; i<m; i++) iwork[i] = N;
13335f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerBinaryWriteAll(viewer,iwork,m,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_INT));
13348491ab44SLisandro Dalcin     /* store column indices (zero start index) */
13358491ab44SLisandro Dalcin     for (k=0, i=0; i<m; i++)
13368491ab44SLisandro Dalcin       for (j=0; j<N; j++, k++)
13378491ab44SLisandro Dalcin         iwork[k] = j;
13385f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerBinaryWriteAll(viewer,iwork,nnz,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_INT));
13395f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFree(iwork));
13408491ab44SLisandro Dalcin   }
13418491ab44SLisandro Dalcin   /* store matrix values as a dense matrix in row major order */
13425f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMalloc1(m*N,&vwork));
13435f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayRead(mat,&v));
13445f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetLDA(mat,&lda));
13458491ab44SLisandro Dalcin   for (k=0, i=0; i<m; i++)
13468491ab44SLisandro Dalcin     for (j=0; j<N; j++, k++)
13478491ab44SLisandro Dalcin       vwork[k] = v[i+lda*j];
13485f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayRead(mat,&v));
13495f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerBinaryWriteAll(viewer,vwork,m*N,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_SCALAR));
13505f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(vwork));
13518491ab44SLisandro Dalcin   PetscFunctionReturn(0);
13528491ab44SLisandro Dalcin }
13538491ab44SLisandro Dalcin 
13548491ab44SLisandro Dalcin PetscErrorCode MatLoad_Dense_Binary(Mat mat,PetscViewer viewer)
13558491ab44SLisandro Dalcin {
13568491ab44SLisandro Dalcin   PetscBool      skipHeader;
13578491ab44SLisandro Dalcin   PetscInt       header[4],M,N,m,nz,lda,i,j,k;
13588491ab44SLisandro Dalcin   PetscInt       rows,cols;
13598491ab44SLisandro Dalcin   PetscScalar    *v,*vwork;
13608491ab44SLisandro Dalcin 
13618491ab44SLisandro Dalcin   PetscFunctionBegin;
13625f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerSetUp(viewer));
13635f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerBinaryGetSkipHeader(viewer,&skipHeader));
13648491ab44SLisandro Dalcin 
13658491ab44SLisandro Dalcin   if (!skipHeader) {
13665f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerBinaryRead(viewer,header,4,NULL,PETSC_INT));
13672c71b3e2SJacob Faibussowitsch     PetscCheckFalse(header[0] != MAT_FILE_CLASSID,PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"Not a matrix object in file");
13688491ab44SLisandro Dalcin     M = header[1]; N = header[2];
13692c71b3e2SJacob Faibussowitsch     PetscCheckFalse(M < 0,PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"Matrix row size (%" PetscInt_FMT ") in file is negative",M);
13702c71b3e2SJacob Faibussowitsch     PetscCheckFalse(N < 0,PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"Matrix column size (%" PetscInt_FMT ") in file is negative",N);
13718491ab44SLisandro Dalcin     nz = header[3];
13722c71b3e2SJacob Faibussowitsch     PetscCheckFalse(nz != MATRIX_BINARY_FORMAT_DENSE && nz < 0,PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"Unknown matrix format %" PetscInt_FMT " in file",nz);
1373aabbc4fbSShri Abhyankar   } else {
13745f80ce2aSJacob Faibussowitsch     CHKERRQ(MatGetSize(mat,&M,&N));
13752c71b3e2SJacob Faibussowitsch     PetscCheckFalse(M < 0 || N < 0,PETSC_COMM_SELF,PETSC_ERR_USER,"Matrix binary file header was skipped, thus the user must specify the global sizes of input matrix");
13768491ab44SLisandro Dalcin     nz = MATRIX_BINARY_FORMAT_DENSE;
1377e6324fbbSBarry Smith   }
1378aabbc4fbSShri Abhyankar 
13798491ab44SLisandro Dalcin   /* setup global sizes if not set */
13808491ab44SLisandro Dalcin   if (mat->rmap->N < 0) mat->rmap->N = M;
13818491ab44SLisandro Dalcin   if (mat->cmap->N < 0) mat->cmap->N = N;
13825f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetUp(mat));
13838491ab44SLisandro Dalcin   /* check if global sizes are correct */
13845f80ce2aSJacob Faibussowitsch   CHKERRQ(MatGetSize(mat,&rows,&cols));
13852c71b3e2SJacob Faibussowitsch   PetscCheckFalse(M != rows || N != cols,PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED, "Matrix in file of different sizes (%" PetscInt_FMT ", %" PetscInt_FMT ") than the input matrix (%" PetscInt_FMT ", %" PetscInt_FMT ")",M,N,rows,cols);
1386aabbc4fbSShri Abhyankar 
13875f80ce2aSJacob Faibussowitsch   CHKERRQ(MatGetSize(mat,NULL,&N));
13885f80ce2aSJacob Faibussowitsch   CHKERRQ(MatGetLocalSize(mat,&m,NULL));
13895f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArray(mat,&v));
13905f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetLDA(mat,&lda));
13918491ab44SLisandro Dalcin   if (nz == MATRIX_BINARY_FORMAT_DENSE) {  /* matrix in file is dense format */
13928491ab44SLisandro Dalcin     PetscInt nnz = m*N;
13938491ab44SLisandro Dalcin     /* read in matrix values */
13945f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscMalloc1(nnz,&vwork));
13955f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerBinaryReadAll(viewer,vwork,nnz,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_SCALAR));
13968491ab44SLisandro Dalcin     /* store values in column major order */
13978491ab44SLisandro Dalcin     for (j=0; j<N; j++)
13988491ab44SLisandro Dalcin       for (i=0; i<m; i++)
13998491ab44SLisandro Dalcin         v[i+lda*j] = vwork[i*N+j];
14005f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFree(vwork));
14018491ab44SLisandro Dalcin   } else { /* matrix in file is sparse format */
14028491ab44SLisandro Dalcin     PetscInt nnz = 0, *rlens, *icols;
14038491ab44SLisandro Dalcin     /* read in row lengths */
14045f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscMalloc1(m,&rlens));
14055f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerBinaryReadAll(viewer,rlens,m,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_INT));
14068491ab44SLisandro Dalcin     for (i=0; i<m; i++) nnz += rlens[i];
14078491ab44SLisandro Dalcin     /* read in column indices and values */
14085f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscMalloc2(nnz,&icols,nnz,&vwork));
14095f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerBinaryReadAll(viewer,icols,nnz,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_INT));
14105f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerBinaryReadAll(viewer,vwork,nnz,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_SCALAR));
14118491ab44SLisandro Dalcin     /* store values in column major order */
14128491ab44SLisandro Dalcin     for (k=0, i=0; i<m; i++)
14138491ab44SLisandro Dalcin       for (j=0; j<rlens[i]; j++, k++)
14148491ab44SLisandro Dalcin         v[i+lda*icols[k]] = vwork[k];
14155f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFree(rlens));
14165f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFree2(icols,vwork));
1417aabbc4fbSShri Abhyankar   }
14185f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArray(mat,&v));
14195f80ce2aSJacob Faibussowitsch   CHKERRQ(MatAssemblyBegin(mat,MAT_FINAL_ASSEMBLY));
14205f80ce2aSJacob Faibussowitsch   CHKERRQ(MatAssemblyEnd(mat,MAT_FINAL_ASSEMBLY));
1421aabbc4fbSShri Abhyankar   PetscFunctionReturn(0);
1422aabbc4fbSShri Abhyankar }
1423aabbc4fbSShri Abhyankar 
1424eb91f321SVaclav Hapla PetscErrorCode MatLoad_SeqDense(Mat newMat, PetscViewer viewer)
1425eb91f321SVaclav Hapla {
1426eb91f321SVaclav Hapla   PetscBool      isbinary, ishdf5;
1427eb91f321SVaclav Hapla 
1428eb91f321SVaclav Hapla   PetscFunctionBegin;
1429eb91f321SVaclav Hapla   PetscValidHeaderSpecific(newMat,MAT_CLASSID,1);
1430eb91f321SVaclav Hapla   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
1431eb91f321SVaclav Hapla   /* force binary viewer to load .info file if it has not yet done so */
14325f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerSetUp(viewer));
14335f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary));
14345f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERHDF5,  &ishdf5));
1435eb91f321SVaclav Hapla   if (isbinary) {
14365f80ce2aSJacob Faibussowitsch     CHKERRQ(MatLoad_Dense_Binary(newMat,viewer));
1437eb91f321SVaclav Hapla   } else if (ishdf5) {
1438eb91f321SVaclav Hapla #if defined(PETSC_HAVE_HDF5)
14395f80ce2aSJacob Faibussowitsch     CHKERRQ(MatLoad_Dense_HDF5(newMat,viewer));
1440eb91f321SVaclav Hapla #else
1441eb91f321SVaclav Hapla     SETERRQ(PetscObjectComm((PetscObject)newMat),PETSC_ERR_SUP,"HDF5 not supported in this build.\nPlease reconfigure using --download-hdf5");
1442eb91f321SVaclav Hapla #endif
1443eb91f321SVaclav Hapla   } else {
144498921bdaSJacob Faibussowitsch     SETERRQ(PetscObjectComm((PetscObject)newMat),PETSC_ERR_SUP,"Viewer type %s not yet supported for reading %s matrices",((PetscObject)viewer)->type_name,((PetscObject)newMat)->type_name);
1445eb91f321SVaclav Hapla   }
1446eb91f321SVaclav Hapla   PetscFunctionReturn(0);
1447eb91f321SVaclav Hapla }
1448eb91f321SVaclav Hapla 
14496849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer)
1450289bc588SBarry Smith {
1451932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
145213f74950SBarry Smith   PetscInt          i,j;
14532dcb1b2aSMatthew Knepley   const char        *name;
1454ca15aa20SStefano Zampini   PetscScalar       *v,*av;
1455f3ef73ceSBarry Smith   PetscViewerFormat format;
14565f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX)
1457ace3abfcSBarry Smith   PetscBool         allreal = PETSC_TRUE;
14585f481a85SSatish Balay #endif
1459932b0c3eSLois Curfman McInnes 
14603a40ed3dSBarry Smith   PetscFunctionBegin;
14615f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayRead(A,(const PetscScalar**)&av));
14625f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerGetFormat(viewer,&format));
1463456192e2SBarry Smith   if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
14643a40ed3dSBarry Smith     PetscFunctionReturn(0);  /* do nothing for now */
1465fb9695e5SSatish Balay   } else if (format == PETSC_VIEWER_ASCII_COMMON) {
14665f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIUseTabs(viewer,PETSC_FALSE));
1467d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
1468ca15aa20SStefano Zampini       v    = av + i;
14695f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPrintf(viewer,"row %" PetscInt_FMT ":",i));
1470d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1471aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
1472329f5518SBarry Smith         if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) {
14735f80ce2aSJacob Faibussowitsch           CHKERRQ(PetscViewerASCIIPrintf(viewer," (%" PetscInt_FMT ", %g + %g i) ",j,(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v)));
1474329f5518SBarry Smith         } else if (PetscRealPart(*v)) {
14755f80ce2aSJacob Faibussowitsch           CHKERRQ(PetscViewerASCIIPrintf(viewer," (%" PetscInt_FMT ", %g) ",j,(double)PetscRealPart(*v)));
14766831982aSBarry Smith         }
147780cd9d93SLois Curfman McInnes #else
14786831982aSBarry Smith         if (*v) {
14795f80ce2aSJacob Faibussowitsch           CHKERRQ(PetscViewerASCIIPrintf(viewer," (%" PetscInt_FMT ", %g) ",j,(double)*v));
14806831982aSBarry Smith         }
148180cd9d93SLois Curfman McInnes #endif
14821b807ce4Svictorle         v += a->lda;
148380cd9d93SLois Curfman McInnes       }
14845f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPrintf(viewer,"\n"));
148580cd9d93SLois Curfman McInnes     }
14865f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIUseTabs(viewer,PETSC_TRUE));
14873a40ed3dSBarry Smith   } else {
14885f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIUseTabs(viewer,PETSC_FALSE));
1489aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
149047989497SBarry Smith     /* determine if matrix has all real values */
1491ca15aa20SStefano Zampini     v = av;
1492d0f46423SBarry Smith     for (i=0; i<A->rmap->n*A->cmap->n; i++) {
1493ffac6cdbSBarry Smith       if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break;}
149447989497SBarry Smith     }
149547989497SBarry Smith #endif
1496fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
14975f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscObjectGetName((PetscObject)A,&name));
14985f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPrintf(viewer,"%% Size = %" PetscInt_FMT " %" PetscInt_FMT " \n",A->rmap->n,A->cmap->n));
14995f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPrintf(viewer,"%s = zeros(%" PetscInt_FMT ",%" PetscInt_FMT ");\n",name,A->rmap->n,A->cmap->n));
15005f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPrintf(viewer,"%s = [\n",name));
1501ffac6cdbSBarry Smith     }
1502ffac6cdbSBarry Smith 
1503d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
1504ca15aa20SStefano Zampini       v = av + i;
1505d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1506aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
150747989497SBarry Smith         if (allreal) {
15085f80ce2aSJacob Faibussowitsch           CHKERRQ(PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v)));
150947989497SBarry Smith         } else {
15105f80ce2aSJacob Faibussowitsch           CHKERRQ(PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v)));
151147989497SBarry Smith         }
1512289bc588SBarry Smith #else
15135f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v));
1514289bc588SBarry Smith #endif
15151b807ce4Svictorle         v += a->lda;
1516289bc588SBarry Smith       }
15175f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPrintf(viewer,"\n"));
1518289bc588SBarry Smith     }
1519fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
15205f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPrintf(viewer,"];\n"));
1521ffac6cdbSBarry Smith     }
15225f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIUseTabs(viewer,PETSC_TRUE));
1523da3a660dSBarry Smith   }
15245f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayRead(A,(const PetscScalar**)&av));
15255f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerFlush(viewer));
15263a40ed3dSBarry Smith   PetscFunctionReturn(0);
1527289bc588SBarry Smith }
1528289bc588SBarry Smith 
15299804daf3SBarry Smith #include <petscdraw.h>
1530e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa)
1531f1af5d2fSBarry Smith {
1532f1af5d2fSBarry Smith   Mat               A  = (Mat) Aa;
1533383922c3SLisandro Dalcin   PetscInt          m  = A->rmap->n,n = A->cmap->n,i,j;
1534383922c3SLisandro Dalcin   int               color = PETSC_DRAW_WHITE;
1535ca15aa20SStefano Zampini   const PetscScalar *v;
1536b0a32e0cSBarry Smith   PetscViewer       viewer;
1537b05fc000SLisandro Dalcin   PetscReal         xl,yl,xr,yr,x_l,x_r,y_l,y_r;
1538f3ef73ceSBarry Smith   PetscViewerFormat format;
15395f80ce2aSJacob Faibussowitsch   PetscErrorCode    ierr;
1540f1af5d2fSBarry Smith 
1541f1af5d2fSBarry Smith   PetscFunctionBegin;
15425f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer));
15435f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerGetFormat(viewer,&format));
15445f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr));
1545f1af5d2fSBarry Smith 
1546f1af5d2fSBarry Smith   /* Loop over matrix elements drawing boxes */
15475f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayRead(A,&v));
1548fb9695e5SSatish Balay   if (format != PETSC_VIEWER_DRAW_CONTOUR) {
1549383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
1550f1af5d2fSBarry Smith     /* Blue for negative and Red for positive */
1551f1af5d2fSBarry Smith     for (j = 0; j < n; j++) {
1552383922c3SLisandro Dalcin       x_l = j; x_r = x_l + 1.0;
1553f1af5d2fSBarry Smith       for (i = 0; i < m; i++) {
1554f1af5d2fSBarry Smith         y_l = m - i - 1.0;
1555f1af5d2fSBarry Smith         y_r = y_l + 1.0;
1556ca15aa20SStefano Zampini         if (PetscRealPart(v[j*m+i]) >  0.) color = PETSC_DRAW_RED;
1557ca15aa20SStefano Zampini         else if (PetscRealPart(v[j*m+i]) <  0.) color = PETSC_DRAW_BLUE;
1558ca15aa20SStefano Zampini         else continue;
15595f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color));
1560f1af5d2fSBarry Smith       }
1561f1af5d2fSBarry Smith     }
1562383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
1563f1af5d2fSBarry Smith   } else {
1564f1af5d2fSBarry Smith     /* use contour shading to indicate magnitude of values */
1565f1af5d2fSBarry Smith     /* first determine max of all nonzero values */
1566b05fc000SLisandro Dalcin     PetscReal minv = 0.0, maxv = 0.0;
1567b05fc000SLisandro Dalcin     PetscDraw popup;
1568b05fc000SLisandro Dalcin 
1569f1af5d2fSBarry Smith     for (i=0; i < m*n; i++) {
1570f1af5d2fSBarry Smith       if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]);
1571f1af5d2fSBarry Smith     }
1572383922c3SLisandro Dalcin     if (minv >= maxv) maxv = minv + PETSC_SMALL;
15735f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscDrawGetPopup(draw,&popup));
15745f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscDrawScalePopup(popup,minv,maxv));
1575383922c3SLisandro Dalcin 
1576383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
1577f1af5d2fSBarry Smith     for (j=0; j<n; j++) {
1578f1af5d2fSBarry Smith       x_l = j;
1579f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1580f1af5d2fSBarry Smith       for (i=0; i<m; i++) {
1581f1af5d2fSBarry Smith         y_l   = m - i - 1.0;
1582f1af5d2fSBarry Smith         y_r   = y_l + 1.0;
1583b05fc000SLisandro Dalcin         color = PetscDrawRealToColor(PetscAbsScalar(v[j*m+i]),minv,maxv);
15845f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color));
1585f1af5d2fSBarry Smith       }
1586f1af5d2fSBarry Smith     }
1587383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
1588f1af5d2fSBarry Smith   }
15895f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayRead(A,&v));
1590f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1591f1af5d2fSBarry Smith }
1592f1af5d2fSBarry Smith 
1593e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer)
1594f1af5d2fSBarry Smith {
1595b0a32e0cSBarry Smith   PetscDraw      draw;
1596ace3abfcSBarry Smith   PetscBool      isnull;
1597329f5518SBarry Smith   PetscReal      xr,yr,xl,yl,h,w;
1598f1af5d2fSBarry Smith 
1599f1af5d2fSBarry Smith   PetscFunctionBegin;
16005f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerDrawGetDraw(viewer,0,&draw));
16015f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawIsNull(draw,&isnull));
1602abc0a331SBarry Smith   if (isnull) PetscFunctionReturn(0);
1603f1af5d2fSBarry Smith 
1604d0f46423SBarry Smith   xr   = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0;
1605f1af5d2fSBarry Smith   xr  += w;          yr += h;        xl = -w;     yl = -h;
16065f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawSetCoordinates(draw,xl,yl,xr,yr));
16075f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer));
16085f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A));
16095f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL));
16105f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawSave(draw));
1611f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1612f1af5d2fSBarry Smith }
1613f1af5d2fSBarry Smith 
1614dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer)
1615932b0c3eSLois Curfman McInnes {
1616ace3abfcSBarry Smith   PetscBool      iascii,isbinary,isdraw;
1617932b0c3eSLois Curfman McInnes 
16183a40ed3dSBarry Smith   PetscFunctionBegin;
16195f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii));
16205f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary));
16215f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw));
1622c45a1595SBarry Smith   if (iascii) {
16235f80ce2aSJacob Faibussowitsch     CHKERRQ(MatView_SeqDense_ASCII(A,viewer));
16240f5bd95cSBarry Smith   } else if (isbinary) {
16255f80ce2aSJacob Faibussowitsch     CHKERRQ(MatView_Dense_Binary(A,viewer));
1626f1af5d2fSBarry Smith   } else if (isdraw) {
16275f80ce2aSJacob Faibussowitsch     CHKERRQ(MatView_SeqDense_Draw(A,viewer));
1628932b0c3eSLois Curfman McInnes   }
16293a40ed3dSBarry Smith   PetscFunctionReturn(0);
1630932b0c3eSLois Curfman McInnes }
1631289bc588SBarry Smith 
1632637a0070SStefano Zampini static PetscErrorCode MatDensePlaceArray_SeqDense(Mat A,const PetscScalar *array)
1633d3042a70SBarry Smith {
1634d3042a70SBarry Smith   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1635d3042a70SBarry Smith 
1636d3042a70SBarry Smith   PetscFunctionBegin;
1637*28b400f6SJacob Faibussowitsch   PetscCheck(!a->vecinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first");
1638*28b400f6SJacob Faibussowitsch   PetscCheck(!a->matinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first");
1639*28b400f6SJacob Faibussowitsch   PetscCheck(!a->unplacedarray,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreArray() first");
1640d3042a70SBarry Smith   a->unplacedarray       = a->v;
1641d3042a70SBarry Smith   a->unplaced_user_alloc = a->user_alloc;
1642d3042a70SBarry Smith   a->v                   = (PetscScalar*) array;
1643637a0070SStefano Zampini   a->user_alloc          = PETSC_TRUE;
1644ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA)
1645c70f7ee4SJunchao Zhang   A->offloadmask = PETSC_OFFLOAD_CPU;
1646ca15aa20SStefano Zampini #endif
1647d3042a70SBarry Smith   PetscFunctionReturn(0);
1648d3042a70SBarry Smith }
1649d3042a70SBarry Smith 
1650d3042a70SBarry Smith static PetscErrorCode MatDenseResetArray_SeqDense(Mat A)
1651d3042a70SBarry Smith {
1652d3042a70SBarry Smith   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1653d3042a70SBarry Smith 
1654d3042a70SBarry Smith   PetscFunctionBegin;
1655*28b400f6SJacob Faibussowitsch   PetscCheck(!a->vecinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first");
1656*28b400f6SJacob Faibussowitsch   PetscCheck(!a->matinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first");
1657d3042a70SBarry Smith   a->v             = a->unplacedarray;
1658d3042a70SBarry Smith   a->user_alloc    = a->unplaced_user_alloc;
1659d3042a70SBarry Smith   a->unplacedarray = NULL;
1660ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA)
1661c70f7ee4SJunchao Zhang   A->offloadmask = PETSC_OFFLOAD_CPU;
1662ca15aa20SStefano Zampini #endif
1663d3042a70SBarry Smith   PetscFunctionReturn(0);
1664d3042a70SBarry Smith }
1665d3042a70SBarry Smith 
1666d5ea218eSStefano Zampini static PetscErrorCode MatDenseReplaceArray_SeqDense(Mat A,const PetscScalar *array)
1667d5ea218eSStefano Zampini {
1668d5ea218eSStefano Zampini   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1669d5ea218eSStefano Zampini 
1670d5ea218eSStefano Zampini   PetscFunctionBegin;
1671*28b400f6SJacob Faibussowitsch   PetscCheck(!a->vecinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first");
1672*28b400f6SJacob Faibussowitsch   PetscCheck(!a->matinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first");
16735f80ce2aSJacob Faibussowitsch   if (!a->user_alloc) CHKERRQ(PetscFree(a->v));
1674d5ea218eSStefano Zampini   a->v           = (PetscScalar*) array;
1675d5ea218eSStefano Zampini   a->user_alloc  = PETSC_FALSE;
1676d5ea218eSStefano Zampini #if defined(PETSC_HAVE_CUDA)
1677d5ea218eSStefano Zampini   A->offloadmask = PETSC_OFFLOAD_CPU;
1678d5ea218eSStefano Zampini #endif
1679d5ea218eSStefano Zampini   PetscFunctionReturn(0);
1680d5ea218eSStefano Zampini }
1681d5ea218eSStefano Zampini 
1682ca15aa20SStefano Zampini PetscErrorCode MatDestroy_SeqDense(Mat mat)
1683289bc588SBarry Smith {
1684ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)mat->data;
168590f02eecSBarry Smith 
16863a40ed3dSBarry Smith   PetscFunctionBegin;
1687aa482453SBarry Smith #if defined(PETSC_USE_LOG)
1688c0aa6a63SJacob Faibussowitsch   PetscLogObjectState((PetscObject)mat,"Rows %" PetscInt_FMT " Cols %" PetscInt_FMT,mat->rmap->n,mat->cmap->n);
1689a5a9c739SBarry Smith #endif
16905f80ce2aSJacob Faibussowitsch   CHKERRQ(VecDestroy(&(l->qrrhs)));
16915f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(l->tau));
16925f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(l->pivots));
16935f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(l->fwork));
16945f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&l->ptapwork));
16955f80ce2aSJacob Faibussowitsch   if (!l->user_alloc) CHKERRQ(PetscFree(l->v));
16965f80ce2aSJacob Faibussowitsch   if (!l->unplaced_user_alloc) CHKERRQ(PetscFree(l->unplacedarray));
1697*28b400f6SJacob Faibussowitsch   PetscCheck(!l->vecinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first");
1698*28b400f6SJacob Faibussowitsch   PetscCheck(!l->matinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first");
16995f80ce2aSJacob Faibussowitsch   CHKERRQ(VecDestroy(&l->cvec));
17005f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&l->cmat));
17015f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(mat->data));
1702dbd8c25aSHong Zhang 
17035f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectChangeTypeName((PetscObject)mat,NULL));
17045f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatQRFactor_C",NULL));
17055f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetLDA_C",NULL));
17065f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatDenseSetLDA_C",NULL));
17075f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL));
17085f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL));
17095f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatDensePlaceArray_C",NULL));
17105f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatDenseResetArray_C",NULL));
17115f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatDenseReplaceArray_C",NULL));
17125f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArrayRead_C",NULL));
17135f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArrayRead_C",NULL));
17145f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArrayWrite_C",NULL));
17155f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArrayWrite_C",NULL));
17165f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL));
17178baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
17185f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL));
17198baccfbdSHong Zhang #endif
1720d24d4204SJose E. Roman #if defined(PETSC_HAVE_SCALAPACK)
17215f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_scalapack_C",NULL));
1722d24d4204SJose E. Roman #endif
17232bf066beSStefano Zampini #if defined(PETSC_HAVE_CUDA)
17245f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqdensecuda_C",NULL));
17255f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqdensecuda_seqdensecuda_C",NULL));
17265f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqdensecuda_seqdense_C",NULL));
17272bf066beSStefano Zampini #endif
17285f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL));
17295f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqaij_seqdense_C",NULL));
17305f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqdense_seqdense_C",NULL));
17315f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqbaij_seqdense_C",NULL));
17325f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqsbaij_seqdense_C",NULL));
173352c5f739Sprj- 
17345f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumn_C",NULL));
17355f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumn_C",NULL));
17365f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumnVec_C",NULL));
17375f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumnVec_C",NULL));
17385f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumnVecRead_C",NULL));
17395f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumnVecRead_C",NULL));
17405f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumnVecWrite_C",NULL));
17415f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumnVecWrite_C",NULL));
17425f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetSubMatrix_C",NULL));
17435f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreSubMatrix_C",NULL));
17443a40ed3dSBarry Smith   PetscFunctionReturn(0);
1745289bc588SBarry Smith }
1746289bc588SBarry Smith 
1747e0877f53SBarry Smith static PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout)
1748289bc588SBarry Smith {
1749c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
17506536e3caSStefano Zampini   PetscInt       k,j,m = A->rmap->n, M = mat->lda, n = A->cmap->n;
175187828ca2SBarry Smith   PetscScalar    *v,tmp;
175248b35521SBarry Smith 
17533a40ed3dSBarry Smith   PetscFunctionBegin;
17546536e3caSStefano Zampini   if (reuse == MAT_INPLACE_MATRIX) {
17556536e3caSStefano Zampini     if (m == n) { /* in place transpose */
17565f80ce2aSJacob Faibussowitsch       CHKERRQ(MatDenseGetArray(A,&v));
1757d3e5ee88SLois Curfman McInnes       for (j=0; j<m; j++) {
1758289bc588SBarry Smith         for (k=0; k<j; k++) {
17591b807ce4Svictorle           tmp        = v[j + k*M];
17601b807ce4Svictorle           v[j + k*M] = v[k + j*M];
17611b807ce4Svictorle           v[k + j*M] = tmp;
1762289bc588SBarry Smith         }
1763289bc588SBarry Smith       }
17645f80ce2aSJacob Faibussowitsch       CHKERRQ(MatDenseRestoreArray(A,&v));
17656536e3caSStefano Zampini     } else { /* reuse memory, temporary allocates new memory */
17666536e3caSStefano Zampini       PetscScalar *v2;
17676536e3caSStefano Zampini       PetscLayout tmplayout;
17686536e3caSStefano Zampini 
17695f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscMalloc1((size_t)m*n,&v2));
17705f80ce2aSJacob Faibussowitsch       CHKERRQ(MatDenseGetArray(A,&v));
17716536e3caSStefano Zampini       for (j=0; j<n; j++) {
17726536e3caSStefano Zampini         for (k=0; k<m; k++) v2[j + (size_t)k*n] = v[k + (size_t)j*M];
17736536e3caSStefano Zampini       }
17745f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscArraycpy(v,v2,(size_t)m*n));
17755f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscFree(v2));
17765f80ce2aSJacob Faibussowitsch       CHKERRQ(MatDenseRestoreArray(A,&v));
17776536e3caSStefano Zampini       /* cleanup size dependent quantities */
17785f80ce2aSJacob Faibussowitsch       CHKERRQ(VecDestroy(&mat->cvec));
17795f80ce2aSJacob Faibussowitsch       CHKERRQ(MatDestroy(&mat->cmat));
17805f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscFree(mat->pivots));
17815f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscFree(mat->fwork));
17825f80ce2aSJacob Faibussowitsch       CHKERRQ(MatDestroy(&mat->ptapwork));
17836536e3caSStefano Zampini       /* swap row/col layouts */
17846536e3caSStefano Zampini       mat->lda  = n;
17856536e3caSStefano Zampini       tmplayout = A->rmap;
17866536e3caSStefano Zampini       A->rmap   = A->cmap;
17876536e3caSStefano Zampini       A->cmap   = tmplayout;
17886536e3caSStefano Zampini     }
17893a40ed3dSBarry Smith   } else { /* out-of-place transpose */
1790d3e5ee88SLois Curfman McInnes     Mat          tmat;
1791ec8511deSBarry Smith     Mat_SeqDense *tmatd;
179287828ca2SBarry Smith     PetscScalar  *v2;
1793af36a384SStefano Zampini     PetscInt     M2;
1794ea709b57SSatish Balay 
17956536e3caSStefano Zampini     if (reuse == MAT_INITIAL_MATRIX) {
17965f80ce2aSJacob Faibussowitsch       CHKERRQ(MatCreate(PetscObjectComm((PetscObject)A),&tmat));
17975f80ce2aSJacob Faibussowitsch       CHKERRQ(MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n));
17985f80ce2aSJacob Faibussowitsch       CHKERRQ(MatSetType(tmat,((PetscObject)A)->type_name));
17995f80ce2aSJacob Faibussowitsch       CHKERRQ(MatSeqDenseSetPreallocation(tmat,NULL));
1800ca15aa20SStefano Zampini     } else tmat = *matout;
1801ca15aa20SStefano Zampini 
18025f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseGetArrayRead(A,(const PetscScalar**)&v));
18035f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseGetArray(tmat,&v2));
1804ec8511deSBarry Smith     tmatd = (Mat_SeqDense*)tmat->data;
1805ca15aa20SStefano Zampini     M2    = tmatd->lda;
1806d3e5ee88SLois Curfman McInnes     for (j=0; j<n; j++) {
1807af36a384SStefano Zampini       for (k=0; k<m; k++) v2[j + k*M2] = v[k + j*M];
1808d3e5ee88SLois Curfman McInnes     }
18095f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseRestoreArray(tmat,&v2));
18105f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDenseRestoreArrayRead(A,(const PetscScalar**)&v));
18115f80ce2aSJacob Faibussowitsch     CHKERRQ(MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY));
18125f80ce2aSJacob Faibussowitsch     CHKERRQ(MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY));
18136536e3caSStefano Zampini     *matout = tmat;
181448b35521SBarry Smith   }
18153a40ed3dSBarry Smith   PetscFunctionReturn(0);
1816289bc588SBarry Smith }
1817289bc588SBarry Smith 
1818e0877f53SBarry Smith static PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool  *flg)
1819289bc588SBarry Smith {
1820c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat1 = (Mat_SeqDense*)A1->data;
1821c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat2 = (Mat_SeqDense*)A2->data;
1822ca15aa20SStefano Zampini   PetscInt          i;
1823ca15aa20SStefano Zampini   const PetscScalar *v1,*v2;
18249ea5d5aeSSatish Balay 
18253a40ed3dSBarry Smith   PetscFunctionBegin;
1826d0f46423SBarry Smith   if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1827d0f46423SBarry Smith   if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
18285f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayRead(A1,&v1));
18295f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayRead(A2,&v2));
1830ca15aa20SStefano Zampini   for (i=0; i<A1->cmap->n; i++) {
18315f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscArraycmp(v1,v2,A1->rmap->n,flg));
1832ca15aa20SStefano Zampini     if (*flg == PETSC_FALSE) PetscFunctionReturn(0);
1833ca15aa20SStefano Zampini     v1 += mat1->lda;
1834ca15aa20SStefano Zampini     v2 += mat2->lda;
18351b807ce4Svictorle   }
18365f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayRead(A1,&v1));
18375f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayRead(A2,&v2));
183877c4ece6SBarry Smith   *flg = PETSC_TRUE;
18393a40ed3dSBarry Smith   PetscFunctionReturn(0);
1840289bc588SBarry Smith }
1841289bc588SBarry Smith 
1842e0877f53SBarry Smith static PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v)
1843289bc588SBarry Smith {
1844c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
184513f74950SBarry Smith   PetscInt          i,n,len;
1846ca15aa20SStefano Zampini   PetscScalar       *x;
1847ca15aa20SStefano Zampini   const PetscScalar *vv;
184844cd7ae7SLois Curfman McInnes 
18493a40ed3dSBarry Smith   PetscFunctionBegin;
18505f80ce2aSJacob Faibussowitsch   CHKERRQ(VecGetSize(v,&n));
18515f80ce2aSJacob Faibussowitsch   CHKERRQ(VecGetArray(v,&x));
1852d0f46423SBarry Smith   len  = PetscMin(A->rmap->n,A->cmap->n);
18535f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayRead(A,&vv));
18542c71b3e2SJacob Faibussowitsch   PetscCheckFalse(n != A->rmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec");
185544cd7ae7SLois Curfman McInnes   for (i=0; i<len; i++) {
1856ca15aa20SStefano Zampini     x[i] = vv[i*mat->lda + i];
1857289bc588SBarry Smith   }
18585f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayRead(A,&vv));
18595f80ce2aSJacob Faibussowitsch   CHKERRQ(VecRestoreArray(v,&x));
18603a40ed3dSBarry Smith   PetscFunctionReturn(0);
1861289bc588SBarry Smith }
1862289bc588SBarry Smith 
1863e0877f53SBarry Smith static PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr)
1864289bc588SBarry Smith {
1865c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
1866f1ceaac6SMatthew G. Knepley   const PetscScalar *l,*r;
1867ca15aa20SStefano Zampini   PetscScalar       x,*v,*vv;
1868d0f46423SBarry Smith   PetscInt          i,j,m = A->rmap->n,n = A->cmap->n;
186955659b69SBarry Smith 
18703a40ed3dSBarry Smith   PetscFunctionBegin;
18715f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArray(A,&vv));
187228988994SBarry Smith   if (ll) {
18735f80ce2aSJacob Faibussowitsch     CHKERRQ(VecGetSize(ll,&m));
18745f80ce2aSJacob Faibussowitsch     CHKERRQ(VecGetArrayRead(ll,&l));
18752c71b3e2SJacob Faibussowitsch     PetscCheckFalse(m != A->rmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size");
1876da3a660dSBarry Smith     for (i=0; i<m; i++) {
1877da3a660dSBarry Smith       x = l[i];
1878ca15aa20SStefano Zampini       v = vv + i;
1879b43bac26SStefano Zampini       for (j=0; j<n; j++) { (*v) *= x; v+= mat->lda;}
1880da3a660dSBarry Smith     }
18815f80ce2aSJacob Faibussowitsch     CHKERRQ(VecRestoreArrayRead(ll,&l));
18825f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscLogFlops(1.0*n*m));
1883da3a660dSBarry Smith   }
188428988994SBarry Smith   if (rr) {
18855f80ce2aSJacob Faibussowitsch     CHKERRQ(VecGetSize(rr,&n));
18865f80ce2aSJacob Faibussowitsch     CHKERRQ(VecGetArrayRead(rr,&r));
18872c71b3e2SJacob Faibussowitsch     PetscCheckFalse(n != A->cmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size");
1888da3a660dSBarry Smith     for (i=0; i<n; i++) {
1889da3a660dSBarry Smith       x = r[i];
1890ca15aa20SStefano Zampini       v = vv + i*mat->lda;
18912205254eSKarl Rupp       for (j=0; j<m; j++) (*v++) *= x;
1892da3a660dSBarry Smith     }
18935f80ce2aSJacob Faibussowitsch     CHKERRQ(VecRestoreArrayRead(rr,&r));
18945f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscLogFlops(1.0*n*m));
1895da3a660dSBarry Smith   }
18965f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArray(A,&vv));
18973a40ed3dSBarry Smith   PetscFunctionReturn(0);
1898289bc588SBarry Smith }
1899289bc588SBarry Smith 
1900ca15aa20SStefano Zampini PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm)
1901289bc588SBarry Smith {
1902c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
1903ca15aa20SStefano Zampini   PetscScalar       *v,*vv;
1904329f5518SBarry Smith   PetscReal         sum = 0.0;
190575f6d85dSStefano Zampini   PetscInt          lda, m=A->rmap->n,i,j;
190655659b69SBarry Smith 
19073a40ed3dSBarry Smith   PetscFunctionBegin;
19085f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayRead(A,(const PetscScalar**)&vv));
19095f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetLDA(A,&lda));
1910ca15aa20SStefano Zampini   v    = vv;
1911289bc588SBarry Smith   if (type == NORM_FROBENIUS) {
1912a5ce6ee0Svictorle     if (lda>m) {
1913d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1914ca15aa20SStefano Zampini         v = vv+j*lda;
1915a5ce6ee0Svictorle         for (i=0; i<m; i++) {
1916a5ce6ee0Svictorle           sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1917a5ce6ee0Svictorle         }
1918a5ce6ee0Svictorle       }
1919a5ce6ee0Svictorle     } else {
1920570b7f6dSBarry Smith #if defined(PETSC_USE_REAL___FP16)
1921570b7f6dSBarry Smith       PetscBLASInt one = 1,cnt = A->cmap->n*A->rmap->n;
192273cf7048SBarry Smith       PetscStackCallBLAS("BLASnrm2",*nrm = BLASnrm2_(&cnt,v,&one));
1923570b7f6dSBarry Smith     }
1924570b7f6dSBarry Smith #else
1925d0f46423SBarry Smith       for (i=0; i<A->cmap->n*A->rmap->n; i++) {
1926329f5518SBarry Smith         sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1927289bc588SBarry Smith       }
1928a5ce6ee0Svictorle     }
19298f1a2a5eSBarry Smith     *nrm = PetscSqrtReal(sum);
1930570b7f6dSBarry Smith #endif
19315f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscLogFlops(2.0*A->cmap->n*A->rmap->n));
19323a40ed3dSBarry Smith   } else if (type == NORM_1) {
1933064f8208SBarry Smith     *nrm = 0.0;
1934d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1935ca15aa20SStefano Zampini       v   = vv + j*mat->lda;
1936289bc588SBarry Smith       sum = 0.0;
1937d0f46423SBarry Smith       for (i=0; i<A->rmap->n; i++) {
193833a8263dSBarry Smith         sum += PetscAbsScalar(*v);  v++;
1939289bc588SBarry Smith       }
1940064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1941289bc588SBarry Smith     }
19425f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscLogFlops(1.0*A->cmap->n*A->rmap->n));
19433a40ed3dSBarry Smith   } else if (type == NORM_INFINITY) {
1944064f8208SBarry Smith     *nrm = 0.0;
1945d0f46423SBarry Smith     for (j=0; j<A->rmap->n; j++) {
1946ca15aa20SStefano Zampini       v   = vv + j;
1947289bc588SBarry Smith       sum = 0.0;
1948d0f46423SBarry Smith       for (i=0; i<A->cmap->n; i++) {
19491b807ce4Svictorle         sum += PetscAbsScalar(*v); v += mat->lda;
1950289bc588SBarry Smith       }
1951064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1952289bc588SBarry Smith     }
19535f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscLogFlops(1.0*A->cmap->n*A->rmap->n));
1954e7e72b3dSBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm");
19555f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayRead(A,(const PetscScalar**)&vv));
19563a40ed3dSBarry Smith   PetscFunctionReturn(0);
1957289bc588SBarry Smith }
1958289bc588SBarry Smith 
1959e0877f53SBarry Smith static PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg)
1960289bc588SBarry Smith {
1961c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *aij = (Mat_SeqDense*)A->data;
196267e560aaSBarry Smith 
19633a40ed3dSBarry Smith   PetscFunctionBegin;
1964b5a2b587SKris Buschelman   switch (op) {
1965b5a2b587SKris Buschelman   case MAT_ROW_ORIENTED:
19664e0d8c25SBarry Smith     aij->roworiented = flg;
1967b5a2b587SKris Buschelman     break;
1968512a5fc5SBarry Smith   case MAT_NEW_NONZERO_LOCATIONS:
1969b5a2b587SKris Buschelman   case MAT_NEW_NONZERO_LOCATION_ERR:
19703971808eSMatthew Knepley   case MAT_NEW_NONZERO_ALLOCATION_ERR:
19718c78258cSHong Zhang   case MAT_FORCE_DIAGONAL_ENTRIES:
197213fa8e87SLisandro Dalcin   case MAT_KEEP_NONZERO_PATTERN:
1973b5a2b587SKris Buschelman   case MAT_IGNORE_OFF_PROC_ENTRIES:
1974b5a2b587SKris Buschelman   case MAT_USE_HASH_TABLE:
19750f8fb01aSBarry Smith   case MAT_IGNORE_ZERO_ENTRIES:
19765021d80fSJed Brown   case MAT_IGNORE_LOWER_TRIANGULAR:
1977071fcb05SBarry Smith   case MAT_SORTED_FULL:
19785f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscInfo(A,"Option %s ignored\n",MatOptions[op]));
19795021d80fSJed Brown     break;
19805021d80fSJed Brown   case MAT_SPD:
198177e54ba9SKris Buschelman   case MAT_SYMMETRIC:
198277e54ba9SKris Buschelman   case MAT_STRUCTURALLY_SYMMETRIC:
19839a4540c5SBarry Smith   case MAT_HERMITIAN:
19849a4540c5SBarry Smith   case MAT_SYMMETRY_ETERNAL:
19855021d80fSJed Brown     /* These options are handled directly by MatSetOption() */
198677e54ba9SKris Buschelman     break;
1987b5a2b587SKris Buschelman   default:
198898921bdaSJacob Faibussowitsch     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]);
19893a40ed3dSBarry Smith   }
19903a40ed3dSBarry Smith   PetscFunctionReturn(0);
1991289bc588SBarry Smith }
1992289bc588SBarry Smith 
19933d8925e7SStefano Zampini PetscErrorCode MatZeroEntries_SeqDense(Mat A)
19946f0a148fSBarry Smith {
1995ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)A->data;
19963d8925e7SStefano Zampini   PetscInt       lda=l->lda,m=A->rmap->n,n=A->cmap->n,j;
1997ca15aa20SStefano Zampini   PetscScalar    *v;
19983a40ed3dSBarry Smith 
19993a40ed3dSBarry Smith   PetscFunctionBegin;
20005f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayWrite(A,&v));
2001a5ce6ee0Svictorle   if (lda>m) {
20023d8925e7SStefano Zampini     for (j=0; j<n; j++) {
20035f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscArrayzero(v+j*lda,m));
2004a5ce6ee0Svictorle     }
2005a5ce6ee0Svictorle   } else {
20065f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscArrayzero(v,PetscInt64Mult(m,n)));
2007a5ce6ee0Svictorle   }
20085f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayWrite(A,&v));
20093a40ed3dSBarry Smith   PetscFunctionReturn(0);
20106f0a148fSBarry Smith }
20116f0a148fSBarry Smith 
2012e0877f53SBarry Smith static PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b)
20136f0a148fSBarry Smith {
2014ec8511deSBarry Smith   Mat_SeqDense      *l = (Mat_SeqDense*)A->data;
2015b9679d65SBarry Smith   PetscInt          m  = l->lda, n = A->cmap->n, i,j;
2016ca15aa20SStefano Zampini   PetscScalar       *slot,*bb,*v;
201797b48c8fSBarry Smith   const PetscScalar *xx;
201855659b69SBarry Smith 
20193a40ed3dSBarry Smith   PetscFunctionBegin;
202076bd3646SJed Brown   if (PetscDefined(USE_DEBUG)) {
2021b9679d65SBarry Smith     for (i=0; i<N; i++) {
20222c71b3e2SJacob Faibussowitsch       PetscCheckFalse(rows[i] < 0,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed");
20232c71b3e2SJacob Faibussowitsch       PetscCheckFalse(rows[i] >= A->rmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row %" PetscInt_FMT " requested to be zeroed greater than or equal number of rows %" PetscInt_FMT,rows[i],A->rmap->n);
2024b9679d65SBarry Smith     }
202576bd3646SJed Brown   }
2026ca15aa20SStefano Zampini   if (!N) PetscFunctionReturn(0);
2027b9679d65SBarry Smith 
202897b48c8fSBarry Smith   /* fix right hand side if needed */
202997b48c8fSBarry Smith   if (x && b) {
20305f80ce2aSJacob Faibussowitsch     CHKERRQ(VecGetArrayRead(x,&xx));
20315f80ce2aSJacob Faibussowitsch     CHKERRQ(VecGetArray(b,&bb));
20322205254eSKarl Rupp     for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]];
20335f80ce2aSJacob Faibussowitsch     CHKERRQ(VecRestoreArrayRead(x,&xx));
20345f80ce2aSJacob Faibussowitsch     CHKERRQ(VecRestoreArray(b,&bb));
203597b48c8fSBarry Smith   }
203697b48c8fSBarry Smith 
20375f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArray(A,&v));
20386f0a148fSBarry Smith   for (i=0; i<N; i++) {
2039ca15aa20SStefano Zampini     slot = v + rows[i];
2040b9679d65SBarry Smith     for (j=0; j<n; j++) { *slot = 0.0; slot += m;}
20416f0a148fSBarry Smith   }
2042f4df32b1SMatthew Knepley   if (diag != 0.0) {
20432c71b3e2SJacob Faibussowitsch     PetscCheckFalse(A->rmap->n != A->cmap->n,PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices");
20446f0a148fSBarry Smith     for (i=0; i<N; i++) {
2045ca15aa20SStefano Zampini       slot  = v + (m+1)*rows[i];
2046f4df32b1SMatthew Knepley       *slot = diag;
20476f0a148fSBarry Smith     }
20486f0a148fSBarry Smith   }
20495f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArray(A,&v));
20503a40ed3dSBarry Smith   PetscFunctionReturn(0);
20516f0a148fSBarry Smith }
2052557bce09SLois Curfman McInnes 
205349a6ff4bSBarry Smith static PetscErrorCode MatDenseGetLDA_SeqDense(Mat A,PetscInt *lda)
205449a6ff4bSBarry Smith {
205549a6ff4bSBarry Smith   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
205649a6ff4bSBarry Smith 
205749a6ff4bSBarry Smith   PetscFunctionBegin;
205849a6ff4bSBarry Smith   *lda = mat->lda;
205949a6ff4bSBarry Smith   PetscFunctionReturn(0);
206049a6ff4bSBarry Smith }
206149a6ff4bSBarry Smith 
2062637a0070SStefano Zampini PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar **array)
206364e87e97SBarry Smith {
2064c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
20653a40ed3dSBarry Smith 
20663a40ed3dSBarry Smith   PetscFunctionBegin;
2067*28b400f6SJacob Faibussowitsch   PetscCheck(!mat->matinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first");
206864e87e97SBarry Smith   *array = mat->v;
20693a40ed3dSBarry Smith   PetscFunctionReturn(0);
207064e87e97SBarry Smith }
20710754003eSLois Curfman McInnes 
2072637a0070SStefano Zampini PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar **array)
2073ff14e315SSatish Balay {
20743a40ed3dSBarry Smith   PetscFunctionBegin;
207575f6d85dSStefano Zampini   if (array) *array = NULL;
20763a40ed3dSBarry Smith   PetscFunctionReturn(0);
2077ff14e315SSatish Balay }
20780754003eSLois Curfman McInnes 
20790f74d2c1SSatish Balay /*@
208049a6ff4bSBarry Smith    MatDenseGetLDA - gets the leading dimension of the array returned from MatDenseGetArray()
208149a6ff4bSBarry Smith 
2082ad16ce7aSStefano Zampini    Not collective
208349a6ff4bSBarry Smith 
208449a6ff4bSBarry Smith    Input Parameter:
208549a6ff4bSBarry Smith .  mat - a MATSEQDENSE or MATMPIDENSE matrix
208649a6ff4bSBarry Smith 
208749a6ff4bSBarry Smith    Output Parameter:
208849a6ff4bSBarry Smith .   lda - the leading dimension
208949a6ff4bSBarry Smith 
209049a6ff4bSBarry Smith    Level: intermediate
209149a6ff4bSBarry Smith 
2092ad16ce7aSStefano Zampini .seealso: MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead(), MatDenseSetLDA()
209349a6ff4bSBarry Smith @*/
209449a6ff4bSBarry Smith PetscErrorCode  MatDenseGetLDA(Mat A,PetscInt *lda)
209549a6ff4bSBarry Smith {
209649a6ff4bSBarry Smith   PetscFunctionBegin;
2097d5ea218eSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
2098d5ea218eSStefano Zampini   PetscValidPointer(lda,2);
209975f6d85dSStefano Zampini   MatCheckPreallocated(A,1);
21005f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscUseMethod(A,"MatDenseGetLDA_C",(Mat,PetscInt*),(A,lda)));
210149a6ff4bSBarry Smith   PetscFunctionReturn(0);
210249a6ff4bSBarry Smith }
210349a6ff4bSBarry Smith 
21040f74d2c1SSatish Balay /*@
2105ad16ce7aSStefano Zampini    MatDenseSetLDA - Sets the leading dimension of the array used by the dense matrix
2106ad16ce7aSStefano Zampini 
2107ad16ce7aSStefano Zampini    Not collective
2108ad16ce7aSStefano Zampini 
2109d8d19677SJose E. Roman    Input Parameters:
2110ad16ce7aSStefano Zampini +  mat - a MATSEQDENSE or MATMPIDENSE matrix
2111ad16ce7aSStefano Zampini -  lda - the leading dimension
2112ad16ce7aSStefano Zampini 
2113ad16ce7aSStefano Zampini    Level: intermediate
2114ad16ce7aSStefano Zampini 
2115ad16ce7aSStefano Zampini .seealso: MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead(), MatDenseGetLDA()
2116ad16ce7aSStefano Zampini @*/
2117ad16ce7aSStefano Zampini PetscErrorCode  MatDenseSetLDA(Mat A,PetscInt lda)
2118ad16ce7aSStefano Zampini {
2119ad16ce7aSStefano Zampini   PetscFunctionBegin;
2120ad16ce7aSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
21215f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscTryMethod(A,"MatDenseSetLDA_C",(Mat,PetscInt),(A,lda)));
2122ad16ce7aSStefano Zampini   PetscFunctionReturn(0);
2123ad16ce7aSStefano Zampini }
2124ad16ce7aSStefano Zampini 
2125ad16ce7aSStefano Zampini /*@C
21266947451fSStefano Zampini    MatDenseGetArray - gives read-write access to the array where the data for a dense matrix is stored
212773a71a0fSBarry Smith 
21288572280aSBarry Smith    Logically Collective on Mat
212973a71a0fSBarry Smith 
213073a71a0fSBarry Smith    Input Parameter:
21316947451fSStefano Zampini .  mat - a dense matrix
213273a71a0fSBarry Smith 
213373a71a0fSBarry Smith    Output Parameter:
213473a71a0fSBarry Smith .   array - pointer to the data
213573a71a0fSBarry Smith 
213673a71a0fSBarry Smith    Level: intermediate
213773a71a0fSBarry Smith 
21386947451fSStefano Zampini .seealso: MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead(), MatDenseGetArrayWrite(), MatDenseRestoreArrayWrite()
213973a71a0fSBarry Smith @*/
21408c778c55SBarry Smith PetscErrorCode  MatDenseGetArray(Mat A,PetscScalar **array)
214173a71a0fSBarry Smith {
214273a71a0fSBarry Smith   PetscFunctionBegin;
2143d5ea218eSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
2144d5ea218eSStefano Zampini   PetscValidPointer(array,2);
21455f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array)));
214673a71a0fSBarry Smith   PetscFunctionReturn(0);
214773a71a0fSBarry Smith }
214873a71a0fSBarry Smith 
2149dec5eb66SMatthew G Knepley /*@C
2150579dbff0SBarry Smith    MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray()
215173a71a0fSBarry Smith 
21528572280aSBarry Smith    Logically Collective on Mat
21538572280aSBarry Smith 
21548572280aSBarry Smith    Input Parameters:
21556947451fSStefano Zampini +  mat - a dense matrix
2156a2b725a8SWilliam Gropp -  array - pointer to the data
21578572280aSBarry Smith 
21588572280aSBarry Smith    Level: intermediate
21598572280aSBarry Smith 
21606947451fSStefano Zampini .seealso: MatDenseGetArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead(), MatDenseGetArrayWrite(), MatDenseRestoreArrayWrite()
21618572280aSBarry Smith @*/
21628572280aSBarry Smith PetscErrorCode  MatDenseRestoreArray(Mat A,PetscScalar **array)
21638572280aSBarry Smith {
21648572280aSBarry Smith   PetscFunctionBegin;
2165d5ea218eSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
2166d5ea218eSStefano Zampini   PetscValidPointer(array,2);
21675f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array)));
21685f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectStateIncrease((PetscObject)A));
2169637a0070SStefano Zampini #if defined(PETSC_HAVE_CUDA)
2170637a0070SStefano Zampini   A->offloadmask = PETSC_OFFLOAD_CPU;
2171637a0070SStefano Zampini #endif
21728572280aSBarry Smith   PetscFunctionReturn(0);
21738572280aSBarry Smith }
21748572280aSBarry Smith 
21758572280aSBarry Smith /*@C
21766947451fSStefano Zampini    MatDenseGetArrayRead - gives read-only access to the array where the data for a dense matrix is stored
21778572280aSBarry Smith 
21788572280aSBarry Smith    Not Collective
21798572280aSBarry Smith 
21808572280aSBarry Smith    Input Parameter:
21816947451fSStefano Zampini .  mat - a dense matrix
21828572280aSBarry Smith 
21838572280aSBarry Smith    Output Parameter:
21848572280aSBarry Smith .   array - pointer to the data
21858572280aSBarry Smith 
21868572280aSBarry Smith    Level: intermediate
21878572280aSBarry Smith 
21886947451fSStefano Zampini .seealso: MatDenseRestoreArrayRead(), MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayWrite(), MatDenseRestoreArrayWrite()
21898572280aSBarry Smith @*/
21908572280aSBarry Smith PetscErrorCode  MatDenseGetArrayRead(Mat A,const PetscScalar **array)
21918572280aSBarry Smith {
21928572280aSBarry Smith   PetscFunctionBegin;
2193d5ea218eSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
2194d5ea218eSStefano Zampini   PetscValidPointer(array,2);
21955f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscUseMethod(A,"MatDenseGetArrayRead_C",(Mat,const PetscScalar**),(A,array)));
21968572280aSBarry Smith   PetscFunctionReturn(0);
21978572280aSBarry Smith }
21988572280aSBarry Smith 
21998572280aSBarry Smith /*@C
22006947451fSStefano Zampini    MatDenseRestoreArrayRead - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArrayRead()
22018572280aSBarry Smith 
220273a71a0fSBarry Smith    Not Collective
220373a71a0fSBarry Smith 
220473a71a0fSBarry Smith    Input Parameters:
22056947451fSStefano Zampini +  mat - a dense matrix
2206a2b725a8SWilliam Gropp -  array - pointer to the data
220773a71a0fSBarry Smith 
220873a71a0fSBarry Smith    Level: intermediate
220973a71a0fSBarry Smith 
22106947451fSStefano Zampini .seealso: MatDenseGetArrayRead(), MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayWrite(), MatDenseRestoreArrayWrite()
221173a71a0fSBarry Smith @*/
22128572280aSBarry Smith PetscErrorCode  MatDenseRestoreArrayRead(Mat A,const PetscScalar **array)
221373a71a0fSBarry Smith {
221473a71a0fSBarry Smith   PetscFunctionBegin;
2215d5ea218eSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
2216d5ea218eSStefano Zampini   PetscValidPointer(array,2);
22175f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscUseMethod(A,"MatDenseRestoreArrayRead_C",(Mat,const PetscScalar**),(A,array)));
221873a71a0fSBarry Smith   PetscFunctionReturn(0);
221973a71a0fSBarry Smith }
222073a71a0fSBarry Smith 
22216947451fSStefano Zampini /*@C
22226947451fSStefano Zampini    MatDenseGetArrayWrite - gives write-only access to the array where the data for a dense matrix is stored
22236947451fSStefano Zampini 
22246947451fSStefano Zampini    Not Collective
22256947451fSStefano Zampini 
22266947451fSStefano Zampini    Input Parameter:
22276947451fSStefano Zampini .  mat - a dense matrix
22286947451fSStefano Zampini 
22296947451fSStefano Zampini    Output Parameter:
22306947451fSStefano Zampini .   array - pointer to the data
22316947451fSStefano Zampini 
22326947451fSStefano Zampini    Level: intermediate
22336947451fSStefano Zampini 
22346947451fSStefano Zampini .seealso: MatDenseRestoreArrayWrite(), MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead()
22356947451fSStefano Zampini @*/
22366947451fSStefano Zampini PetscErrorCode  MatDenseGetArrayWrite(Mat A,PetscScalar **array)
22376947451fSStefano Zampini {
22386947451fSStefano Zampini   PetscFunctionBegin;
2239d5ea218eSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
2240d5ea218eSStefano Zampini   PetscValidPointer(array,2);
22415f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscUseMethod(A,"MatDenseGetArrayWrite_C",(Mat,PetscScalar**),(A,array)));
22426947451fSStefano Zampini   PetscFunctionReturn(0);
22436947451fSStefano Zampini }
22446947451fSStefano Zampini 
22456947451fSStefano Zampini /*@C
22466947451fSStefano Zampini    MatDenseRestoreArrayWrite - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArrayWrite()
22476947451fSStefano Zampini 
22486947451fSStefano Zampini    Not Collective
22496947451fSStefano Zampini 
22506947451fSStefano Zampini    Input Parameters:
22516947451fSStefano Zampini +  mat - a dense matrix
22526947451fSStefano Zampini -  array - pointer to the data
22536947451fSStefano Zampini 
22546947451fSStefano Zampini    Level: intermediate
22556947451fSStefano Zampini 
22566947451fSStefano Zampini .seealso: MatDenseGetArrayWrite(), MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead()
22576947451fSStefano Zampini @*/
22586947451fSStefano Zampini PetscErrorCode  MatDenseRestoreArrayWrite(Mat A,PetscScalar **array)
22596947451fSStefano Zampini {
22606947451fSStefano Zampini   PetscFunctionBegin;
2261d5ea218eSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
2262d5ea218eSStefano Zampini   PetscValidPointer(array,2);
22635f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscUseMethod(A,"MatDenseRestoreArrayWrite_C",(Mat,PetscScalar**),(A,array)));
22645f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectStateIncrease((PetscObject)A));
22656947451fSStefano Zampini #if defined(PETSC_HAVE_CUDA)
22666947451fSStefano Zampini   A->offloadmask = PETSC_OFFLOAD_CPU;
22676947451fSStefano Zampini #endif
22686947451fSStefano Zampini   PetscFunctionReturn(0);
22696947451fSStefano Zampini }
22706947451fSStefano Zampini 
2271023c16fcSToby Isaac static PetscErrorCode MatCreateSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,MatReuse scall,Mat *B)
22720754003eSLois Curfman McInnes {
2273c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
2274bf5a80bcSToby Isaac   PetscInt       i,j,nrows,ncols,ldb;
22755d0c19d7SBarry Smith   const PetscInt *irow,*icol;
227687828ca2SBarry Smith   PetscScalar    *av,*bv,*v = mat->v;
22770754003eSLois Curfman McInnes   Mat            newmat;
22780754003eSLois Curfman McInnes 
22793a40ed3dSBarry Smith   PetscFunctionBegin;
22805f80ce2aSJacob Faibussowitsch   CHKERRQ(ISGetIndices(isrow,&irow));
22815f80ce2aSJacob Faibussowitsch   CHKERRQ(ISGetIndices(iscol,&icol));
22825f80ce2aSJacob Faibussowitsch   CHKERRQ(ISGetLocalSize(isrow,&nrows));
22835f80ce2aSJacob Faibussowitsch   CHKERRQ(ISGetLocalSize(iscol,&ncols));
22840754003eSLois Curfman McInnes 
2285182d2002SSatish Balay   /* Check submatrixcall */
2286182d2002SSatish Balay   if (scall == MAT_REUSE_MATRIX) {
228713f74950SBarry Smith     PetscInt n_cols,n_rows;
22885f80ce2aSJacob Faibussowitsch     CHKERRQ(MatGetSize(*B,&n_rows,&n_cols));
228921a2c019SBarry Smith     if (n_rows != nrows || n_cols != ncols) {
2290f746d493SDmitry Karpeev       /* resize the result matrix to match number of requested rows/columns */
22915f80ce2aSJacob Faibussowitsch       CHKERRQ(MatSetSizes(*B,nrows,ncols,nrows,ncols));
229221a2c019SBarry Smith     }
2293182d2002SSatish Balay     newmat = *B;
2294182d2002SSatish Balay   } else {
22950754003eSLois Curfman McInnes     /* Create and fill new matrix */
22965f80ce2aSJacob Faibussowitsch     CHKERRQ(MatCreate(PetscObjectComm((PetscObject)A),&newmat));
22975f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSetSizes(newmat,nrows,ncols,nrows,ncols));
22985f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSetType(newmat,((PetscObject)A)->type_name));
22995f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSeqDenseSetPreallocation(newmat,NULL));
2300182d2002SSatish Balay   }
2301182d2002SSatish Balay 
2302182d2002SSatish Balay   /* Now extract the data pointers and do the copy,column at a time */
23035f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArray(newmat,&bv));
23045f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetLDA(newmat,&ldb));
2305182d2002SSatish Balay   for (i=0; i<ncols; i++) {
23066de62eeeSBarry Smith     av = v + mat->lda*icol[i];
2307ca15aa20SStefano Zampini     for (j=0; j<nrows; j++) bv[j] = av[irow[j]];
2308bf5a80bcSToby Isaac     bv += ldb;
23090754003eSLois Curfman McInnes   }
23105f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArray(newmat,&bv));
2311182d2002SSatish Balay 
2312182d2002SSatish Balay   /* Assemble the matrices so that the correct flags are set */
23135f80ce2aSJacob Faibussowitsch   CHKERRQ(MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY));
23145f80ce2aSJacob Faibussowitsch   CHKERRQ(MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY));
23150754003eSLois Curfman McInnes 
23160754003eSLois Curfman McInnes   /* Free work space */
23175f80ce2aSJacob Faibussowitsch   CHKERRQ(ISRestoreIndices(isrow,&irow));
23185f80ce2aSJacob Faibussowitsch   CHKERRQ(ISRestoreIndices(iscol,&icol));
2319182d2002SSatish Balay   *B   = newmat;
23203a40ed3dSBarry Smith   PetscFunctionReturn(0);
23210754003eSLois Curfman McInnes }
23220754003eSLois Curfman McInnes 
23237dae84e0SHong Zhang static PetscErrorCode MatCreateSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[])
2324905e6a2fSBarry Smith {
232513f74950SBarry Smith   PetscInt       i;
2326905e6a2fSBarry Smith 
23273a40ed3dSBarry Smith   PetscFunctionBegin;
2328905e6a2fSBarry Smith   if (scall == MAT_INITIAL_MATRIX) {
23295f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscCalloc1(n,B));
2330905e6a2fSBarry Smith   }
2331905e6a2fSBarry Smith 
2332905e6a2fSBarry Smith   for (i=0; i<n; i++) {
23335f80ce2aSJacob Faibussowitsch     CHKERRQ(MatCreateSubMatrix_SeqDense(A,irow[i],icol[i],scall,&(*B)[i]));
2334905e6a2fSBarry Smith   }
23353a40ed3dSBarry Smith   PetscFunctionReturn(0);
2336905e6a2fSBarry Smith }
2337905e6a2fSBarry Smith 
2338e0877f53SBarry Smith static PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode)
2339c0aa2d19SHong Zhang {
2340c0aa2d19SHong Zhang   PetscFunctionBegin;
2341c0aa2d19SHong Zhang   PetscFunctionReturn(0);
2342c0aa2d19SHong Zhang }
2343c0aa2d19SHong Zhang 
2344e0877f53SBarry Smith static PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode)
2345c0aa2d19SHong Zhang {
2346c0aa2d19SHong Zhang   PetscFunctionBegin;
2347c0aa2d19SHong Zhang   PetscFunctionReturn(0);
2348c0aa2d19SHong Zhang }
2349c0aa2d19SHong Zhang 
2350a76f77c3SStefano Zampini PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str)
23514b0e389bSBarry Smith {
23524b0e389bSBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data;
2353ca15aa20SStefano Zampini   const PetscScalar *va;
2354ca15aa20SStefano Zampini   PetscScalar       *vb;
2355d0f46423SBarry Smith   PetscInt          lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j;
23563a40ed3dSBarry Smith 
23573a40ed3dSBarry Smith   PetscFunctionBegin;
235833f4a19fSKris Buschelman   /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */
235933f4a19fSKris Buschelman   if (A->ops->copy != B->ops->copy) {
23605f80ce2aSJacob Faibussowitsch     CHKERRQ(MatCopy_Basic(A,B,str));
23613a40ed3dSBarry Smith     PetscFunctionReturn(0);
23623a40ed3dSBarry Smith   }
23632c71b3e2SJacob Faibussowitsch   PetscCheckFalse(m != B->rmap->n || n != B->cmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)");
23645f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayRead(A,&va));
23655f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArray(B,&vb));
2366a5ce6ee0Svictorle   if (lda1>m || lda2>m) {
23670dbb7854Svictorle     for (j=0; j<n; j++) {
23685f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscArraycpy(vb+j*lda2,va+j*lda1,m));
2369a5ce6ee0Svictorle     }
2370a5ce6ee0Svictorle   } else {
23715f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscArraycpy(vb,va,A->rmap->n*A->cmap->n));
2372a5ce6ee0Svictorle   }
23735f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArray(B,&vb));
23745f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayRead(A,&va));
23755f80ce2aSJacob Faibussowitsch   CHKERRQ(MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY));
23765f80ce2aSJacob Faibussowitsch   CHKERRQ(MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY));
2377273d9f13SBarry Smith   PetscFunctionReturn(0);
2378273d9f13SBarry Smith }
2379273d9f13SBarry Smith 
238075f6d85dSStefano Zampini PetscErrorCode MatSetUp_SeqDense(Mat A)
2381273d9f13SBarry Smith {
2382273d9f13SBarry Smith   PetscFunctionBegin;
23835f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLayoutSetUp(A->rmap));
23845f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLayoutSetUp(A->cmap));
238518992e5dSStefano Zampini   if (!A->preallocated) {
23865f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSeqDenseSetPreallocation(A,NULL));
238718992e5dSStefano Zampini   }
23883a40ed3dSBarry Smith   PetscFunctionReturn(0);
23894b0e389bSBarry Smith }
23904b0e389bSBarry Smith 
2391ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A)
2392ba337c44SJed Brown {
23934396437dSToby Isaac   Mat_SeqDense   *mat = (Mat_SeqDense *) A->data;
2394ba337c44SJed Brown   PetscInt       i,nz = A->rmap->n*A->cmap->n;
23954396437dSToby Isaac   PetscInt       min = PetscMin(A->rmap->n,A->cmap->n);
2396ca15aa20SStefano Zampini   PetscScalar    *aa;
2397ba337c44SJed Brown 
2398ba337c44SJed Brown   PetscFunctionBegin;
23995f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArray(A,&aa));
2400ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]);
24015f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArray(A,&aa));
24024396437dSToby Isaac   if (mat->tau) for (i = 0; i < min; i++) mat->tau[i] = PetscConj(mat->tau[i]);
2403ba337c44SJed Brown   PetscFunctionReturn(0);
2404ba337c44SJed Brown }
2405ba337c44SJed Brown 
2406ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A)
2407ba337c44SJed Brown {
2408ba337c44SJed Brown   PetscInt       i,nz = A->rmap->n*A->cmap->n;
2409ca15aa20SStefano Zampini   PetscScalar    *aa;
2410ba337c44SJed Brown 
2411ba337c44SJed Brown   PetscFunctionBegin;
24125f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArray(A,&aa));
2413ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]);
24145f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArray(A,&aa));
2415ba337c44SJed Brown   PetscFunctionReturn(0);
2416ba337c44SJed Brown }
2417ba337c44SJed Brown 
2418ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A)
2419ba337c44SJed Brown {
2420ba337c44SJed Brown   PetscInt       i,nz = A->rmap->n*A->cmap->n;
2421ca15aa20SStefano Zampini   PetscScalar    *aa;
2422ba337c44SJed Brown 
2423ba337c44SJed Brown   PetscFunctionBegin;
24245f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArray(A,&aa));
2425ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]);
24265f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArray(A,&aa));
2427ba337c44SJed Brown   PetscFunctionReturn(0);
2428ba337c44SJed Brown }
2429284134d9SBarry Smith 
2430a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/
24314222ddf1SHong Zhang PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat C)
2432a9fe9ddaSSatish Balay {
2433d0f46423SBarry Smith   PetscInt       m=A->rmap->n,n=B->cmap->n;
24347a3c3d58SStefano Zampini   PetscBool      cisdense;
2435a9fe9ddaSSatish Balay 
2436ee16a9a1SHong Zhang   PetscFunctionBegin;
24375f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetSizes(C,m,n,m,n));
24385f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectTypeCompareAny((PetscObject)C,&cisdense,MATSEQDENSE,MATSEQDENSECUDA,""));
24397a3c3d58SStefano Zampini   if (!cisdense) {
24407a3c3d58SStefano Zampini     PetscBool flg;
24417a3c3d58SStefano Zampini 
24425f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectTypeCompare((PetscObject)B,((PetscObject)A)->type_name,&flg));
24435f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSetType(C,flg ? ((PetscObject)A)->type_name : MATDENSE));
24447a3c3d58SStefano Zampini   }
24455f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetUp(C));
2446ee16a9a1SHong Zhang   PetscFunctionReturn(0);
2447ee16a9a1SHong Zhang }
2448a9fe9ddaSSatish Balay 
2449a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
2450a9fe9ddaSSatish Balay {
24516718818eSStefano Zampini   Mat_SeqDense       *a=(Mat_SeqDense*)A->data,*b=(Mat_SeqDense*)B->data,*c=(Mat_SeqDense*)C->data;
24520805154bSBarry Smith   PetscBLASInt       m,n,k;
2453ca15aa20SStefano Zampini   const PetscScalar *av,*bv;
2454ca15aa20SStefano Zampini   PetscScalar       *cv;
2455a9fe9ddaSSatish Balay   PetscScalar       _DOne=1.0,_DZero=0.0;
2456a9fe9ddaSSatish Balay 
2457a9fe9ddaSSatish Balay   PetscFunctionBegin;
24585f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(C->rmap->n,&m));
24595f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(C->cmap->n,&n));
24605f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(A->cmap->n,&k));
246149d0e964SStefano Zampini   if (!m || !n || !k) PetscFunctionReturn(0);
24625f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayRead(A,&av));
24635f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayRead(B,&bv));
24645f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayWrite(C,&cv));
2465ca15aa20SStefano Zampini   PetscStackCallBLAS("BLASgemm",BLASgemm_("N","N",&m,&n,&k,&_DOne,av,&a->lda,bv,&b->lda,&_DZero,cv,&c->lda));
24665f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogFlops(1.0*m*n*k + 1.0*m*n*(k-1)));
24675f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayRead(A,&av));
24685f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayRead(B,&bv));
24695f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayWrite(C,&cv));
2470a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
2471a9fe9ddaSSatish Balay }
2472a9fe9ddaSSatish Balay 
24734222ddf1SHong Zhang PetscErrorCode MatMatTransposeMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat C)
247469f65d41SStefano Zampini {
247569f65d41SStefano Zampini   PetscInt       m=A->rmap->n,n=B->rmap->n;
24767a3c3d58SStefano Zampini   PetscBool      cisdense;
247769f65d41SStefano Zampini 
247869f65d41SStefano Zampini   PetscFunctionBegin;
24795f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetSizes(C,m,n,m,n));
24805f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectTypeCompareAny((PetscObject)C,&cisdense,MATSEQDENSE,MATSEQDENSECUDA,""));
24817a3c3d58SStefano Zampini   if (!cisdense) {
24827a3c3d58SStefano Zampini     PetscBool flg;
24837a3c3d58SStefano Zampini 
24845f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectTypeCompare((PetscObject)B,((PetscObject)A)->type_name,&flg));
24855f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSetType(C,flg ? ((PetscObject)A)->type_name : MATDENSE));
24867a3c3d58SStefano Zampini   }
24875f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetUp(C));
248869f65d41SStefano Zampini   PetscFunctionReturn(0);
248969f65d41SStefano Zampini }
249069f65d41SStefano Zampini 
249169f65d41SStefano Zampini PetscErrorCode MatMatTransposeMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
249269f65d41SStefano Zampini {
249369f65d41SStefano Zampini   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
249469f65d41SStefano Zampini   Mat_SeqDense      *b = (Mat_SeqDense*)B->data;
249569f65d41SStefano Zampini   Mat_SeqDense      *c = (Mat_SeqDense*)C->data;
24966718818eSStefano Zampini   const PetscScalar *av,*bv;
24976718818eSStefano Zampini   PetscScalar       *cv;
249869f65d41SStefano Zampini   PetscBLASInt      m,n,k;
249969f65d41SStefano Zampini   PetscScalar       _DOne=1.0,_DZero=0.0;
250069f65d41SStefano Zampini 
250169f65d41SStefano Zampini   PetscFunctionBegin;
25025f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(C->rmap->n,&m));
25035f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(C->cmap->n,&n));
25045f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(A->cmap->n,&k));
250549d0e964SStefano Zampini   if (!m || !n || !k) PetscFunctionReturn(0);
25065f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayRead(A,&av));
25075f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayRead(B,&bv));
25085f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayWrite(C,&cv));
25096718818eSStefano Zampini   PetscStackCallBLAS("BLASgemm",BLASgemm_("N","T",&m,&n,&k,&_DOne,av,&a->lda,bv,&b->lda,&_DZero,cv,&c->lda));
25105f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayRead(A,&av));
25115f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayRead(B,&bv));
25125f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayWrite(C,&cv));
25135f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogFlops(1.0*m*n*k + 1.0*m*n*(k-1)));
251469f65d41SStefano Zampini   PetscFunctionReturn(0);
251569f65d41SStefano Zampini }
251669f65d41SStefano Zampini 
25174222ddf1SHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat C)
2518a9fe9ddaSSatish Balay {
2519d0f46423SBarry Smith   PetscInt       m=A->cmap->n,n=B->cmap->n;
25207a3c3d58SStefano Zampini   PetscBool      cisdense;
2521a9fe9ddaSSatish Balay 
2522ee16a9a1SHong Zhang   PetscFunctionBegin;
25235f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetSizes(C,m,n,m,n));
25245f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectTypeCompareAny((PetscObject)C,&cisdense,MATSEQDENSE,MATSEQDENSECUDA,""));
25257a3c3d58SStefano Zampini   if (!cisdense) {
25267a3c3d58SStefano Zampini     PetscBool flg;
25277a3c3d58SStefano Zampini 
25285f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectTypeCompare((PetscObject)B,((PetscObject)A)->type_name,&flg));
25295f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSetType(C,flg ? ((PetscObject)A)->type_name : MATDENSE));
25307a3c3d58SStefano Zampini   }
25315f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetUp(C));
2532ee16a9a1SHong Zhang   PetscFunctionReturn(0);
2533ee16a9a1SHong Zhang }
2534a9fe9ddaSSatish Balay 
253575648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
2536a9fe9ddaSSatish Balay {
2537a9fe9ddaSSatish Balay   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
2538a9fe9ddaSSatish Balay   Mat_SeqDense      *b = (Mat_SeqDense*)B->data;
2539a9fe9ddaSSatish Balay   Mat_SeqDense      *c = (Mat_SeqDense*)C->data;
25406718818eSStefano Zampini   const PetscScalar *av,*bv;
25416718818eSStefano Zampini   PetscScalar       *cv;
25420805154bSBarry Smith   PetscBLASInt      m,n,k;
2543a9fe9ddaSSatish Balay   PetscScalar       _DOne=1.0,_DZero=0.0;
2544a9fe9ddaSSatish Balay 
2545a9fe9ddaSSatish Balay   PetscFunctionBegin;
25465f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(C->rmap->n,&m));
25475f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(C->cmap->n,&n));
25485f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscBLASIntCast(A->rmap->n,&k));
254949d0e964SStefano Zampini   if (!m || !n || !k) PetscFunctionReturn(0);
25505f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayRead(A,&av));
25515f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayRead(B,&bv));
25525f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayWrite(C,&cv));
25536718818eSStefano Zampini   PetscStackCallBLAS("BLASgemm",BLASgemm_("T","N",&m,&n,&k,&_DOne,av,&a->lda,bv,&b->lda,&_DZero,cv,&c->lda));
25545f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayRead(A,&av));
25555f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayRead(B,&bv));
25565f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayWrite(C,&cv));
25575f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogFlops(1.0*m*n*k + 1.0*m*n*(k-1)));
2558a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
2559a9fe9ddaSSatish Balay }
2560985db425SBarry Smith 
25614222ddf1SHong Zhang /* ----------------------------------------------- */
25624222ddf1SHong Zhang static PetscErrorCode MatProductSetFromOptions_SeqDense_AB(Mat C)
25634222ddf1SHong Zhang {
25644222ddf1SHong Zhang   PetscFunctionBegin;
25654222ddf1SHong Zhang   C->ops->matmultsymbolic = MatMatMultSymbolic_SeqDense_SeqDense;
25664222ddf1SHong Zhang   C->ops->productsymbolic = MatProductSymbolic_AB;
25674222ddf1SHong Zhang   PetscFunctionReturn(0);
25684222ddf1SHong Zhang }
25694222ddf1SHong Zhang 
25704222ddf1SHong Zhang static PetscErrorCode MatProductSetFromOptions_SeqDense_AtB(Mat C)
25714222ddf1SHong Zhang {
25724222ddf1SHong Zhang   PetscFunctionBegin;
25734222ddf1SHong Zhang   C->ops->transposematmultsymbolic = MatTransposeMatMultSymbolic_SeqDense_SeqDense;
25744222ddf1SHong Zhang   C->ops->productsymbolic          = MatProductSymbolic_AtB;
25754222ddf1SHong Zhang   PetscFunctionReturn(0);
25764222ddf1SHong Zhang }
25774222ddf1SHong Zhang 
25784222ddf1SHong Zhang static PetscErrorCode MatProductSetFromOptions_SeqDense_ABt(Mat C)
25794222ddf1SHong Zhang {
25804222ddf1SHong Zhang   PetscFunctionBegin;
25814222ddf1SHong Zhang   C->ops->mattransposemultsymbolic = MatMatTransposeMultSymbolic_SeqDense_SeqDense;
25824222ddf1SHong Zhang   C->ops->productsymbolic          = MatProductSymbolic_ABt;
25834222ddf1SHong Zhang   PetscFunctionReturn(0);
25844222ddf1SHong Zhang }
25854222ddf1SHong Zhang 
25864222ddf1SHong Zhang PETSC_INTERN PetscErrorCode MatProductSetFromOptions_SeqDense(Mat C)
25874222ddf1SHong Zhang {
25884222ddf1SHong Zhang   Mat_Product    *product = C->product;
25894222ddf1SHong Zhang 
25904222ddf1SHong Zhang   PetscFunctionBegin;
25914222ddf1SHong Zhang   switch (product->type) {
25924222ddf1SHong Zhang   case MATPRODUCT_AB:
25935f80ce2aSJacob Faibussowitsch     CHKERRQ(MatProductSetFromOptions_SeqDense_AB(C));
25944222ddf1SHong Zhang     break;
25954222ddf1SHong Zhang   case MATPRODUCT_AtB:
25965f80ce2aSJacob Faibussowitsch     CHKERRQ(MatProductSetFromOptions_SeqDense_AtB(C));
25974222ddf1SHong Zhang     break;
25984222ddf1SHong Zhang   case MATPRODUCT_ABt:
25995f80ce2aSJacob Faibussowitsch     CHKERRQ(MatProductSetFromOptions_SeqDense_ABt(C));
26004222ddf1SHong Zhang     break;
26016718818eSStefano Zampini   default:
26024222ddf1SHong Zhang     break;
26034222ddf1SHong Zhang   }
26044222ddf1SHong Zhang   PetscFunctionReturn(0);
26054222ddf1SHong Zhang }
26064222ddf1SHong Zhang /* ----------------------------------------------- */
26074222ddf1SHong Zhang 
2608e0877f53SBarry Smith static PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[])
2609985db425SBarry Smith {
2610985db425SBarry Smith   Mat_SeqDense       *a = (Mat_SeqDense*)A->data;
2611d0f46423SBarry Smith   PetscInt           i,j,m = A->rmap->n,n = A->cmap->n,p;
2612985db425SBarry Smith   PetscScalar        *x;
2613ca15aa20SStefano Zampini   const PetscScalar *aa;
2614985db425SBarry Smith 
2615985db425SBarry Smith   PetscFunctionBegin;
2616*28b400f6SJacob Faibussowitsch   PetscCheck(!A->factortype,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
26175f80ce2aSJacob Faibussowitsch   CHKERRQ(VecGetArray(v,&x));
26185f80ce2aSJacob Faibussowitsch   CHKERRQ(VecGetLocalSize(v,&p));
26195f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayRead(A,&aa));
26202c71b3e2SJacob Faibussowitsch   PetscCheckFalse(p != A->rmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
2621985db425SBarry Smith   for (i=0; i<m; i++) {
2622985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
2623985db425SBarry Smith     for (j=1; j<n; j++) {
2624ca15aa20SStefano Zampini       if (PetscRealPart(x[i]) < PetscRealPart(aa[i+a->lda*j])) {x[i] = aa[i + a->lda*j]; if (idx) idx[i] = j;}
2625985db425SBarry Smith     }
2626985db425SBarry Smith   }
26275f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayRead(A,&aa));
26285f80ce2aSJacob Faibussowitsch   CHKERRQ(VecRestoreArray(v,&x));
2629985db425SBarry Smith   PetscFunctionReturn(0);
2630985db425SBarry Smith }
2631985db425SBarry Smith 
2632e0877f53SBarry Smith static PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[])
2633985db425SBarry Smith {
2634985db425SBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
2635d0f46423SBarry Smith   PetscInt          i,j,m = A->rmap->n,n = A->cmap->n,p;
2636985db425SBarry Smith   PetscScalar       *x;
2637985db425SBarry Smith   PetscReal         atmp;
2638ca15aa20SStefano Zampini   const PetscScalar *aa;
2639985db425SBarry Smith 
2640985db425SBarry Smith   PetscFunctionBegin;
2641*28b400f6SJacob Faibussowitsch   PetscCheck(!A->factortype,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
26425f80ce2aSJacob Faibussowitsch   CHKERRQ(VecGetArray(v,&x));
26435f80ce2aSJacob Faibussowitsch   CHKERRQ(VecGetLocalSize(v,&p));
26445f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayRead(A,&aa));
26452c71b3e2SJacob Faibussowitsch   PetscCheckFalse(p != A->rmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
2646985db425SBarry Smith   for (i=0; i<m; i++) {
26479189402eSHong Zhang     x[i] = PetscAbsScalar(aa[i]);
2648985db425SBarry Smith     for (j=1; j<n; j++) {
2649ca15aa20SStefano Zampini       atmp = PetscAbsScalar(aa[i+a->lda*j]);
2650985db425SBarry Smith       if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;}
2651985db425SBarry Smith     }
2652985db425SBarry Smith   }
26535f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayRead(A,&aa));
26545f80ce2aSJacob Faibussowitsch   CHKERRQ(VecRestoreArray(v,&x));
2655985db425SBarry Smith   PetscFunctionReturn(0);
2656985db425SBarry Smith }
2657985db425SBarry Smith 
2658e0877f53SBarry Smith static PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[])
2659985db425SBarry Smith {
2660985db425SBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
2661d0f46423SBarry Smith   PetscInt          i,j,m = A->rmap->n,n = A->cmap->n,p;
2662985db425SBarry Smith   PetscScalar       *x;
2663ca15aa20SStefano Zampini   const PetscScalar *aa;
2664985db425SBarry Smith 
2665985db425SBarry Smith   PetscFunctionBegin;
2666*28b400f6SJacob Faibussowitsch   PetscCheck(!A->factortype,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
26675f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayRead(A,&aa));
26685f80ce2aSJacob Faibussowitsch   CHKERRQ(VecGetArray(v,&x));
26695f80ce2aSJacob Faibussowitsch   CHKERRQ(VecGetLocalSize(v,&p));
26702c71b3e2SJacob Faibussowitsch   PetscCheckFalse(p != A->rmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
2671985db425SBarry Smith   for (i=0; i<m; i++) {
2672985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
2673985db425SBarry Smith     for (j=1; j<n; j++) {
2674ca15aa20SStefano Zampini       if (PetscRealPart(x[i]) > PetscRealPart(aa[i+a->lda*j])) {x[i] = aa[i + a->lda*j]; if (idx) idx[i] = j;}
2675985db425SBarry Smith     }
2676985db425SBarry Smith   }
26775f80ce2aSJacob Faibussowitsch   CHKERRQ(VecRestoreArray(v,&x));
26785f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayRead(A,&aa));
2679985db425SBarry Smith   PetscFunctionReturn(0);
2680985db425SBarry Smith }
2681985db425SBarry Smith 
2682637a0070SStefano Zampini PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col)
26838d0534beSBarry Smith {
26848d0534beSBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
26858d0534beSBarry Smith   PetscScalar       *x;
2686ca15aa20SStefano Zampini   const PetscScalar *aa;
26878d0534beSBarry Smith 
26888d0534beSBarry Smith   PetscFunctionBegin;
2689*28b400f6SJacob Faibussowitsch   PetscCheck(!A->factortype,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
26905f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayRead(A,&aa));
26915f80ce2aSJacob Faibussowitsch   CHKERRQ(VecGetArray(v,&x));
26925f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscArraycpy(x,aa+col*a->lda,A->rmap->n));
26935f80ce2aSJacob Faibussowitsch   CHKERRQ(VecRestoreArray(v,&x));
26945f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayRead(A,&aa));
26958d0534beSBarry Smith   PetscFunctionReturn(0);
26968d0534beSBarry Smith }
26978d0534beSBarry Smith 
2698857cbf51SRichard Tran Mills PETSC_INTERN PetscErrorCode MatGetColumnReductions_SeqDense(Mat A,PetscInt type,PetscReal *reductions)
26990716a85fSBarry Smith {
27000716a85fSBarry Smith   PetscInt          i,j,m,n;
27011683a169SBarry Smith   const PetscScalar *a;
27020716a85fSBarry Smith 
27030716a85fSBarry Smith   PetscFunctionBegin;
27045f80ce2aSJacob Faibussowitsch   CHKERRQ(MatGetSize(A,&m,&n));
27055f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscArrayzero(reductions,n));
27065f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayRead(A,&a));
2707857cbf51SRichard Tran Mills   if (type == NORM_2) {
27080716a85fSBarry Smith     for (i=0; i<n; i++) {
27090716a85fSBarry Smith       for (j=0; j<m; j++) {
2710a873a8cdSSam Reynolds         reductions[i] += PetscAbsScalar(a[j]*a[j]);
27110716a85fSBarry Smith       }
27120716a85fSBarry Smith       a += m;
27130716a85fSBarry Smith     }
2714857cbf51SRichard Tran Mills   } else if (type == NORM_1) {
27150716a85fSBarry Smith     for (i=0; i<n; i++) {
27160716a85fSBarry Smith       for (j=0; j<m; j++) {
2717a873a8cdSSam Reynolds         reductions[i] += PetscAbsScalar(a[j]);
27180716a85fSBarry Smith       }
27190716a85fSBarry Smith       a += m;
27200716a85fSBarry Smith     }
2721857cbf51SRichard Tran Mills   } else if (type == NORM_INFINITY) {
27220716a85fSBarry Smith     for (i=0; i<n; i++) {
27230716a85fSBarry Smith       for (j=0; j<m; j++) {
2724a873a8cdSSam Reynolds         reductions[i] = PetscMax(PetscAbsScalar(a[j]),reductions[i]);
27250716a85fSBarry Smith       }
27260716a85fSBarry Smith       a += m;
27270716a85fSBarry Smith     }
2728857cbf51SRichard Tran Mills   } else if (type == REDUCTION_SUM_REALPART || type == REDUCTION_MEAN_REALPART) {
2729a873a8cdSSam Reynolds     for (i=0; i<n; i++) {
2730a873a8cdSSam Reynolds       for (j=0; j<m; j++) {
2731857cbf51SRichard Tran Mills         reductions[i] += PetscRealPart(a[j]);
2732a873a8cdSSam Reynolds       }
2733a873a8cdSSam Reynolds       a += m;
2734a873a8cdSSam Reynolds     }
2735857cbf51SRichard Tran Mills   } else if (type == REDUCTION_SUM_IMAGINARYPART || type == REDUCTION_MEAN_IMAGINARYPART) {
2736857cbf51SRichard Tran Mills     for (i=0; i<n; i++) {
2737857cbf51SRichard Tran Mills       for (j=0; j<m; j++) {
2738857cbf51SRichard Tran Mills         reductions[i] += PetscImaginaryPart(a[j]);
2739857cbf51SRichard Tran Mills       }
2740857cbf51SRichard Tran Mills       a += m;
2741857cbf51SRichard Tran Mills     }
2742857cbf51SRichard Tran Mills   } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown reduction type");
27435f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayRead(A,&a));
2744857cbf51SRichard Tran Mills   if (type == NORM_2) {
2745a873a8cdSSam Reynolds     for (i=0; i<n; i++) reductions[i] = PetscSqrtReal(reductions[i]);
2746857cbf51SRichard Tran Mills   } else if (type == REDUCTION_MEAN_REALPART || type == REDUCTION_MEAN_IMAGINARYPART) {
2747a873a8cdSSam Reynolds     for (i=0; i<n; i++) reductions[i] /= m;
27480716a85fSBarry Smith   }
27490716a85fSBarry Smith   PetscFunctionReturn(0);
27500716a85fSBarry Smith }
27510716a85fSBarry Smith 
275273a71a0fSBarry Smith static PetscErrorCode  MatSetRandom_SeqDense(Mat x,PetscRandom rctx)
275373a71a0fSBarry Smith {
275473a71a0fSBarry Smith   PetscScalar    *a;
2755637a0070SStefano Zampini   PetscInt       lda,m,n,i,j;
275673a71a0fSBarry Smith 
275773a71a0fSBarry Smith   PetscFunctionBegin;
27585f80ce2aSJacob Faibussowitsch   CHKERRQ(MatGetSize(x,&m,&n));
27595f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetLDA(x,&lda));
27605f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArray(x,&a));
2761637a0070SStefano Zampini   for (j=0; j<n; j++) {
2762637a0070SStefano Zampini     for (i=0; i<m; i++) {
27635f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscRandomGetValue(rctx,a+j*lda+i));
2764637a0070SStefano Zampini     }
276573a71a0fSBarry Smith   }
27665f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArray(x,&a));
276773a71a0fSBarry Smith   PetscFunctionReturn(0);
276873a71a0fSBarry Smith }
276973a71a0fSBarry Smith 
27703b49f96aSBarry Smith static PetscErrorCode MatMissingDiagonal_SeqDense(Mat A,PetscBool  *missing,PetscInt *d)
27713b49f96aSBarry Smith {
27723b49f96aSBarry Smith   PetscFunctionBegin;
27733b49f96aSBarry Smith   *missing = PETSC_FALSE;
27743b49f96aSBarry Smith   PetscFunctionReturn(0);
27753b49f96aSBarry Smith }
277673a71a0fSBarry Smith 
2777ca15aa20SStefano Zampini /* vals is not const */
2778af53bab2SHong Zhang static PetscErrorCode MatDenseGetColumn_SeqDense(Mat A,PetscInt col,PetscScalar **vals)
277986aefd0dSHong Zhang {
278086aefd0dSHong Zhang   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
2781ca15aa20SStefano Zampini   PetscScalar    *v;
278286aefd0dSHong Zhang 
278386aefd0dSHong Zhang   PetscFunctionBegin;
2784*28b400f6SJacob Faibussowitsch   PetscCheck(!A->factortype,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
27855f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArray(A,&v));
2786ca15aa20SStefano Zampini   *vals = v+col*a->lda;
27875f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArray(A,&v));
278886aefd0dSHong Zhang   PetscFunctionReturn(0);
278986aefd0dSHong Zhang }
279086aefd0dSHong Zhang 
2791af53bab2SHong Zhang static PetscErrorCode MatDenseRestoreColumn_SeqDense(Mat A,PetscScalar **vals)
279286aefd0dSHong Zhang {
279386aefd0dSHong Zhang   PetscFunctionBegin;
2794a5b23f4aSJose E. Roman   *vals = NULL; /* user cannot accidentally use the array later */
279586aefd0dSHong Zhang   PetscFunctionReturn(0);
279686aefd0dSHong Zhang }
2797abc3b08eSStefano Zampini 
2798289bc588SBarry Smith /* -------------------------------------------------------------------*/
2799a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense,
2800905e6a2fSBarry Smith                                         MatGetRow_SeqDense,
2801905e6a2fSBarry Smith                                         MatRestoreRow_SeqDense,
2802905e6a2fSBarry Smith                                         MatMult_SeqDense,
280397304618SKris Buschelman                                 /*  4*/ MatMultAdd_SeqDense,
28047c922b88SBarry Smith                                         MatMultTranspose_SeqDense,
28057c922b88SBarry Smith                                         MatMultTransposeAdd_SeqDense,
2806f4259b30SLisandro Dalcin                                         NULL,
2807f4259b30SLisandro Dalcin                                         NULL,
2808f4259b30SLisandro Dalcin                                         NULL,
2809f4259b30SLisandro Dalcin                                 /* 10*/ NULL,
2810905e6a2fSBarry Smith                                         MatLUFactor_SeqDense,
2811905e6a2fSBarry Smith                                         MatCholeskyFactor_SeqDense,
281241f059aeSBarry Smith                                         MatSOR_SeqDense,
2813ec8511deSBarry Smith                                         MatTranspose_SeqDense,
281497304618SKris Buschelman                                 /* 15*/ MatGetInfo_SeqDense,
2815905e6a2fSBarry Smith                                         MatEqual_SeqDense,
2816905e6a2fSBarry Smith                                         MatGetDiagonal_SeqDense,
2817905e6a2fSBarry Smith                                         MatDiagonalScale_SeqDense,
2818905e6a2fSBarry Smith                                         MatNorm_SeqDense,
2819c0aa2d19SHong Zhang                                 /* 20*/ MatAssemblyBegin_SeqDense,
2820c0aa2d19SHong Zhang                                         MatAssemblyEnd_SeqDense,
2821905e6a2fSBarry Smith                                         MatSetOption_SeqDense,
2822905e6a2fSBarry Smith                                         MatZeroEntries_SeqDense,
2823d519adbfSMatthew Knepley                                 /* 24*/ MatZeroRows_SeqDense,
2824f4259b30SLisandro Dalcin                                         NULL,
2825f4259b30SLisandro Dalcin                                         NULL,
2826f4259b30SLisandro Dalcin                                         NULL,
2827f4259b30SLisandro Dalcin                                         NULL,
28284994cf47SJed Brown                                 /* 29*/ MatSetUp_SeqDense,
2829f4259b30SLisandro Dalcin                                         NULL,
2830f4259b30SLisandro Dalcin                                         NULL,
2831f4259b30SLisandro Dalcin                                         NULL,
2832f4259b30SLisandro Dalcin                                         NULL,
2833d519adbfSMatthew Knepley                                 /* 34*/ MatDuplicate_SeqDense,
2834f4259b30SLisandro Dalcin                                         NULL,
2835f4259b30SLisandro Dalcin                                         NULL,
2836f4259b30SLisandro Dalcin                                         NULL,
2837f4259b30SLisandro Dalcin                                         NULL,
2838d519adbfSMatthew Knepley                                 /* 39*/ MatAXPY_SeqDense,
28397dae84e0SHong Zhang                                         MatCreateSubMatrices_SeqDense,
2840f4259b30SLisandro Dalcin                                         NULL,
28414b0e389bSBarry Smith                                         MatGetValues_SeqDense,
2842a5ae1ecdSBarry Smith                                         MatCopy_SeqDense,
2843d519adbfSMatthew Knepley                                 /* 44*/ MatGetRowMax_SeqDense,
2844a5ae1ecdSBarry Smith                                         MatScale_SeqDense,
28457d68702bSBarry Smith                                         MatShift_Basic,
2846f4259b30SLisandro Dalcin                                         NULL,
28473f49a652SStefano Zampini                                         MatZeroRowsColumns_SeqDense,
284873a71a0fSBarry Smith                                 /* 49*/ MatSetRandom_SeqDense,
2849f4259b30SLisandro Dalcin                                         NULL,
2850f4259b30SLisandro Dalcin                                         NULL,
2851f4259b30SLisandro Dalcin                                         NULL,
2852f4259b30SLisandro Dalcin                                         NULL,
2853f4259b30SLisandro Dalcin                                 /* 54*/ NULL,
2854f4259b30SLisandro Dalcin                                         NULL,
2855f4259b30SLisandro Dalcin                                         NULL,
2856f4259b30SLisandro Dalcin                                         NULL,
2857f4259b30SLisandro Dalcin                                         NULL,
2858023c16fcSToby Isaac                                 /* 59*/ MatCreateSubMatrix_SeqDense,
2859e03a110bSBarry Smith                                         MatDestroy_SeqDense,
2860e03a110bSBarry Smith                                         MatView_SeqDense,
2861f4259b30SLisandro Dalcin                                         NULL,
2862f4259b30SLisandro Dalcin                                         NULL,
2863f4259b30SLisandro Dalcin                                 /* 64*/ NULL,
2864f4259b30SLisandro Dalcin                                         NULL,
2865f4259b30SLisandro Dalcin                                         NULL,
2866f4259b30SLisandro Dalcin                                         NULL,
2867f4259b30SLisandro Dalcin                                         NULL,
2868d519adbfSMatthew Knepley                                 /* 69*/ MatGetRowMaxAbs_SeqDense,
2869f4259b30SLisandro Dalcin                                         NULL,
2870f4259b30SLisandro Dalcin                                         NULL,
2871f4259b30SLisandro Dalcin                                         NULL,
2872f4259b30SLisandro Dalcin                                         NULL,
2873f4259b30SLisandro Dalcin                                 /* 74*/ NULL,
2874f4259b30SLisandro Dalcin                                         NULL,
2875f4259b30SLisandro Dalcin                                         NULL,
2876f4259b30SLisandro Dalcin                                         NULL,
2877f4259b30SLisandro Dalcin                                         NULL,
2878f4259b30SLisandro Dalcin                                 /* 79*/ NULL,
2879f4259b30SLisandro Dalcin                                         NULL,
2880f4259b30SLisandro Dalcin                                         NULL,
2881f4259b30SLisandro Dalcin                                         NULL,
28825bba2384SShri Abhyankar                                 /* 83*/ MatLoad_SeqDense,
2883637a0070SStefano Zampini                                         MatIsSymmetric_SeqDense,
28841cbb95d3SBarry Smith                                         MatIsHermitian_SeqDense,
2885f4259b30SLisandro Dalcin                                         NULL,
2886f4259b30SLisandro Dalcin                                         NULL,
2887f4259b30SLisandro Dalcin                                         NULL,
2888f4259b30SLisandro Dalcin                                 /* 89*/ NULL,
2889f4259b30SLisandro Dalcin                                         NULL,
2890a9fe9ddaSSatish Balay                                         MatMatMultNumeric_SeqDense_SeqDense,
2891f4259b30SLisandro Dalcin                                         NULL,
2892f4259b30SLisandro Dalcin                                         NULL,
2893f4259b30SLisandro Dalcin                                 /* 94*/ NULL,
2894f4259b30SLisandro Dalcin                                         NULL,
2895f4259b30SLisandro Dalcin                                         NULL,
289669f65d41SStefano Zampini                                         MatMatTransposeMultNumeric_SeqDense_SeqDense,
2897f4259b30SLisandro Dalcin                                         NULL,
28984222ddf1SHong Zhang                                 /* 99*/ MatProductSetFromOptions_SeqDense,
2899f4259b30SLisandro Dalcin                                         NULL,
2900f4259b30SLisandro Dalcin                                         NULL,
2901ba337c44SJed Brown                                         MatConjugate_SeqDense,
2902f4259b30SLisandro Dalcin                                         NULL,
2903f4259b30SLisandro Dalcin                                 /*104*/ NULL,
2904ba337c44SJed Brown                                         MatRealPart_SeqDense,
2905ba337c44SJed Brown                                         MatImaginaryPart_SeqDense,
2906f4259b30SLisandro Dalcin                                         NULL,
2907f4259b30SLisandro Dalcin                                         NULL,
2908f4259b30SLisandro Dalcin                                 /*109*/ NULL,
2909f4259b30SLisandro Dalcin                                         NULL,
29108d0534beSBarry Smith                                         MatGetRowMin_SeqDense,
2911aabbc4fbSShri Abhyankar                                         MatGetColumnVector_SeqDense,
29123b49f96aSBarry Smith                                         MatMissingDiagonal_SeqDense,
2913f4259b30SLisandro Dalcin                                 /*114*/ NULL,
2914f4259b30SLisandro Dalcin                                         NULL,
2915f4259b30SLisandro Dalcin                                         NULL,
2916f4259b30SLisandro Dalcin                                         NULL,
2917f4259b30SLisandro Dalcin                                         NULL,
2918f4259b30SLisandro Dalcin                                 /*119*/ NULL,
2919f4259b30SLisandro Dalcin                                         NULL,
2920f4259b30SLisandro Dalcin                                         NULL,
2921f4259b30SLisandro Dalcin                                         NULL,
2922f4259b30SLisandro Dalcin                                         NULL,
2923f4259b30SLisandro Dalcin                                 /*124*/ NULL,
2924a873a8cdSSam Reynolds                                         MatGetColumnReductions_SeqDense,
2925f4259b30SLisandro Dalcin                                         NULL,
2926f4259b30SLisandro Dalcin                                         NULL,
2927f4259b30SLisandro Dalcin                                         NULL,
2928f4259b30SLisandro Dalcin                                 /*129*/ NULL,
2929f4259b30SLisandro Dalcin                                         NULL,
2930f4259b30SLisandro Dalcin                                         NULL,
293175648e8dSHong Zhang                                         MatTransposeMatMultNumeric_SeqDense_SeqDense,
2932f4259b30SLisandro Dalcin                                         NULL,
2933f4259b30SLisandro Dalcin                                 /*134*/ NULL,
2934f4259b30SLisandro Dalcin                                         NULL,
2935f4259b30SLisandro Dalcin                                         NULL,
2936f4259b30SLisandro Dalcin                                         NULL,
2937f4259b30SLisandro Dalcin                                         NULL,
2938f4259b30SLisandro Dalcin                                 /*139*/ NULL,
2939f4259b30SLisandro Dalcin                                         NULL,
2940f4259b30SLisandro Dalcin                                         NULL,
2941f4259b30SLisandro Dalcin                                         NULL,
2942f4259b30SLisandro Dalcin                                         NULL,
29434222ddf1SHong Zhang                                         MatCreateMPIMatConcatenateSeqMat_SeqDense,
2944f4259b30SLisandro Dalcin                                 /*145*/ NULL,
2945f4259b30SLisandro Dalcin                                         NULL,
2946f4259b30SLisandro Dalcin                                         NULL
2947985db425SBarry Smith };
294890ace30eSBarry Smith 
29494b828684SBarry Smith /*@C
2950fafbff53SBarry Smith    MatCreateSeqDense - Creates a sequential dense matrix that
2951d65003e9SLois Curfman McInnes    is stored in column major order (the usual Fortran 77 manner). Many
2952d65003e9SLois Curfman McInnes    of the matrix operations use the BLAS and LAPACK routines.
2953289bc588SBarry Smith 
2954d083f849SBarry Smith    Collective
2955db81eaa0SLois Curfman McInnes 
295620563c6bSBarry Smith    Input Parameters:
2957db81eaa0SLois Curfman McInnes +  comm - MPI communicator, set to PETSC_COMM_SELF
29580c775827SLois Curfman McInnes .  m - number of rows
295918f449edSLois Curfman McInnes .  n - number of columns
29600298fd71SBarry Smith -  data - optional location of matrix data in column major order.  Set data=NULL for PETSc
2961dfc5480cSLois Curfman McInnes    to control all matrix memory allocation.
296220563c6bSBarry Smith 
296320563c6bSBarry Smith    Output Parameter:
296444cd7ae7SLois Curfman McInnes .  A - the matrix
296520563c6bSBarry Smith 
2966b259b22eSLois Curfman McInnes    Notes:
296718f449edSLois Curfman McInnes    The data input variable is intended primarily for Fortran programmers
296818f449edSLois Curfman McInnes    who wish to allocate their own matrix memory space.  Most users should
29690298fd71SBarry Smith    set data=NULL.
297018f449edSLois Curfman McInnes 
2971027ccd11SLois Curfman McInnes    Level: intermediate
2972027ccd11SLois Curfman McInnes 
297369b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues()
297420563c6bSBarry Smith @*/
29757087cfbeSBarry Smith PetscErrorCode  MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A)
2976289bc588SBarry Smith {
29773a40ed3dSBarry Smith   PetscFunctionBegin;
29785f80ce2aSJacob Faibussowitsch   CHKERRQ(MatCreate(comm,A));
29795f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetSizes(*A,m,n,m,n));
29805f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetType(*A,MATSEQDENSE));
29815f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSeqDenseSetPreallocation(*A,data));
2982273d9f13SBarry Smith   PetscFunctionReturn(0);
2983273d9f13SBarry Smith }
2984273d9f13SBarry Smith 
2985273d9f13SBarry Smith /*@C
2986273d9f13SBarry Smith    MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements
2987273d9f13SBarry Smith 
2988d083f849SBarry Smith    Collective
2989273d9f13SBarry Smith 
2990273d9f13SBarry Smith    Input Parameters:
29911c4f3114SJed Brown +  B - the matrix
29920298fd71SBarry Smith -  data - the array (or NULL)
2993273d9f13SBarry Smith 
2994273d9f13SBarry Smith    Notes:
2995273d9f13SBarry Smith    The data input variable is intended primarily for Fortran programmers
2996273d9f13SBarry Smith    who wish to allocate their own matrix memory space.  Most users should
2997284134d9SBarry Smith    need not call this routine.
2998273d9f13SBarry Smith 
2999273d9f13SBarry Smith    Level: intermediate
3000273d9f13SBarry Smith 
3001ad16ce7aSStefano Zampini .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatDenseSetLDA()
3002867c911aSBarry Smith 
3003273d9f13SBarry Smith @*/
30047087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation(Mat B,PetscScalar data[])
3005273d9f13SBarry Smith {
3006a23d5eceSKris Buschelman   PetscFunctionBegin;
3007d5ea218eSStefano Zampini   PetscValidHeaderSpecific(B,MAT_CLASSID,1);
30085f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data)));
3009a23d5eceSKris Buschelman   PetscFunctionReturn(0);
3010a23d5eceSKris Buschelman }
3011a23d5eceSKris Buschelman 
30127087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data)
3013a23d5eceSKris Buschelman {
3014ad16ce7aSStefano Zampini   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
3015273d9f13SBarry Smith 
3016273d9f13SBarry Smith   PetscFunctionBegin;
3017*28b400f6SJacob Faibussowitsch   PetscCheck(!b->matinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first");
3018273d9f13SBarry Smith   B->preallocated = PETSC_TRUE;
3019a868139aSShri Abhyankar 
30205f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLayoutSetUp(B->rmap));
30215f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLayoutSetUp(B->cmap));
302234ef9618SShri Abhyankar 
3023ad16ce7aSStefano Zampini   if (b->lda <= 0) b->lda = B->rmap->n;
302486d161a7SShri Abhyankar 
30259e8f95c4SLisandro Dalcin   if (!data) { /* petsc-allocated storage */
30265f80ce2aSJacob Faibussowitsch     if (!b->user_alloc) CHKERRQ(PetscFree(b->v));
30275f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscCalloc1((size_t)b->lda*B->cmap->n,&b->v));
30285f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscLogObjectMemory((PetscObject)B,b->lda*B->cmap->n*sizeof(PetscScalar)));
30292205254eSKarl Rupp 
30309e8f95c4SLisandro Dalcin     b->user_alloc = PETSC_FALSE;
3031273d9f13SBarry Smith   } else { /* user-allocated storage */
30325f80ce2aSJacob Faibussowitsch     if (!b->user_alloc) CHKERRQ(PetscFree(b->v));
3033273d9f13SBarry Smith     b->v          = data;
3034273d9f13SBarry Smith     b->user_alloc = PETSC_TRUE;
3035273d9f13SBarry Smith   }
30360450473dSBarry Smith   B->assembled = PETSC_TRUE;
3037273d9f13SBarry Smith   PetscFunctionReturn(0);
3038273d9f13SBarry Smith }
3039273d9f13SBarry Smith 
304065b80a83SHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
3041cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat)
30428baccfbdSHong Zhang {
3043d77f618aSHong Zhang   Mat               mat_elemental;
30441683a169SBarry Smith   const PetscScalar *array;
30451683a169SBarry Smith   PetscScalar       *v_colwise;
3046d77f618aSHong Zhang   PetscInt          M=A->rmap->N,N=A->cmap->N,i,j,k,*rows,*cols;
3047d77f618aSHong Zhang 
30488baccfbdSHong Zhang   PetscFunctionBegin;
30495f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMalloc3(M*N,&v_colwise,M,&rows,N,&cols));
30505f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayRead(A,&array));
3051d77f618aSHong Zhang   /* convert column-wise array into row-wise v_colwise, see MatSetValues_Elemental() */
3052d77f618aSHong Zhang   k = 0;
3053d77f618aSHong Zhang   for (j=0; j<N; j++) {
3054d77f618aSHong Zhang     cols[j] = j;
3055d77f618aSHong Zhang     for (i=0; i<M; i++) {
3056d77f618aSHong Zhang       v_colwise[j*M+i] = array[k++];
3057d77f618aSHong Zhang     }
3058d77f618aSHong Zhang   }
3059d77f618aSHong Zhang   for (i=0; i<M; i++) {
3060d77f618aSHong Zhang     rows[i] = i;
3061d77f618aSHong Zhang   }
30625f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayRead(A,&array));
3063d77f618aSHong Zhang 
30645f80ce2aSJacob Faibussowitsch   CHKERRQ(MatCreate(PetscObjectComm((PetscObject)A), &mat_elemental));
30655f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetSizes(mat_elemental,PETSC_DECIDE,PETSC_DECIDE,M,N));
30665f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetType(mat_elemental,MATELEMENTAL));
30675f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetUp(mat_elemental));
3068d77f618aSHong Zhang 
3069d77f618aSHong Zhang   /* PETSc-Elemental interaface uses axpy for setting off-processor entries, only ADD_VALUES is allowed */
30705f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetValues(mat_elemental,M,rows,N,cols,v_colwise,ADD_VALUES));
30715f80ce2aSJacob Faibussowitsch   CHKERRQ(MatAssemblyBegin(mat_elemental, MAT_FINAL_ASSEMBLY));
30725f80ce2aSJacob Faibussowitsch   CHKERRQ(MatAssemblyEnd(mat_elemental, MAT_FINAL_ASSEMBLY));
30735f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree3(v_colwise,rows,cols));
3074d77f618aSHong Zhang 
3075511c6705SHong Zhang   if (reuse == MAT_INPLACE_MATRIX) {
30765f80ce2aSJacob Faibussowitsch     CHKERRQ(MatHeaderReplace(A,&mat_elemental));
3077d77f618aSHong Zhang   } else {
3078d77f618aSHong Zhang     *newmat = mat_elemental;
3079d77f618aSHong Zhang   }
30808baccfbdSHong Zhang   PetscFunctionReturn(0);
30818baccfbdSHong Zhang }
308265b80a83SHong Zhang #endif
30838baccfbdSHong Zhang 
308417359960SJose E. Roman PetscErrorCode  MatDenseSetLDA_SeqDense(Mat B,PetscInt lda)
30851b807ce4Svictorle {
30861b807ce4Svictorle   Mat_SeqDense *b = (Mat_SeqDense*)B->data;
30877422da62SJose E. Roman   PetscBool    data;
308821a2c019SBarry Smith 
30891b807ce4Svictorle   PetscFunctionBegin;
30907422da62SJose E. Roman   data = (PetscBool)((B->rmap->n > 0 && B->cmap->n > 0) ? (b->v ? PETSC_TRUE : PETSC_FALSE) : PETSC_FALSE);
30912c71b3e2SJacob Faibussowitsch   PetscCheckFalse(!b->user_alloc && data && b->lda!=lda,PETSC_COMM_SELF,PETSC_ERR_ORDER,"LDA cannot be changed after allocation of internal storage");
30922c71b3e2SJacob Faibussowitsch   PetscCheckFalse(lda < B->rmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"LDA %" PetscInt_FMT " must be at least matrix dimension %" PetscInt_FMT,lda,B->rmap->n);
30931b807ce4Svictorle   b->lda = lda;
30941b807ce4Svictorle   PetscFunctionReturn(0);
30951b807ce4Svictorle }
30961b807ce4Svictorle 
3097d528f656SJakub Kruzik PetscErrorCode MatCreateMPIMatConcatenateSeqMat_SeqDense(MPI_Comm comm,Mat inmat,PetscInt n,MatReuse scall,Mat *outmat)
3098d528f656SJakub Kruzik {
3099d528f656SJakub Kruzik   PetscMPIInt    size;
3100d528f656SJakub Kruzik 
3101d528f656SJakub Kruzik   PetscFunctionBegin;
31025f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_size(comm,&size));
3103d528f656SJakub Kruzik   if (size == 1) {
3104d528f656SJakub Kruzik     if (scall == MAT_INITIAL_MATRIX) {
31055f80ce2aSJacob Faibussowitsch       CHKERRQ(MatDuplicate(inmat,MAT_COPY_VALUES,outmat));
3106d528f656SJakub Kruzik     } else {
31075f80ce2aSJacob Faibussowitsch       CHKERRQ(MatCopy(inmat,*outmat,SAME_NONZERO_PATTERN));
3108d528f656SJakub Kruzik     }
3109d528f656SJakub Kruzik   } else {
31105f80ce2aSJacob Faibussowitsch     CHKERRQ(MatCreateMPIMatConcatenateSeqMat_MPIDense(comm,inmat,n,scall,outmat));
3111d528f656SJakub Kruzik   }
3112d528f656SJakub Kruzik   PetscFunctionReturn(0);
3113d528f656SJakub Kruzik }
3114d528f656SJakub Kruzik 
31156947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVec_SeqDense(Mat A,PetscInt col,Vec *v)
31166947451fSStefano Zampini {
31176947451fSStefano Zampini   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
31186947451fSStefano Zampini 
31196947451fSStefano Zampini   PetscFunctionBegin;
3120*28b400f6SJacob Faibussowitsch   PetscCheck(!a->vecinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first");
3121*28b400f6SJacob Faibussowitsch   PetscCheck(!a->matinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first");
31226947451fSStefano Zampini   if (!a->cvec) {
31235f80ce2aSJacob Faibussowitsch     CHKERRQ(VecCreateSeqWithArray(PetscObjectComm((PetscObject)A),A->rmap->bs,A->rmap->n,NULL,&a->cvec));
31245f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscLogObjectParent((PetscObject)A,(PetscObject)a->cvec));
31256947451fSStefano Zampini   }
31266947451fSStefano Zampini   a->vecinuse = col + 1;
31275f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArray(A,(PetscScalar**)&a->ptrinuse));
31285f80ce2aSJacob Faibussowitsch   CHKERRQ(VecPlaceArray(a->cvec,a->ptrinuse + (size_t)col * (size_t)a->lda));
31296947451fSStefano Zampini   *v   = a->cvec;
31306947451fSStefano Zampini   PetscFunctionReturn(0);
31316947451fSStefano Zampini }
31326947451fSStefano Zampini 
31336947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVec_SeqDense(Mat A,PetscInt col,Vec *v)
31346947451fSStefano Zampini {
31356947451fSStefano Zampini   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
31366947451fSStefano Zampini 
31376947451fSStefano Zampini   PetscFunctionBegin;
3138*28b400f6SJacob Faibussowitsch   PetscCheck(a->vecinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseGetColumnVec() first");
3139*28b400f6SJacob Faibussowitsch   PetscCheck(a->cvec,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing internal column vector");
31406947451fSStefano Zampini   a->vecinuse = 0;
31415f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArray(A,(PetscScalar**)&a->ptrinuse));
31425f80ce2aSJacob Faibussowitsch   CHKERRQ(VecResetArray(a->cvec));
314375f6d85dSStefano Zampini   if (v) *v = NULL;
31446947451fSStefano Zampini   PetscFunctionReturn(0);
31456947451fSStefano Zampini }
31466947451fSStefano Zampini 
31476947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVecRead_SeqDense(Mat A,PetscInt col,Vec *v)
31486947451fSStefano Zampini {
31496947451fSStefano Zampini   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
31506947451fSStefano Zampini 
31516947451fSStefano Zampini   PetscFunctionBegin;
3152*28b400f6SJacob Faibussowitsch   PetscCheck(!a->vecinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first");
3153*28b400f6SJacob Faibussowitsch   PetscCheck(!a->matinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first");
31546947451fSStefano Zampini   if (!a->cvec) {
31555f80ce2aSJacob Faibussowitsch     CHKERRQ(VecCreateSeqWithArray(PetscObjectComm((PetscObject)A),A->rmap->bs,A->rmap->n,NULL,&a->cvec));
31565f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscLogObjectParent((PetscObject)A,(PetscObject)a->cvec));
31576947451fSStefano Zampini   }
31586947451fSStefano Zampini   a->vecinuse = col + 1;
31595f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayRead(A,&a->ptrinuse));
31605f80ce2aSJacob Faibussowitsch   CHKERRQ(VecPlaceArray(a->cvec,a->ptrinuse + (size_t)col * (size_t)a->lda));
31615f80ce2aSJacob Faibussowitsch   CHKERRQ(VecLockReadPush(a->cvec));
31626947451fSStefano Zampini   *v   = a->cvec;
31636947451fSStefano Zampini   PetscFunctionReturn(0);
31646947451fSStefano Zampini }
31656947451fSStefano Zampini 
31666947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVecRead_SeqDense(Mat A,PetscInt col,Vec *v)
31676947451fSStefano Zampini {
31686947451fSStefano Zampini   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
31696947451fSStefano Zampini 
31706947451fSStefano Zampini   PetscFunctionBegin;
3171*28b400f6SJacob Faibussowitsch   PetscCheck(a->vecinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseGetColumnVec() first");
3172*28b400f6SJacob Faibussowitsch   PetscCheck(a->cvec,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing internal column vector");
31736947451fSStefano Zampini   a->vecinuse = 0;
31745f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayRead(A,&a->ptrinuse));
31755f80ce2aSJacob Faibussowitsch   CHKERRQ(VecLockReadPop(a->cvec));
31765f80ce2aSJacob Faibussowitsch   CHKERRQ(VecResetArray(a->cvec));
317775f6d85dSStefano Zampini   if (v) *v = NULL;
31786947451fSStefano Zampini   PetscFunctionReturn(0);
31796947451fSStefano Zampini }
31806947451fSStefano Zampini 
31816947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVecWrite_SeqDense(Mat A,PetscInt col,Vec *v)
31826947451fSStefano Zampini {
31836947451fSStefano Zampini   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
31846947451fSStefano Zampini 
31856947451fSStefano Zampini   PetscFunctionBegin;
3186*28b400f6SJacob Faibussowitsch   PetscCheck(!a->vecinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first");
3187*28b400f6SJacob Faibussowitsch   PetscCheck(!a->matinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first");
31886947451fSStefano Zampini   if (!a->cvec) {
31895f80ce2aSJacob Faibussowitsch     CHKERRQ(VecCreateSeqWithArray(PetscObjectComm((PetscObject)A),A->rmap->bs,A->rmap->n,NULL,&a->cvec));
31905f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscLogObjectParent((PetscObject)A,(PetscObject)a->cvec));
31916947451fSStefano Zampini   }
31926947451fSStefano Zampini   a->vecinuse = col + 1;
31935f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseGetArrayWrite(A,(PetscScalar**)&a->ptrinuse));
31945f80ce2aSJacob Faibussowitsch   CHKERRQ(VecPlaceArray(a->cvec,a->ptrinuse + (size_t)col * (size_t)a->lda));
31956947451fSStefano Zampini   *v   = a->cvec;
31966947451fSStefano Zampini   PetscFunctionReturn(0);
31976947451fSStefano Zampini }
31986947451fSStefano Zampini 
31996947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVecWrite_SeqDense(Mat A,PetscInt col,Vec *v)
32006947451fSStefano Zampini {
32016947451fSStefano Zampini   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
32026947451fSStefano Zampini 
32036947451fSStefano Zampini   PetscFunctionBegin;
3204*28b400f6SJacob Faibussowitsch   PetscCheck(a->vecinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseGetColumnVec() first");
3205*28b400f6SJacob Faibussowitsch   PetscCheck(a->cvec,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing internal column vector");
32066947451fSStefano Zampini   a->vecinuse = 0;
32075f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseRestoreArrayWrite(A,(PetscScalar**)&a->ptrinuse));
32085f80ce2aSJacob Faibussowitsch   CHKERRQ(VecResetArray(a->cvec));
320975f6d85dSStefano Zampini   if (v) *v = NULL;
32106947451fSStefano Zampini   PetscFunctionReturn(0);
32116947451fSStefano Zampini }
32126947451fSStefano Zampini 
32135ea7661aSPierre Jolivet PetscErrorCode MatDenseGetSubMatrix_SeqDense(Mat A,PetscInt cbegin,PetscInt cend,Mat *v)
32145ea7661aSPierre Jolivet {
32155ea7661aSPierre Jolivet   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
32165ea7661aSPierre Jolivet 
32175ea7661aSPierre Jolivet   PetscFunctionBegin;
3218*28b400f6SJacob Faibussowitsch   PetscCheck(!a->vecinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first");
3219*28b400f6SJacob Faibussowitsch   PetscCheck(!a->matinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first");
32205ea7661aSPierre Jolivet   if (a->cmat && cend-cbegin != a->cmat->cmap->N) {
32215f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDestroy(&a->cmat));
32225ea7661aSPierre Jolivet   }
32235ea7661aSPierre Jolivet   if (!a->cmat) {
32245f80ce2aSJacob Faibussowitsch     CHKERRQ(MatCreateDense(PetscObjectComm((PetscObject)A),A->rmap->n,PETSC_DECIDE,A->rmap->N,cend-cbegin,a->v+(size_t)cbegin*a->lda,&a->cmat));
32255f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscLogObjectParent((PetscObject)A,(PetscObject)a->cmat));
32265ea7661aSPierre Jolivet   } else {
32275f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDensePlaceArray(a->cmat,a->v+(size_t)cbegin*a->lda));
32285ea7661aSPierre Jolivet   }
32295f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseSetLDA(a->cmat,a->lda));
32305ea7661aSPierre Jolivet   a->matinuse = cbegin + 1;
32315ea7661aSPierre Jolivet   *v = a->cmat;
323275f6d85dSStefano Zampini #if defined(PETSC_HAVE_CUDA)
323375f6d85dSStefano Zampini   A->offloadmask = PETSC_OFFLOAD_CPU;
323475f6d85dSStefano Zampini #endif
32355ea7661aSPierre Jolivet   PetscFunctionReturn(0);
32365ea7661aSPierre Jolivet }
32375ea7661aSPierre Jolivet 
32385ea7661aSPierre Jolivet PetscErrorCode MatDenseRestoreSubMatrix_SeqDense(Mat A,Mat *v)
32395ea7661aSPierre Jolivet {
32405ea7661aSPierre Jolivet   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
32415ea7661aSPierre Jolivet 
32425ea7661aSPierre Jolivet   PetscFunctionBegin;
3243*28b400f6SJacob Faibussowitsch   PetscCheck(a->matinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseGetSubMatrix() first");
3244*28b400f6SJacob Faibussowitsch   PetscCheck(a->cmat,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing internal column matrix");
32452c71b3e2SJacob Faibussowitsch   PetscCheckFalse(*v != a->cmat,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not the matrix obtained from MatDenseGetSubMatrix()");
32465ea7661aSPierre Jolivet   a->matinuse = 0;
32475f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDenseResetArray(a->cmat));
32485ea7661aSPierre Jolivet   *v   = NULL;
32495ea7661aSPierre Jolivet   PetscFunctionReturn(0);
32505ea7661aSPierre Jolivet }
32515ea7661aSPierre Jolivet 
32520bad9183SKris Buschelman /*MC
3253fafad747SKris Buschelman    MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices.
32540bad9183SKris Buschelman 
32550bad9183SKris Buschelman    Options Database Keys:
32560bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions()
32570bad9183SKris Buschelman 
32580bad9183SKris Buschelman   Level: beginner
32590bad9183SKris Buschelman 
326089665df3SBarry Smith .seealso: MatCreateSeqDense()
326189665df3SBarry Smith 
32620bad9183SKris Buschelman M*/
3263ca15aa20SStefano Zampini PetscErrorCode MatCreate_SeqDense(Mat B)
3264273d9f13SBarry Smith {
3265273d9f13SBarry Smith   Mat_SeqDense   *b;
32667c334f02SBarry Smith   PetscMPIInt    size;
3267273d9f13SBarry Smith 
3268273d9f13SBarry Smith   PetscFunctionBegin;
32695f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_size(PetscObjectComm((PetscObject)B),&size));
32702c71b3e2SJacob Faibussowitsch   PetscCheckFalse(size > 1,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1");
327155659b69SBarry Smith 
32725f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscNewLog(B,&b));
32735f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps)));
327444cd7ae7SLois Curfman McInnes   B->data = (void*)b;
327518f449edSLois Curfman McInnes 
3276273d9f13SBarry Smith   b->roworiented = PETSC_TRUE;
32774e220ebcSLois Curfman McInnes 
32785f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatQRFactor_C",MatQRFactor_SeqDense));
32795f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatDenseGetLDA_C",MatDenseGetLDA_SeqDense));
32805f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatDenseSetLDA_C",MatDenseSetLDA_SeqDense));
32815f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense));
32825f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense));
32835f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatDensePlaceArray_C",MatDensePlaceArray_SeqDense));
32845f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatDenseResetArray_C",MatDenseResetArray_SeqDense));
32855f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatDenseReplaceArray_C",MatDenseReplaceArray_SeqDense));
32865f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArrayRead_C",MatDenseGetArray_SeqDense));
32875f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArrayRead_C",MatDenseRestoreArray_SeqDense));
32885f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArrayWrite_C",MatDenseGetArray_SeqDense));
32895f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArrayWrite_C",MatDenseRestoreArray_SeqDense));
32905f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ));
32918baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
32925f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental));
32938baccfbdSHong Zhang #endif
3294d24d4204SJose E. Roman #if defined(PETSC_HAVE_SCALAPACK)
32955f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_scalapack_C",MatConvert_Dense_ScaLAPACK));
3296d24d4204SJose E. Roman #endif
32972bf066beSStefano Zampini #if defined(PETSC_HAVE_CUDA)
32985f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqdensecuda_C",MatConvert_SeqDense_SeqDenseCUDA));
32995f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqdensecuda_seqdensecuda_C",MatProductSetFromOptions_SeqDense));
33005f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqdensecuda_seqdense_C",MatProductSetFromOptions_SeqDense));
33015f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqdense_seqdensecuda_C",MatProductSetFromOptions_SeqDense));
33022bf066beSStefano Zampini #endif
33035f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense));
33045f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqaij_seqdense_C",MatProductSetFromOptions_SeqAIJ_SeqDense));
33055f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqdense_seqdense_C",MatProductSetFromOptions_SeqDense));
33065f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqbaij_seqdense_C",MatProductSetFromOptions_SeqXBAIJ_SeqDense));
33075f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqsbaij_seqdense_C",MatProductSetFromOptions_SeqXBAIJ_SeqDense));
330896e6d5c4SRichard Tran Mills 
33095f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumn_C",MatDenseGetColumn_SeqDense));
33105f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumn_C",MatDenseRestoreColumn_SeqDense));
33115f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumnVec_C",MatDenseGetColumnVec_SeqDense));
33125f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumnVec_C",MatDenseRestoreColumnVec_SeqDense));
33135f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumnVecRead_C",MatDenseGetColumnVecRead_SeqDense));
33145f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumnVecRead_C",MatDenseRestoreColumnVecRead_SeqDense));
33155f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumnVecWrite_C",MatDenseGetColumnVecWrite_SeqDense));
33165f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumnVecWrite_C",MatDenseRestoreColumnVecWrite_SeqDense));
33175f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatDenseGetSubMatrix_C",MatDenseGetSubMatrix_SeqDense));
33185f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreSubMatrix_C",MatDenseRestoreSubMatrix_SeqDense));
33195f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE));
33203a40ed3dSBarry Smith   PetscFunctionReturn(0);
3321289bc588SBarry Smith }
332286aefd0dSHong Zhang 
332386aefd0dSHong Zhang /*@C
3324af53bab2SHong 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.
332586aefd0dSHong Zhang 
332686aefd0dSHong Zhang    Not Collective
332786aefd0dSHong Zhang 
33285ea7661aSPierre Jolivet    Input Parameters:
332986aefd0dSHong Zhang +  mat - a MATSEQDENSE or MATMPIDENSE matrix
333086aefd0dSHong Zhang -  col - column index
333186aefd0dSHong Zhang 
333286aefd0dSHong Zhang    Output Parameter:
333386aefd0dSHong Zhang .  vals - pointer to the data
333486aefd0dSHong Zhang 
333586aefd0dSHong Zhang    Level: intermediate
333686aefd0dSHong Zhang 
333786aefd0dSHong Zhang .seealso: MatDenseRestoreColumn()
333886aefd0dSHong Zhang @*/
333986aefd0dSHong Zhang PetscErrorCode MatDenseGetColumn(Mat A,PetscInt col,PetscScalar **vals)
334086aefd0dSHong Zhang {
334186aefd0dSHong Zhang   PetscFunctionBegin;
3342d5ea218eSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
3343d5ea218eSStefano Zampini   PetscValidLogicalCollectiveInt(A,col,2);
3344d5ea218eSStefano Zampini   PetscValidPointer(vals,3);
33455f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscUseMethod(A,"MatDenseGetColumn_C",(Mat,PetscInt,PetscScalar**),(A,col,vals)));
334686aefd0dSHong Zhang   PetscFunctionReturn(0);
334786aefd0dSHong Zhang }
334886aefd0dSHong Zhang 
334986aefd0dSHong Zhang /*@C
335086aefd0dSHong Zhang    MatDenseRestoreColumn - returns access to a column of a dense matrix which is returned by MatDenseGetColumn().
335186aefd0dSHong Zhang 
335286aefd0dSHong Zhang    Not Collective
335386aefd0dSHong Zhang 
335486aefd0dSHong Zhang    Input Parameter:
335586aefd0dSHong Zhang .  mat - a MATSEQDENSE or MATMPIDENSE matrix
335686aefd0dSHong Zhang 
335786aefd0dSHong Zhang    Output Parameter:
335886aefd0dSHong Zhang .  vals - pointer to the data
335986aefd0dSHong Zhang 
336086aefd0dSHong Zhang    Level: intermediate
336186aefd0dSHong Zhang 
336286aefd0dSHong Zhang .seealso: MatDenseGetColumn()
336386aefd0dSHong Zhang @*/
336486aefd0dSHong Zhang PetscErrorCode MatDenseRestoreColumn(Mat A,PetscScalar **vals)
336586aefd0dSHong Zhang {
336686aefd0dSHong Zhang   PetscFunctionBegin;
3367d5ea218eSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
3368d5ea218eSStefano Zampini   PetscValidPointer(vals,2);
33695f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscUseMethod(A,"MatDenseRestoreColumn_C",(Mat,PetscScalar**),(A,vals)));
337086aefd0dSHong Zhang   PetscFunctionReturn(0);
337186aefd0dSHong Zhang }
33726947451fSStefano Zampini 
33730f74d2c1SSatish Balay /*@
33746947451fSStefano Zampini    MatDenseGetColumnVec - Gives read-write access to a column of a dense matrix, represented as a Vec.
33756947451fSStefano Zampini 
33766947451fSStefano Zampini    Collective
33776947451fSStefano Zampini 
33785ea7661aSPierre Jolivet    Input Parameters:
33796947451fSStefano Zampini +  mat - the Mat object
33806947451fSStefano Zampini -  col - the column index
33816947451fSStefano Zampini 
33826947451fSStefano Zampini    Output Parameter:
33836947451fSStefano Zampini .  v - the vector
33846947451fSStefano Zampini 
33856947451fSStefano Zampini    Notes:
33866947451fSStefano Zampini      The vector is owned by PETSc. Users need to call MatDenseRestoreColumnVec() when the vector is no longer needed.
33876947451fSStefano Zampini      Use MatDenseGetColumnVecRead() to obtain read-only access or MatDenseGetColumnVecWrite() for write-only access.
33886947451fSStefano Zampini 
33896947451fSStefano Zampini    Level: intermediate
33906947451fSStefano Zampini 
33916947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVecRead(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecRead(), MatDenseRestoreColumnVecWrite()
33926947451fSStefano Zampini @*/
33936947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVec(Mat A,PetscInt col,Vec *v)
33946947451fSStefano Zampini {
33956947451fSStefano Zampini   PetscFunctionBegin;
33966947451fSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
33976947451fSStefano Zampini   PetscValidType(A,1);
33986947451fSStefano Zampini   PetscValidLogicalCollectiveInt(A,col,2);
33996947451fSStefano Zampini   PetscValidPointer(v,3);
3400*28b400f6SJacob Faibussowitsch   PetscCheck(A->preallocated,PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated");
34012c71b3e2SJacob Faibussowitsch   PetscCheckFalse(col < 0 || col > A->cmap->N,PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid col %" PetscInt_FMT ", should be in [0,%" PetscInt_FMT ")",col,A->cmap->N);
34025f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscUseMethod(A,"MatDenseGetColumnVec_C",(Mat,PetscInt,Vec*),(A,col,v)));
34036947451fSStefano Zampini   PetscFunctionReturn(0);
34046947451fSStefano Zampini }
34056947451fSStefano Zampini 
34060f74d2c1SSatish Balay /*@
34076947451fSStefano Zampini    MatDenseRestoreColumnVec - Returns access to a column of a dense matrix obtained from MatDenseGetColumnVec().
34086947451fSStefano Zampini 
34096947451fSStefano Zampini    Collective
34106947451fSStefano Zampini 
34115ea7661aSPierre Jolivet    Input Parameters:
34126947451fSStefano Zampini +  mat - the Mat object
34136947451fSStefano Zampini .  col - the column index
34146947451fSStefano Zampini -  v - the Vec object
34156947451fSStefano Zampini 
34166947451fSStefano Zampini    Level: intermediate
34176947451fSStefano Zampini 
34186947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecRead(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVecRead(), MatDenseRestoreColumnVecWrite()
34196947451fSStefano Zampini @*/
34206947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVec(Mat A,PetscInt col,Vec *v)
34216947451fSStefano Zampini {
34226947451fSStefano Zampini   PetscFunctionBegin;
34236947451fSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
34246947451fSStefano Zampini   PetscValidType(A,1);
34256947451fSStefano Zampini   PetscValidLogicalCollectiveInt(A,col,2);
34262c71b3e2SJacob Faibussowitsch   PetscCheckFalse(!A->preallocated,PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated");
34272c71b3e2SJacob Faibussowitsch   PetscCheckFalse(col < 0 || col > A->cmap->N,PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid col %" PetscInt_FMT ", should be in [0,%" PetscInt_FMT ")",col,A->cmap->N);
34285f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscUseMethod(A,"MatDenseRestoreColumnVec_C",(Mat,PetscInt,Vec*),(A,col,v)));
34296947451fSStefano Zampini   PetscFunctionReturn(0);
34306947451fSStefano Zampini }
34316947451fSStefano Zampini 
34320f74d2c1SSatish Balay /*@
34336947451fSStefano Zampini    MatDenseGetColumnVecRead - Gives read-only access to a column of a dense matrix, represented as a Vec.
34346947451fSStefano Zampini 
34356947451fSStefano Zampini    Collective
34366947451fSStefano Zampini 
34375ea7661aSPierre Jolivet    Input Parameters:
34386947451fSStefano Zampini +  mat - the Mat object
34396947451fSStefano Zampini -  col - the column index
34406947451fSStefano Zampini 
34416947451fSStefano Zampini    Output Parameter:
34426947451fSStefano Zampini .  v - the vector
34436947451fSStefano Zampini 
34446947451fSStefano Zampini    Notes:
34456947451fSStefano Zampini      The vector is owned by PETSc and users cannot modify it.
34466947451fSStefano Zampini      Users need to call MatDenseRestoreColumnVecRead() when the vector is no longer needed.
34476947451fSStefano Zampini      Use MatDenseGetColumnVec() to obtain read-write access or MatDenseGetColumnVecWrite() for write-only access.
34486947451fSStefano Zampini 
34496947451fSStefano Zampini    Level: intermediate
34506947451fSStefano Zampini 
34516947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecRead(), MatDenseRestoreColumnVecWrite()
34526947451fSStefano Zampini @*/
34536947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVecRead(Mat A,PetscInt col,Vec *v)
34546947451fSStefano Zampini {
34556947451fSStefano Zampini   PetscFunctionBegin;
34566947451fSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
34576947451fSStefano Zampini   PetscValidType(A,1);
34586947451fSStefano Zampini   PetscValidLogicalCollectiveInt(A,col,2);
34596947451fSStefano Zampini   PetscValidPointer(v,3);
3460*28b400f6SJacob Faibussowitsch   PetscCheck(A->preallocated,PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated");
34612c71b3e2SJacob Faibussowitsch   PetscCheckFalse(col < 0 || col > A->cmap->N,PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid col %" PetscInt_FMT ", should be in [0,%" PetscInt_FMT ")",col,A->cmap->N);
34625f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscUseMethod(A,"MatDenseGetColumnVecRead_C",(Mat,PetscInt,Vec*),(A,col,v)));
34636947451fSStefano Zampini   PetscFunctionReturn(0);
34646947451fSStefano Zampini }
34656947451fSStefano Zampini 
34660f74d2c1SSatish Balay /*@
34676947451fSStefano Zampini    MatDenseRestoreColumnVecRead - Returns access to a column of a dense matrix obtained from MatDenseGetColumnVecRead().
34686947451fSStefano Zampini 
34696947451fSStefano Zampini    Collective
34706947451fSStefano Zampini 
34715ea7661aSPierre Jolivet    Input Parameters:
34726947451fSStefano Zampini +  mat - the Mat object
34736947451fSStefano Zampini .  col - the column index
34746947451fSStefano Zampini -  v - the Vec object
34756947451fSStefano Zampini 
34766947451fSStefano Zampini    Level: intermediate
34776947451fSStefano Zampini 
34786947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecRead(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecWrite()
34796947451fSStefano Zampini @*/
34806947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVecRead(Mat A,PetscInt col,Vec *v)
34816947451fSStefano Zampini {
34826947451fSStefano Zampini   PetscFunctionBegin;
34836947451fSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
34846947451fSStefano Zampini   PetscValidType(A,1);
34856947451fSStefano Zampini   PetscValidLogicalCollectiveInt(A,col,2);
34862c71b3e2SJacob Faibussowitsch   PetscCheckFalse(!A->preallocated,PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated");
34872c71b3e2SJacob Faibussowitsch   PetscCheckFalse(col < 0 || col > A->cmap->N,PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid col %" PetscInt_FMT ", should be in [0,%" PetscInt_FMT ")",col,A->cmap->N);
34885f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscUseMethod(A,"MatDenseRestoreColumnVecRead_C",(Mat,PetscInt,Vec*),(A,col,v)));
34896947451fSStefano Zampini   PetscFunctionReturn(0);
34906947451fSStefano Zampini }
34916947451fSStefano Zampini 
34920f74d2c1SSatish Balay /*@
34936947451fSStefano Zampini    MatDenseGetColumnVecWrite - Gives write-only access to a column of a dense matrix, represented as a Vec.
34946947451fSStefano Zampini 
34956947451fSStefano Zampini    Collective
34966947451fSStefano Zampini 
34975ea7661aSPierre Jolivet    Input Parameters:
34986947451fSStefano Zampini +  mat - the Mat object
34996947451fSStefano Zampini -  col - the column index
35006947451fSStefano Zampini 
35016947451fSStefano Zampini    Output Parameter:
35026947451fSStefano Zampini .  v - the vector
35036947451fSStefano Zampini 
35046947451fSStefano Zampini    Notes:
35056947451fSStefano Zampini      The vector is owned by PETSc. Users need to call MatDenseRestoreColumnVecWrite() when the vector is no longer needed.
35066947451fSStefano Zampini      Use MatDenseGetColumnVec() to obtain read-write access or MatDenseGetColumnVecRead() for read-only access.
35076947451fSStefano Zampini 
35086947451fSStefano Zampini    Level: intermediate
35096947451fSStefano Zampini 
35106947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecRead(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecRead(), MatDenseRestoreColumnVecWrite()
35116947451fSStefano Zampini @*/
35126947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVecWrite(Mat A,PetscInt col,Vec *v)
35136947451fSStefano Zampini {
35146947451fSStefano Zampini   PetscFunctionBegin;
35156947451fSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
35166947451fSStefano Zampini   PetscValidType(A,1);
35176947451fSStefano Zampini   PetscValidLogicalCollectiveInt(A,col,2);
35186947451fSStefano Zampini   PetscValidPointer(v,3);
3519*28b400f6SJacob Faibussowitsch   PetscCheck(A->preallocated,PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated");
35202c71b3e2SJacob Faibussowitsch   PetscCheckFalse(col < 0 || col > A->cmap->N,PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid col %" PetscInt_FMT ", should be in [0,%" PetscInt_FMT ")",col,A->cmap->N);
35215f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscUseMethod(A,"MatDenseGetColumnVecWrite_C",(Mat,PetscInt,Vec*),(A,col,v)));
35226947451fSStefano Zampini   PetscFunctionReturn(0);
35236947451fSStefano Zampini }
35246947451fSStefano Zampini 
35250f74d2c1SSatish Balay /*@
35266947451fSStefano Zampini    MatDenseRestoreColumnVecWrite - Returns access to a column of a dense matrix obtained from MatDenseGetColumnVecWrite().
35276947451fSStefano Zampini 
35286947451fSStefano Zampini    Collective
35296947451fSStefano Zampini 
35305ea7661aSPierre Jolivet    Input Parameters:
35316947451fSStefano Zampini +  mat - the Mat object
35326947451fSStefano Zampini .  col - the column index
35336947451fSStefano Zampini -  v - the Vec object
35346947451fSStefano Zampini 
35356947451fSStefano Zampini    Level: intermediate
35366947451fSStefano Zampini 
35376947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecRead(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecRead()
35386947451fSStefano Zampini @*/
35396947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVecWrite(Mat A,PetscInt col,Vec *v)
35406947451fSStefano Zampini {
35416947451fSStefano Zampini   PetscFunctionBegin;
35426947451fSStefano Zampini   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
35436947451fSStefano Zampini   PetscValidType(A,1);
35446947451fSStefano Zampini   PetscValidLogicalCollectiveInt(A,col,2);
35452c71b3e2SJacob Faibussowitsch   PetscCheckFalse(!A->preallocated,PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated");
35462c71b3e2SJacob Faibussowitsch   PetscCheckFalse(col < 0 || col > A->cmap->N,PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid col %" PetscInt_FMT ", should be in [0,%" PetscInt_FMT ")",col,A->cmap->N);
35475f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscUseMethod(A,"MatDenseRestoreColumnVecWrite_C",(Mat,PetscInt,Vec*),(A,col,v)));
35486947451fSStefano Zampini   PetscFunctionReturn(0);
35496947451fSStefano Zampini }
35505ea7661aSPierre Jolivet 
35510f74d2c1SSatish Balay /*@
35525ea7661aSPierre Jolivet    MatDenseGetSubMatrix - Gives access to a block of columns of a dense matrix, represented as a Mat.
35535ea7661aSPierre Jolivet 
35545ea7661aSPierre Jolivet    Collective
35555ea7661aSPierre Jolivet 
35565ea7661aSPierre Jolivet    Input Parameters:
35575ea7661aSPierre Jolivet +  mat - the Mat object
35585ea7661aSPierre Jolivet .  cbegin - the first index in the block
35595ea7661aSPierre Jolivet -  cend - the last index in the block
35605ea7661aSPierre Jolivet 
35615ea7661aSPierre Jolivet    Output Parameter:
35625ea7661aSPierre Jolivet .  v - the matrix
35635ea7661aSPierre Jolivet 
35645ea7661aSPierre Jolivet    Notes:
35655ea7661aSPierre Jolivet      The matrix is owned by PETSc. Users need to call MatDenseRestoreSubMatrix() when the matrix is no longer needed.
35665ea7661aSPierre Jolivet 
35675ea7661aSPierre Jolivet    Level: intermediate
35685ea7661aSPierre Jolivet 
35695ea7661aSPierre Jolivet .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseRestoreColumnVec(), MatDenseRestoreSubMatrix()
35705ea7661aSPierre Jolivet @*/
35715ea7661aSPierre Jolivet PetscErrorCode MatDenseGetSubMatrix(Mat A,PetscInt cbegin,PetscInt cend,Mat *v)
35725ea7661aSPierre Jolivet {
35735ea7661aSPierre Jolivet   PetscFunctionBegin;
35745ea7661aSPierre Jolivet   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
35755ea7661aSPierre Jolivet   PetscValidType(A,1);
35765ea7661aSPierre Jolivet   PetscValidLogicalCollectiveInt(A,cbegin,2);
35775ea7661aSPierre Jolivet   PetscValidLogicalCollectiveInt(A,cend,3);
35785ea7661aSPierre Jolivet   PetscValidPointer(v,4);
3579*28b400f6SJacob Faibussowitsch   PetscCheck(A->preallocated,PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated");
35802c71b3e2SJacob Faibussowitsch   PetscCheckFalse(cbegin < 0 || cbegin > A->cmap->N,PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid cbegin %" PetscInt_FMT ", should be in [0,%" PetscInt_FMT ")",cbegin,A->cmap->N);
35812c71b3e2SJacob Faibussowitsch   PetscCheckFalse(cend < cbegin || cend > A->cmap->N,PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid cend %" PetscInt_FMT ", should be in [%" PetscInt_FMT ",%" PetscInt_FMT ")",cend,cbegin,A->cmap->N);
35825f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscUseMethod(A,"MatDenseGetSubMatrix_C",(Mat,PetscInt,PetscInt,Mat*),(A,cbegin,cend,v)));
35835ea7661aSPierre Jolivet   PetscFunctionReturn(0);
35845ea7661aSPierre Jolivet }
35855ea7661aSPierre Jolivet 
35860f74d2c1SSatish Balay /*@
35875ea7661aSPierre Jolivet    MatDenseRestoreSubMatrix - Returns access to a block of columns of a dense matrix obtained from MatDenseGetSubMatrix().
35885ea7661aSPierre Jolivet 
35895ea7661aSPierre Jolivet    Collective
35905ea7661aSPierre Jolivet 
35915ea7661aSPierre Jolivet    Input Parameters:
35925ea7661aSPierre Jolivet +  mat - the Mat object
35935ea7661aSPierre Jolivet -  v - the Mat object
35945ea7661aSPierre Jolivet 
35955ea7661aSPierre Jolivet    Level: intermediate
35965ea7661aSPierre Jolivet 
35975ea7661aSPierre Jolivet .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseRestoreColumnVec(), MatDenseGetSubMatrix()
35985ea7661aSPierre Jolivet @*/
35995ea7661aSPierre Jolivet PetscErrorCode MatDenseRestoreSubMatrix(Mat A,Mat *v)
36005ea7661aSPierre Jolivet {
36015ea7661aSPierre Jolivet   PetscFunctionBegin;
36025ea7661aSPierre Jolivet   PetscValidHeaderSpecific(A,MAT_CLASSID,1);
36035ea7661aSPierre Jolivet   PetscValidType(A,1);
36045ea7661aSPierre Jolivet   PetscValidPointer(v,2);
36055f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscUseMethod(A,"MatDenseRestoreSubMatrix_C",(Mat,Mat*),(A,v)));
36065ea7661aSPierre Jolivet   PetscFunctionReturn(0);
36075ea7661aSPierre Jolivet }
3608