1be1d678aSKris Buschelman 267e560aaSBarry Smith /* 367e560aaSBarry Smith Defines the basic matrix operations for sequential dense. 467e560aaSBarry Smith */ 5289bc588SBarry Smith 6dec5eb66SMatthew G Knepley #include <../src/mat/impls/dense/seq/dense.h> /*I "petscmat.h" I*/ 7c6db04a5SJed Brown #include <petscblaslapack.h> 8289bc588SBarry Smith 96a63e612SBarry Smith #include <../src/mat/impls/aij/seq/aij.h> 10b2573a8aSBarry Smith 11ca15aa20SStefano Zampini PetscErrorCode MatSeqDenseSymmetrize_Private(Mat A, PetscBool hermitian) 128c178816SStefano Zampini { 138c178816SStefano Zampini Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 148c178816SStefano Zampini PetscInt j, k, n = A->rmap->n; 15ca15aa20SStefano Zampini PetscScalar *v; 16ca15aa20SStefano Zampini PetscErrorCode ierr; 178c178816SStefano Zampini 188c178816SStefano Zampini PetscFunctionBegin; 198c178816SStefano Zampini if (A->rmap->n != A->cmap->n) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_SUP,"Cannot symmetrize a rectangular matrix"); 20ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr); 218c178816SStefano Zampini if (!hermitian) { 228c178816SStefano Zampini for (k=0;k<n;k++) { 238c178816SStefano Zampini for (j=k;j<n;j++) { 24ca15aa20SStefano Zampini v[j*mat->lda + k] = v[k*mat->lda + j]; 258c178816SStefano Zampini } 268c178816SStefano Zampini } 278c178816SStefano Zampini } else { 288c178816SStefano Zampini for (k=0;k<n;k++) { 298c178816SStefano Zampini for (j=k;j<n;j++) { 30ca15aa20SStefano Zampini v[j*mat->lda + k] = PetscConj(v[k*mat->lda + j]); 318c178816SStefano Zampini } 328c178816SStefano Zampini } 338c178816SStefano Zampini } 34ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr); 358c178816SStefano Zampini PetscFunctionReturn(0); 368c178816SStefano Zampini } 378c178816SStefano Zampini 3805709791SSatish Balay PETSC_EXTERN PetscErrorCode MatSeqDenseInvertFactors_Private(Mat A) 398c178816SStefano Zampini { 408c178816SStefano Zampini Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 418c178816SStefano Zampini PetscErrorCode ierr; 428c178816SStefano Zampini PetscBLASInt info,n; 438c178816SStefano Zampini 448c178816SStefano Zampini PetscFunctionBegin; 458c178816SStefano Zampini if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 468c178816SStefano Zampini ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 478c178816SStefano Zampini if (A->factortype == MAT_FACTOR_LU) { 488c178816SStefano Zampini if (!mat->pivots) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Pivots not present"); 498c178816SStefano Zampini if (!mat->fwork) { 508c178816SStefano Zampini mat->lfwork = n; 518c178816SStefano Zampini ierr = PetscMalloc1(mat->lfwork,&mat->fwork);CHKERRQ(ierr); 528c178816SStefano Zampini ierr = PetscLogObjectMemory((PetscObject)A,mat->lfwork*sizeof(PetscBLASInt));CHKERRQ(ierr); 538c178816SStefano Zampini } 5400121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 558c178816SStefano Zampini PetscStackCallBLAS("LAPACKgetri",LAPACKgetri_(&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&mat->lfwork,&info)); 5600121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 57ca15aa20SStefano Zampini ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr); 588c178816SStefano Zampini } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 598c178816SStefano Zampini if (A->spd) { 6000121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 618c178816SStefano Zampini PetscStackCallBLAS("LAPACKpotri",LAPACKpotri_("L",&n,mat->v,&mat->lda,&info)); 6200121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 638c178816SStefano Zampini ierr = MatSeqDenseSymmetrize_Private(A,PETSC_TRUE);CHKERRQ(ierr); 648c178816SStefano Zampini #if defined(PETSC_USE_COMPLEX) 658c178816SStefano Zampini } else if (A->hermitian) { 668c178816SStefano Zampini if (!mat->pivots) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Pivots not present"); 678c178816SStefano Zampini if (!mat->fwork) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Fwork not present"); 6800121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 698c178816SStefano Zampini PetscStackCallBLAS("LAPACKhetri",LAPACKhetri_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&info)); 7000121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 718c178816SStefano Zampini ierr = MatSeqDenseSymmetrize_Private(A,PETSC_TRUE);CHKERRQ(ierr); 728c178816SStefano Zampini #endif 738c178816SStefano Zampini } else { /* symmetric case */ 748c178816SStefano Zampini if (!mat->pivots) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Pivots not present"); 758c178816SStefano Zampini if (!mat->fwork) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Fwork not present"); 7600121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 778c178816SStefano Zampini PetscStackCallBLAS("LAPACKsytri",LAPACKsytri_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&info)); 7800121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 798c178816SStefano Zampini ierr = MatSeqDenseSymmetrize_Private(A,PETSC_FALSE);CHKERRQ(ierr); 808c178816SStefano Zampini } 818c178816SStefano Zampini if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad Inversion: zero pivot in row %D",(PetscInt)info-1); 82ca15aa20SStefano Zampini ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr); 838c178816SStefano Zampini } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 848c178816SStefano Zampini 858c178816SStefano Zampini A->ops->solve = NULL; 868c178816SStefano Zampini A->ops->matsolve = NULL; 878c178816SStefano Zampini A->ops->solvetranspose = NULL; 888c178816SStefano Zampini A->ops->matsolvetranspose = NULL; 898c178816SStefano Zampini A->ops->solveadd = NULL; 908c178816SStefano Zampini A->ops->solvetransposeadd = NULL; 918c178816SStefano Zampini A->factortype = MAT_FACTOR_NONE; 928c178816SStefano Zampini ierr = PetscFree(A->solvertype);CHKERRQ(ierr); 938c178816SStefano Zampini PetscFunctionReturn(0); 948c178816SStefano Zampini } 958c178816SStefano Zampini 963f49a652SStefano Zampini PetscErrorCode MatZeroRowsColumns_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b) 973f49a652SStefano Zampini { 983f49a652SStefano Zampini PetscErrorCode ierr; 993f49a652SStefano Zampini Mat_SeqDense *l = (Mat_SeqDense*)A->data; 1003f49a652SStefano Zampini PetscInt m = l->lda, n = A->cmap->n,r = A->rmap->n, i,j; 101ca15aa20SStefano Zampini PetscScalar *slot,*bb,*v; 1023f49a652SStefano Zampini const PetscScalar *xx; 1033f49a652SStefano Zampini 1043f49a652SStefano Zampini PetscFunctionBegin; 10576bd3646SJed Brown if (PetscDefined(USE_DEBUG)) { 1063f49a652SStefano Zampini for (i=0; i<N; i++) { 1073f49a652SStefano Zampini if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed"); 1083f49a652SStefano Zampini if (rows[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row %D requested to be zeroed greater than or equal number of rows %D",rows[i],A->rmap->n); 1093f49a652SStefano Zampini if (rows[i] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Col %D requested to be zeroed greater than or equal number of cols %D",rows[i],A->cmap->n); 1103f49a652SStefano Zampini } 11176bd3646SJed Brown } 112ca15aa20SStefano Zampini if (!N) PetscFunctionReturn(0); 1133f49a652SStefano Zampini 1143f49a652SStefano Zampini /* fix right hand side if needed */ 1153f49a652SStefano Zampini if (x && b) { 1166c4d906cSStefano Zampini Vec xt; 1176c4d906cSStefano Zampini 1186c4d906cSStefano Zampini if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 1196c4d906cSStefano Zampini ierr = VecDuplicate(x,&xt);CHKERRQ(ierr); 1206c4d906cSStefano Zampini ierr = VecCopy(x,xt);CHKERRQ(ierr); 1216c4d906cSStefano Zampini ierr = VecScale(xt,-1.0);CHKERRQ(ierr); 1226c4d906cSStefano Zampini ierr = MatMultAdd(A,xt,b,b);CHKERRQ(ierr); 1236c4d906cSStefano Zampini ierr = VecDestroy(&xt);CHKERRQ(ierr); 1243f49a652SStefano Zampini ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 1253f49a652SStefano Zampini ierr = VecGetArray(b,&bb);CHKERRQ(ierr); 1263f49a652SStefano Zampini for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]]; 1273f49a652SStefano Zampini ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 1283f49a652SStefano Zampini ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr); 1293f49a652SStefano Zampini } 1303f49a652SStefano Zampini 131ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr); 1323f49a652SStefano Zampini for (i=0; i<N; i++) { 133ca15aa20SStefano Zampini slot = v + rows[i]*m; 134580bdb30SBarry Smith ierr = PetscArrayzero(slot,r);CHKERRQ(ierr); 1353f49a652SStefano Zampini } 1363f49a652SStefano Zampini for (i=0; i<N; i++) { 137ca15aa20SStefano Zampini slot = v + rows[i]; 1383f49a652SStefano Zampini for (j=0; j<n; j++) { *slot = 0.0; slot += m;} 1393f49a652SStefano Zampini } 1403f49a652SStefano Zampini if (diag != 0.0) { 1413f49a652SStefano Zampini if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 1423f49a652SStefano Zampini for (i=0; i<N; i++) { 143ca15aa20SStefano Zampini slot = v + (m+1)*rows[i]; 1443f49a652SStefano Zampini *slot = diag; 1453f49a652SStefano Zampini } 1463f49a652SStefano Zampini } 147ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr); 1483f49a652SStefano Zampini PetscFunctionReturn(0); 1493f49a652SStefano Zampini } 1503f49a652SStefano Zampini 151abc3b08eSStefano Zampini PetscErrorCode MatPtAPNumeric_SeqDense_SeqDense(Mat A,Mat P,Mat C) 152abc3b08eSStefano Zampini { 153abc3b08eSStefano Zampini Mat_SeqDense *c = (Mat_SeqDense*)(C->data); 154abc3b08eSStefano Zampini PetscErrorCode ierr; 155abc3b08eSStefano Zampini 156abc3b08eSStefano Zampini PetscFunctionBegin; 157ca15aa20SStefano Zampini if (c->ptapwork) { 158ca15aa20SStefano Zampini ierr = (*C->ops->matmultnumeric)(A,P,c->ptapwork);CHKERRQ(ierr); 159ca15aa20SStefano Zampini ierr = (*C->ops->transposematmultnumeric)(P,c->ptapwork,C);CHKERRQ(ierr); 1604222ddf1SHong Zhang } else SETERRQ(PetscObjectComm((PetscObject)C),PETSC_ERR_SUP,"Must call MatPtAPSymbolic_SeqDense_SeqDense() first"); 161abc3b08eSStefano Zampini PetscFunctionReturn(0); 162abc3b08eSStefano Zampini } 163abc3b08eSStefano Zampini 1644222ddf1SHong Zhang PetscErrorCode MatPtAPSymbolic_SeqDense_SeqDense(Mat A,Mat P,PetscReal fill,Mat C) 165abc3b08eSStefano Zampini { 166abc3b08eSStefano Zampini Mat_SeqDense *c; 1677a3c3d58SStefano Zampini PetscBool cisdense; 168abc3b08eSStefano Zampini PetscErrorCode ierr; 169abc3b08eSStefano Zampini 170abc3b08eSStefano Zampini PetscFunctionBegin; 1714222ddf1SHong Zhang ierr = MatSetSizes(C,P->cmap->n,P->cmap->n,P->cmap->N,P->cmap->N);CHKERRQ(ierr); 1727a3c3d58SStefano Zampini ierr = PetscObjectTypeCompareAny((PetscObject)C,&cisdense,MATSEQDENSE,MATSEQDENSECUDA,"");CHKERRQ(ierr); 1737a3c3d58SStefano Zampini if (!cisdense) { 1747a3c3d58SStefano Zampini PetscBool flg; 1757a3c3d58SStefano Zampini 1767a3c3d58SStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)P,((PetscObject)A)->type_name,&flg);CHKERRQ(ierr); 1774222ddf1SHong Zhang ierr = MatSetType(C,flg ? ((PetscObject)A)->type_name : MATDENSE);CHKERRQ(ierr); 1787a3c3d58SStefano Zampini } 1797a3c3d58SStefano Zampini ierr = MatSetUp(C);CHKERRQ(ierr); 1804222ddf1SHong Zhang c = (Mat_SeqDense*)C->data; 181ca15aa20SStefano Zampini ierr = MatCreate(PetscObjectComm((PetscObject)A),&c->ptapwork);CHKERRQ(ierr); 182ca15aa20SStefano Zampini ierr = MatSetSizes(c->ptapwork,A->rmap->n,P->cmap->n,A->rmap->N,P->cmap->N);CHKERRQ(ierr); 1837a3c3d58SStefano Zampini ierr = MatSetType(c->ptapwork,((PetscObject)C)->type_name);CHKERRQ(ierr); 1847a3c3d58SStefano Zampini ierr = MatSetUp(c->ptapwork);CHKERRQ(ierr); 185abc3b08eSStefano Zampini PetscFunctionReturn(0); 186abc3b08eSStefano Zampini } 187abc3b08eSStefano Zampini 188cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqAIJ_SeqDense(Mat A,MatType newtype,MatReuse reuse,Mat *newmat) 189b49cda9fSStefano Zampini { 190a13144ffSStefano Zampini Mat B = NULL; 191b49cda9fSStefano Zampini Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 192b49cda9fSStefano Zampini Mat_SeqDense *b; 193b49cda9fSStefano Zampini PetscErrorCode ierr; 194b49cda9fSStefano Zampini PetscInt *ai=a->i,*aj=a->j,m=A->rmap->N,n=A->cmap->N,i; 1952e5835c6SStefano Zampini const MatScalar *av; 196a13144ffSStefano Zampini PetscBool isseqdense; 197b49cda9fSStefano Zampini 198b49cda9fSStefano Zampini PetscFunctionBegin; 199a13144ffSStefano Zampini if (reuse == MAT_REUSE_MATRIX) { 200a13144ffSStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)*newmat,MATSEQDENSE,&isseqdense);CHKERRQ(ierr); 201a32993e3SJed Brown if (!isseqdense) SETERRQ1(PetscObjectComm((PetscObject)*newmat),PETSC_ERR_USER,"Cannot reuse matrix of type %s",((PetscObject)(*newmat))->type_name); 202a13144ffSStefano Zampini } 203a13144ffSStefano Zampini if (reuse != MAT_REUSE_MATRIX) { 204b49cda9fSStefano Zampini ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); 205b49cda9fSStefano Zampini ierr = MatSetSizes(B,m,n,m,n);CHKERRQ(ierr); 206b49cda9fSStefano Zampini ierr = MatSetType(B,MATSEQDENSE);CHKERRQ(ierr); 207b49cda9fSStefano Zampini ierr = MatSeqDenseSetPreallocation(B,NULL);CHKERRQ(ierr); 208b49cda9fSStefano Zampini b = (Mat_SeqDense*)(B->data); 209a13144ffSStefano Zampini } else { 210a13144ffSStefano Zampini b = (Mat_SeqDense*)((*newmat)->data); 211580bdb30SBarry Smith ierr = PetscArrayzero(b->v,m*n);CHKERRQ(ierr); 212a13144ffSStefano Zampini } 2132e5835c6SStefano Zampini ierr = MatSeqAIJGetArrayRead(A,&av);CHKERRQ(ierr); 214b49cda9fSStefano Zampini for (i=0; i<m; i++) { 215b49cda9fSStefano Zampini PetscInt j; 216b49cda9fSStefano Zampini for (j=0;j<ai[1]-ai[0];j++) { 217b49cda9fSStefano Zampini b->v[*aj*m+i] = *av; 218b49cda9fSStefano Zampini aj++; 219b49cda9fSStefano Zampini av++; 220b49cda9fSStefano Zampini } 221b49cda9fSStefano Zampini ai++; 222b49cda9fSStefano Zampini } 2232e5835c6SStefano Zampini ierr = MatSeqAIJRestoreArrayRead(A,&av);CHKERRQ(ierr); 224b49cda9fSStefano Zampini 225511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 226a13144ffSStefano Zampini ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 227a13144ffSStefano Zampini ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 22828be2f97SBarry Smith ierr = MatHeaderReplace(A,&B);CHKERRQ(ierr); 229b49cda9fSStefano Zampini } else { 230a13144ffSStefano Zampini if (B) *newmat = B; 231a13144ffSStefano Zampini ierr = MatAssemblyBegin(*newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 232a13144ffSStefano Zampini ierr = MatAssemblyEnd(*newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 233b49cda9fSStefano Zampini } 234b49cda9fSStefano Zampini PetscFunctionReturn(0); 235b49cda9fSStefano Zampini } 236b49cda9fSStefano Zampini 237cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqDense_SeqAIJ(Mat A, MatType newtype,MatReuse reuse,Mat *newmat) 2386a63e612SBarry Smith { 2396d4ec7b0SPierre Jolivet Mat B = NULL; 2406a63e612SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2416a63e612SBarry Smith PetscErrorCode ierr; 2429399e1b8SMatthew G. Knepley PetscInt i, j; 2439399e1b8SMatthew G. Knepley PetscInt *rows, *nnz; 2449399e1b8SMatthew G. Knepley MatScalar *aa = a->v, *vals; 2456a63e612SBarry Smith 2466a63e612SBarry Smith PetscFunctionBegin; 2476d4ec7b0SPierre Jolivet ierr = PetscCalloc3(A->rmap->n,&rows,A->rmap->n,&nnz,A->rmap->n,&vals);CHKERRQ(ierr); 2486d4ec7b0SPierre Jolivet if (reuse != MAT_REUSE_MATRIX) { 249ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); 2506a63e612SBarry Smith ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 2516a63e612SBarry Smith ierr = MatSetType(B,MATSEQAIJ);CHKERRQ(ierr); 2529399e1b8SMatthew G. Knepley for (j=0; j<A->cmap->n; j++) { 2536d4ec7b0SPierre Jolivet for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || (i == j && A->cmap->n == A->rmap->n)) ++nnz[i]; 2546a63e612SBarry Smith aa += a->lda; 2556a63e612SBarry Smith } 2569399e1b8SMatthew G. Knepley ierr = MatSeqAIJSetPreallocation(B,PETSC_DETERMINE,nnz);CHKERRQ(ierr); 2576d4ec7b0SPierre Jolivet } else B = *newmat; 2589399e1b8SMatthew G. Knepley aa = a->v; 2599399e1b8SMatthew G. Knepley for (j=0; j<A->cmap->n; j++) { 2609399e1b8SMatthew G. Knepley PetscInt numRows = 0; 2616d4ec7b0SPierre 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];} 2629399e1b8SMatthew G. Knepley ierr = MatSetValues(B,numRows,rows,1,&j,vals,INSERT_VALUES);CHKERRQ(ierr); 2639399e1b8SMatthew G. Knepley aa += a->lda; 2649399e1b8SMatthew G. Knepley } 2659399e1b8SMatthew G. Knepley ierr = PetscFree3(rows,nnz,vals);CHKERRQ(ierr); 2666a63e612SBarry Smith ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2676a63e612SBarry Smith ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2686a63e612SBarry Smith 269511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 27028be2f97SBarry Smith ierr = MatHeaderReplace(A,&B);CHKERRQ(ierr); 2716d4ec7b0SPierre Jolivet } else if (reuse != MAT_REUSE_MATRIX) *newmat = B; 2726a63e612SBarry Smith PetscFunctionReturn(0); 2736a63e612SBarry Smith } 2746a63e612SBarry Smith 275ca15aa20SStefano Zampini PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str) 2761987afe7SBarry Smith { 2771987afe7SBarry Smith Mat_SeqDense *x = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data; 278ca15aa20SStefano Zampini const PetscScalar *xv; 279ca15aa20SStefano Zampini PetscScalar *yv; 28023fff9afSBarry Smith PetscBLASInt N,m,ldax = 0,lday = 0,one = 1; 281efee365bSSatish Balay PetscErrorCode ierr; 2823a40ed3dSBarry Smith 2833a40ed3dSBarry Smith PetscFunctionBegin; 284ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(X,&xv);CHKERRQ(ierr); 285ca15aa20SStefano Zampini ierr = MatDenseGetArray(Y,&yv);CHKERRQ(ierr); 286c5df96a5SBarry Smith ierr = PetscBLASIntCast(X->rmap->n*X->cmap->n,&N);CHKERRQ(ierr); 287c5df96a5SBarry Smith ierr = PetscBLASIntCast(X->rmap->n,&m);CHKERRQ(ierr); 288c5df96a5SBarry Smith ierr = PetscBLASIntCast(x->lda,&ldax);CHKERRQ(ierr); 289c5df96a5SBarry Smith ierr = PetscBLASIntCast(y->lda,&lday);CHKERRQ(ierr); 290a5ce6ee0Svictorle if (ldax>m || lday>m) { 291ca15aa20SStefano Zampini PetscInt j; 292ca15aa20SStefano Zampini 293d0f46423SBarry Smith for (j=0; j<X->cmap->n; j++) { 294ca15aa20SStefano Zampini PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&m,&alpha,xv+j*ldax,&one,yv+j*lday,&one)); 295a5ce6ee0Svictorle } 296a5ce6ee0Svictorle } else { 297ca15aa20SStefano Zampini PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&N,&alpha,xv,&one,yv,&one)); 298a5ce6ee0Svictorle } 299ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(X,&xv);CHKERRQ(ierr); 300ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(Y,&yv);CHKERRQ(ierr); 301ca0c957dSBarry Smith ierr = PetscLogFlops(PetscMax(2.0*N-1,0));CHKERRQ(ierr); 3023a40ed3dSBarry Smith PetscFunctionReturn(0); 3031987afe7SBarry Smith } 3041987afe7SBarry Smith 305e0877f53SBarry Smith static PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info) 306289bc588SBarry Smith { 307ca15aa20SStefano Zampini PetscLogDouble N = A->rmap->n*A->cmap->n; 3083a40ed3dSBarry Smith 3093a40ed3dSBarry Smith PetscFunctionBegin; 3104e220ebcSLois Curfman McInnes info->block_size = 1.0; 311ca15aa20SStefano Zampini info->nz_allocated = N; 312ca15aa20SStefano Zampini info->nz_used = N; 313ca15aa20SStefano Zampini info->nz_unneeded = 0; 314ca15aa20SStefano Zampini info->assemblies = A->num_ass; 3154e220ebcSLois Curfman McInnes info->mallocs = 0; 3167adad957SLisandro Dalcin info->memory = ((PetscObject)A)->mem; 3174e220ebcSLois Curfman McInnes info->fill_ratio_given = 0; 3184e220ebcSLois Curfman McInnes info->fill_ratio_needed = 0; 3194e220ebcSLois Curfman McInnes info->factor_mallocs = 0; 3203a40ed3dSBarry Smith PetscFunctionReturn(0); 321289bc588SBarry Smith } 322289bc588SBarry Smith 323637a0070SStefano Zampini PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha) 32480cd9d93SLois Curfman McInnes { 325273d9f13SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 326ca15aa20SStefano Zampini PetscScalar *v; 327efee365bSSatish Balay PetscErrorCode ierr; 32823fff9afSBarry Smith PetscBLASInt one = 1,j,nz,lda = 0; 32980cd9d93SLois Curfman McInnes 3303a40ed3dSBarry Smith PetscFunctionBegin; 331ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr); 332c5df96a5SBarry Smith ierr = PetscBLASIntCast(a->lda,&lda);CHKERRQ(ierr); 333d0f46423SBarry Smith if (lda>A->rmap->n) { 334c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&nz);CHKERRQ(ierr); 335d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 336ca15aa20SStefano Zampini PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&alpha,v+j*lda,&one)); 337a5ce6ee0Svictorle } 338a5ce6ee0Svictorle } else { 339c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n*A->cmap->n,&nz);CHKERRQ(ierr); 340ca15aa20SStefano Zampini PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&alpha,v,&one)); 341a5ce6ee0Svictorle } 342efee365bSSatish Balay ierr = PetscLogFlops(nz);CHKERRQ(ierr); 343ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr); 3443a40ed3dSBarry Smith PetscFunctionReturn(0); 34580cd9d93SLois Curfman McInnes } 34680cd9d93SLois Curfman McInnes 347e0877f53SBarry Smith static PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscBool *fl) 3481cbb95d3SBarry Smith { 3491cbb95d3SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 350ca15aa20SStefano Zampini PetscInt i,j,m = A->rmap->n,N = a->lda; 351ca15aa20SStefano Zampini const PetscScalar *v; 352ca15aa20SStefano Zampini PetscErrorCode ierr; 3531cbb95d3SBarry Smith 3541cbb95d3SBarry Smith PetscFunctionBegin; 3551cbb95d3SBarry Smith *fl = PETSC_FALSE; 356d0f46423SBarry Smith if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0); 357ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&v);CHKERRQ(ierr); 3581cbb95d3SBarry Smith for (i=0; i<m; i++) { 359ca15aa20SStefano Zampini for (j=i; j<m; j++) { 360637a0070SStefano Zampini if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) { 361637a0070SStefano Zampini goto restore; 3621cbb95d3SBarry Smith } 3631cbb95d3SBarry Smith } 364637a0070SStefano Zampini } 3651cbb95d3SBarry Smith *fl = PETSC_TRUE; 366637a0070SStefano Zampini restore: 367637a0070SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&v);CHKERRQ(ierr); 368637a0070SStefano Zampini PetscFunctionReturn(0); 369637a0070SStefano Zampini } 370637a0070SStefano Zampini 371637a0070SStefano Zampini static PetscErrorCode MatIsSymmetric_SeqDense(Mat A,PetscReal rtol,PetscBool *fl) 372637a0070SStefano Zampini { 373637a0070SStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 374637a0070SStefano Zampini PetscInt i,j,m = A->rmap->n,N = a->lda; 375637a0070SStefano Zampini const PetscScalar *v; 376637a0070SStefano Zampini PetscErrorCode ierr; 377637a0070SStefano Zampini 378637a0070SStefano Zampini PetscFunctionBegin; 379637a0070SStefano Zampini *fl = PETSC_FALSE; 380637a0070SStefano Zampini if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0); 381637a0070SStefano Zampini ierr = MatDenseGetArrayRead(A,&v);CHKERRQ(ierr); 382637a0070SStefano Zampini for (i=0; i<m; i++) { 383637a0070SStefano Zampini for (j=i; j<m; j++) { 384637a0070SStefano Zampini if (PetscAbsScalar(v[i+j*N] - v[j+i*N]) > rtol) { 385637a0070SStefano Zampini goto restore; 386637a0070SStefano Zampini } 387637a0070SStefano Zampini } 388637a0070SStefano Zampini } 389637a0070SStefano Zampini *fl = PETSC_TRUE; 390637a0070SStefano Zampini restore: 391637a0070SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&v);CHKERRQ(ierr); 3921cbb95d3SBarry Smith PetscFunctionReturn(0); 3931cbb95d3SBarry Smith } 3941cbb95d3SBarry Smith 395ca15aa20SStefano Zampini PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat newi,Mat A,MatDuplicateOption cpvalues) 396b24902e0SBarry Smith { 397ca15aa20SStefano Zampini Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 398b24902e0SBarry Smith PetscErrorCode ierr; 39923fc5dcaSStefano Zampini PetscInt lda = (PetscInt)mat->lda,j,m,nlda = lda; 400b24902e0SBarry Smith 401b24902e0SBarry Smith PetscFunctionBegin; 402aa5ea44dSBarry Smith ierr = PetscLayoutReference(A->rmap,&newi->rmap);CHKERRQ(ierr); 403aa5ea44dSBarry Smith ierr = PetscLayoutReference(A->cmap,&newi->cmap);CHKERRQ(ierr); 40423fc5dcaSStefano Zampini if (cpvalues == MAT_SHARE_NONZERO_PATTERN) { /* propagate LDA */ 40523fc5dcaSStefano Zampini ierr = MatDenseSetLDA(newi,lda);CHKERRQ(ierr); 40623fc5dcaSStefano Zampini } 4070298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newi,NULL);CHKERRQ(ierr); 408b24902e0SBarry Smith if (cpvalues == MAT_COPY_VALUES) { 409ca15aa20SStefano Zampini const PetscScalar *av; 410ca15aa20SStefano Zampini PetscScalar *v; 411ca15aa20SStefano Zampini 412ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&av);CHKERRQ(ierr); 413ca15aa20SStefano Zampini ierr = MatDenseGetArray(newi,&v);CHKERRQ(ierr); 41423fc5dcaSStefano Zampini ierr = MatDenseGetLDA(newi,&nlda);CHKERRQ(ierr); 415d0f46423SBarry Smith m = A->rmap->n; 41623fc5dcaSStefano Zampini if (lda>m || nlda>m) { 417d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 41823fc5dcaSStefano Zampini ierr = PetscArraycpy(v+j*nlda,av+j*lda,m);CHKERRQ(ierr); 419b24902e0SBarry Smith } 420b24902e0SBarry Smith } else { 421ca15aa20SStefano Zampini ierr = PetscArraycpy(v,av,A->rmap->n*A->cmap->n);CHKERRQ(ierr); 422b24902e0SBarry Smith } 423ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(newi,&v);CHKERRQ(ierr); 424ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&av);CHKERRQ(ierr); 425b24902e0SBarry Smith } 426b24902e0SBarry Smith PetscFunctionReturn(0); 427b24902e0SBarry Smith } 428b24902e0SBarry Smith 429ca15aa20SStefano Zampini PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat) 43002cad45dSBarry Smith { 4316849ba73SBarry Smith PetscErrorCode ierr; 43202cad45dSBarry Smith 4333a40ed3dSBarry Smith PetscFunctionBegin; 434ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),newmat);CHKERRQ(ierr); 435d0f46423SBarry Smith ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 4365c9eb25fSBarry Smith ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 437719d5645SBarry Smith ierr = MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues);CHKERRQ(ierr); 438b24902e0SBarry Smith PetscFunctionReturn(0); 439b24902e0SBarry Smith } 440b24902e0SBarry Smith 4414396437dSToby Isaac static PetscErrorCode MatSolve_SeqDense_Internal_LU(Mat A, PetscScalar *x, PetscBLASInt xlda, PetscBLASInt m, PetscBLASInt nrhs, PetscBLASInt k, PetscBool T) 442289bc588SBarry Smith { 443c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 4444396437dSToby Isaac PetscBLASInt info; 4456849ba73SBarry Smith PetscErrorCode ierr; 44667e560aaSBarry Smith 4473a40ed3dSBarry Smith PetscFunctionBegin; 44800121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 4494396437dSToby Isaac PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_(T ? "T" : "N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info)); 45000121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 45185e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 4524905a7bcSToby Isaac ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr); 4534396437dSToby Isaac PetscFunctionReturn(0); 4544396437dSToby Isaac } 4554396437dSToby Isaac 4564396437dSToby Isaac static PetscErrorCode MatConjugate_SeqDense(Mat); 4574396437dSToby Isaac 4584396437dSToby Isaac static PetscErrorCode MatSolve_SeqDense_Internal_Cholesky(Mat A, PetscScalar *x, PetscBLASInt xlda, PetscBLASInt m, PetscBLASInt nrhs, PetscBLASInt k, PetscBool T) 4594396437dSToby Isaac { 4604396437dSToby Isaac Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 4614396437dSToby Isaac PetscBLASInt info; 4624396437dSToby Isaac PetscErrorCode ierr; 4634396437dSToby Isaac 4644396437dSToby Isaac PetscFunctionBegin; 465a49dc2a2SStefano Zampini if (A->spd) { 4664396437dSToby Isaac if (PetscDefined(USE_COMPLEX) && T) {ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr);} 46700121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 4688b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info)); 46900121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 47085e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 4714396437dSToby Isaac if (PetscDefined(USE_COMPLEX) && T) {ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr);} 472a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX) 473a49dc2a2SStefano Zampini } else if (A->hermitian) { 4744396437dSToby Isaac if (T) {ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr);} 47500121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 476a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKhetrs",LAPACKhetrs_("L",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info)); 47700121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 478a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"HETRS Bad solve"); 4794396437dSToby Isaac if (T) {ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr);} 480a49dc2a2SStefano Zampini #endif 481a49dc2a2SStefano Zampini } else { /* symmetric case */ 48200121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 483a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrs",LAPACKsytrs_("L",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info)); 48400121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 485a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"SYTRS Bad solve"); 486a49dc2a2SStefano Zampini } 4874905a7bcSToby Isaac ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr); 4884396437dSToby Isaac PetscFunctionReturn(0); 4894396437dSToby Isaac } 49085e2c93fSHong Zhang 4914396437dSToby Isaac static PetscErrorCode MatSolve_SeqDense_Internal_QR(Mat A, PetscScalar *x, PetscBLASInt xlda, PetscBLASInt m, PetscBLASInt nrhs, PetscBLASInt k) 4924396437dSToby Isaac { 4934396437dSToby Isaac Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 4944396437dSToby Isaac PetscBLASInt info; 4954396437dSToby Isaac char trans; 4964396437dSToby Isaac PetscErrorCode ierr; 4974396437dSToby Isaac 4984396437dSToby Isaac PetscFunctionBegin; 4994905a7bcSToby Isaac if (PetscDefined(USE_COMPLEX)) { 5004905a7bcSToby Isaac trans = 'C'; 5014905a7bcSToby Isaac } else { 5024905a7bcSToby Isaac trans = 'T'; 5034905a7bcSToby Isaac } 5044905a7bcSToby Isaac ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 5054905a7bcSToby Isaac PetscStackCallBLAS("LAPACKormqr",LAPACKormqr_("L", &trans, &m,&nrhs,&mat->rank,mat->v,&mat->lda,mat->tau,x,&xlda,mat->fwork,&mat->lfwork,&info)); 5064905a7bcSToby Isaac ierr = PetscFPTrapPop();CHKERRQ(ierr); 5074905a7bcSToby Isaac if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"ORMQR - Bad orthogonal transform"); 5084905a7bcSToby Isaac ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 5094905a7bcSToby Isaac PetscStackCallBLAS("LAPACKtrtrs",LAPACKtrtrs_("U", "N", "N", &mat->rank,&nrhs,mat->v,&mat->lda,x,&xlda,&info)); 5104905a7bcSToby Isaac ierr = PetscFPTrapPop();CHKERRQ(ierr); 5114905a7bcSToby Isaac if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"TRTRS - Bad triangular solve"); 5124905a7bcSToby Isaac for (PetscInt j = 0; j < nrhs; j++) { 5134905a7bcSToby Isaac for (PetscInt i = mat->rank; i < k; i++) { 5144905a7bcSToby Isaac x[j*xlda + i] = 0.; 5154905a7bcSToby Isaac } 5164905a7bcSToby Isaac } 5174905a7bcSToby Isaac ierr = PetscLogFlops(nrhs*(4.0*m*mat->rank - PetscSqr(mat->rank)));CHKERRQ(ierr); 5184905a7bcSToby Isaac PetscFunctionReturn(0); 5194905a7bcSToby Isaac } 5204905a7bcSToby Isaac 5214396437dSToby Isaac static PetscErrorCode MatSolveTranspose_SeqDense_Internal_QR(Mat A, PetscScalar *x, PetscBLASInt xlda, PetscBLASInt m, PetscBLASInt nrhs, PetscBLASInt k) 5224905a7bcSToby Isaac { 5234396437dSToby Isaac Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 5244396437dSToby Isaac PetscBLASInt info; 5254905a7bcSToby Isaac PetscErrorCode ierr; 5264396437dSToby Isaac 5274396437dSToby Isaac PetscFunctionBegin; 5284396437dSToby Isaac if (A->rmap->n == A->cmap->n && mat->rank == A->rmap->n) { 5294396437dSToby Isaac ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 5304396437dSToby Isaac PetscStackCallBLAS("LAPACKtrtrs",LAPACKtrtrs_("U", "T", "N", &m,&nrhs,mat->v,&mat->lda,x,&xlda,&info)); 5314396437dSToby Isaac ierr = PetscFPTrapPop();CHKERRQ(ierr); 5324396437dSToby Isaac if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"TRTRS - Bad triangular solve"); 5334396437dSToby Isaac if (PetscDefined(USE_COMPLEX)) {ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr);} 5344396437dSToby Isaac ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 5354396437dSToby Isaac PetscStackCallBLAS("LAPACKormqr",LAPACKormqr_("L", "N", &m,&nrhs,&mat->rank,mat->v,&mat->lda,mat->tau,x,&xlda,mat->fwork,&mat->lfwork,&info)); 5364396437dSToby Isaac ierr = PetscFPTrapPop();CHKERRQ(ierr); 5374396437dSToby Isaac if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"ORMQR - Bad orthogonal transform"); 5384396437dSToby Isaac if (PetscDefined(USE_COMPLEX)) {ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr);} 5394396437dSToby Isaac } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"QR factored matrix cannot be used for transpose solve"); 5404396437dSToby Isaac ierr = PetscLogFlops(nrhs*(4.0*m*mat->rank - PetscSqr(mat->rank)));CHKERRQ(ierr); 5414396437dSToby Isaac PetscFunctionReturn(0); 5424396437dSToby Isaac } 5434396437dSToby Isaac 5444396437dSToby Isaac static PetscErrorCode MatSolve_SeqDense_SetUp(Mat A, Vec xx, Vec yy, PetscScalar **_y, PetscBLASInt *_m, PetscBLASInt *_k) 5454396437dSToby Isaac { 5464396437dSToby Isaac Mat_SeqDense *mat = (Mat_SeqDense *) A->data; 5474905a7bcSToby Isaac PetscScalar *y; 5484905a7bcSToby Isaac PetscBLASInt m=0, k=0; 5494396437dSToby Isaac PetscErrorCode ierr; 5504905a7bcSToby Isaac 5514905a7bcSToby Isaac PetscFunctionBegin; 5524905a7bcSToby Isaac ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 5534905a7bcSToby Isaac ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr); 5544905a7bcSToby Isaac if (k < m) { 5554396437dSToby Isaac ierr = VecCopy(xx, mat->qrrhs);CHKERRQ(ierr); 5564396437dSToby Isaac ierr = VecGetArray(mat->qrrhs,&y);CHKERRQ(ierr); 5574905a7bcSToby Isaac } else { 5584396437dSToby Isaac ierr = VecCopy(xx, yy);CHKERRQ(ierr); 5594905a7bcSToby Isaac ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 5604905a7bcSToby Isaac } 5614396437dSToby Isaac *_y = y; 5624396437dSToby Isaac *_k = k; 5634396437dSToby Isaac *_m = m; 5644396437dSToby Isaac PetscFunctionReturn(0); 5654396437dSToby Isaac } 5664396437dSToby Isaac 5674396437dSToby Isaac static PetscErrorCode MatSolve_SeqDense_TearDown(Mat A, Vec xx, Vec yy, PetscScalar **_y, PetscBLASInt *_m, PetscBLASInt *_k) 5684396437dSToby Isaac { 5694396437dSToby Isaac Mat_SeqDense *mat = (Mat_SeqDense *) A->data; 57042e9364cSSatish Balay PetscScalar *y = NULL; 5714396437dSToby Isaac PetscBLASInt m, k; 5724396437dSToby Isaac PetscErrorCode ierr; 5734396437dSToby Isaac 5744396437dSToby Isaac PetscFunctionBegin; 5754396437dSToby Isaac y = *_y; 5764396437dSToby Isaac *_y = NULL; 5774396437dSToby Isaac k = *_k; 5784396437dSToby Isaac m = *_m; 5794905a7bcSToby Isaac if (k < m) { 5804905a7bcSToby Isaac PetscScalar *yv; 5814905a7bcSToby Isaac ierr = VecGetArray(yy,&yv);CHKERRQ(ierr); 5824905a7bcSToby Isaac ierr = PetscArraycpy(yv, y, k);CHKERRQ(ierr); 5834905a7bcSToby Isaac ierr = VecRestoreArray(yy,&yv);CHKERRQ(ierr); 5844396437dSToby Isaac ierr = VecRestoreArray(mat->qrrhs, &y);CHKERRQ(ierr); 5854905a7bcSToby Isaac } else { 5864905a7bcSToby Isaac ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 5874905a7bcSToby Isaac } 5884905a7bcSToby Isaac PetscFunctionReturn(0); 5894905a7bcSToby Isaac } 5904905a7bcSToby Isaac 5914396437dSToby Isaac static PetscErrorCode MatSolve_SeqDense_LU(Mat A, Vec xx, Vec yy) 5924396437dSToby Isaac { 59342e9364cSSatish Balay PetscScalar *y = NULL; 59442e9364cSSatish Balay PetscBLASInt m = 0, k = 0; 5954396437dSToby Isaac PetscErrorCode ierr; 5964396437dSToby Isaac 5974396437dSToby Isaac PetscFunctionBegin; 5984396437dSToby Isaac ierr = MatSolve_SeqDense_SetUp(A, xx, yy, &y, &m, &k);CHKERRQ(ierr); 5994396437dSToby Isaac ierr = MatSolve_SeqDense_Internal_LU(A, y, m, m, 1, k, PETSC_FALSE);CHKERRQ(ierr); 6004396437dSToby Isaac ierr = MatSolve_SeqDense_TearDown(A, xx, yy, &y, &m, &k);CHKERRQ(ierr); 6014396437dSToby Isaac PetscFunctionReturn(0); 6024396437dSToby Isaac } 6034396437dSToby Isaac 6044396437dSToby Isaac static PetscErrorCode MatSolveTranspose_SeqDense_LU(Mat A, Vec xx, Vec yy) 6054396437dSToby Isaac { 60642e9364cSSatish Balay PetscScalar *y = NULL; 60742e9364cSSatish Balay PetscBLASInt m = 0, k = 0; 6084396437dSToby Isaac PetscErrorCode ierr; 6094396437dSToby Isaac 6104396437dSToby Isaac PetscFunctionBegin; 6114396437dSToby Isaac ierr = MatSolve_SeqDense_SetUp(A, xx, yy, &y, &m, &k);CHKERRQ(ierr); 6124396437dSToby Isaac ierr = MatSolve_SeqDense_Internal_LU(A, y, m, m, 1, k, PETSC_TRUE);CHKERRQ(ierr); 6134396437dSToby Isaac ierr = MatSolve_SeqDense_TearDown(A, xx, yy, &y, &m, &k);CHKERRQ(ierr); 6144396437dSToby Isaac PetscFunctionReturn(0); 6154396437dSToby Isaac } 6164396437dSToby Isaac 6174396437dSToby Isaac static PetscErrorCode MatSolve_SeqDense_Cholesky(Mat A, Vec xx, Vec yy) 6184396437dSToby Isaac { 619e54beecaSStefano Zampini PetscScalar *y = NULL; 620e54beecaSStefano Zampini PetscBLASInt m = 0, k = 0; 6214396437dSToby Isaac PetscErrorCode ierr; 6224396437dSToby Isaac 6234396437dSToby Isaac PetscFunctionBegin; 6244396437dSToby Isaac ierr = MatSolve_SeqDense_SetUp(A, xx, yy, &y, &m, &k);CHKERRQ(ierr); 6254396437dSToby Isaac ierr = MatSolve_SeqDense_Internal_Cholesky(A, y, m, m, 1, k, PETSC_FALSE);CHKERRQ(ierr); 6264396437dSToby Isaac ierr = MatSolve_SeqDense_TearDown(A, xx, yy, &y, &m, &k);CHKERRQ(ierr); 6274396437dSToby Isaac PetscFunctionReturn(0); 6284396437dSToby Isaac } 6294396437dSToby Isaac 6304396437dSToby Isaac static PetscErrorCode MatSolveTranspose_SeqDense_Cholesky(Mat A, Vec xx, Vec yy) 6314396437dSToby Isaac { 632e54beecaSStefano Zampini PetscScalar *y = NULL; 633e54beecaSStefano Zampini PetscBLASInt m = 0, k = 0; 6344396437dSToby Isaac PetscErrorCode ierr; 6354396437dSToby Isaac 6364396437dSToby Isaac PetscFunctionBegin; 6374396437dSToby Isaac ierr = MatSolve_SeqDense_SetUp(A, xx, yy, &y, &m, &k);CHKERRQ(ierr); 6384396437dSToby Isaac ierr = MatSolve_SeqDense_Internal_Cholesky(A, y, m, m, 1, k, PETSC_TRUE);CHKERRQ(ierr); 6394396437dSToby Isaac ierr = MatSolve_SeqDense_TearDown(A, xx, yy, &y, &m, &k);CHKERRQ(ierr); 6404396437dSToby Isaac PetscFunctionReturn(0); 6414396437dSToby Isaac } 6424396437dSToby Isaac 6434396437dSToby Isaac static PetscErrorCode MatSolve_SeqDense_QR(Mat A, Vec xx, Vec yy) 6444396437dSToby Isaac { 645e54beecaSStefano Zampini PetscScalar *y = NULL; 646e54beecaSStefano Zampini PetscBLASInt m = 0, k = 0; 6474396437dSToby Isaac PetscErrorCode ierr; 6484396437dSToby Isaac 6494396437dSToby Isaac PetscFunctionBegin; 6504396437dSToby Isaac ierr = MatSolve_SeqDense_SetUp(A, xx, yy, &y, &m, &k);CHKERRQ(ierr); 6514396437dSToby Isaac ierr = MatSolve_SeqDense_Internal_QR(A, y, PetscMax(m,k), m, 1, k);CHKERRQ(ierr); 6524396437dSToby Isaac ierr = MatSolve_SeqDense_TearDown(A, xx, yy, &y, &m, &k);CHKERRQ(ierr); 6534396437dSToby Isaac PetscFunctionReturn(0); 6544396437dSToby Isaac } 6554396437dSToby Isaac 6564396437dSToby Isaac static PetscErrorCode MatSolveTranspose_SeqDense_QR(Mat A, Vec xx, Vec yy) 6574396437dSToby Isaac { 65842e9364cSSatish Balay PetscScalar *y = NULL; 65942e9364cSSatish Balay PetscBLASInt m = 0, k = 0; 6604396437dSToby Isaac PetscErrorCode ierr; 6614396437dSToby Isaac 6624396437dSToby Isaac PetscFunctionBegin; 6634396437dSToby Isaac ierr = MatSolve_SeqDense_SetUp(A, xx, yy, &y, &m, &k);CHKERRQ(ierr); 6644396437dSToby Isaac ierr = MatSolveTranspose_SeqDense_Internal_QR(A, y, PetscMax(m,k), m, 1, k);CHKERRQ(ierr); 6654396437dSToby Isaac ierr = MatSolve_SeqDense_TearDown(A, xx, yy, &y, &m, &k);CHKERRQ(ierr); 6664396437dSToby Isaac PetscFunctionReturn(0); 6674396437dSToby Isaac } 6684396437dSToby Isaac 6694396437dSToby Isaac static PetscErrorCode MatMatSolve_SeqDense_SetUp(Mat A, Mat B, Mat X, PetscScalar **_y, PetscBLASInt *_ylda, PetscBLASInt *_m, PetscBLASInt *_nrhs, PetscBLASInt *_k) 6704905a7bcSToby Isaac { 6714905a7bcSToby Isaac PetscErrorCode ierr; 6724905a7bcSToby Isaac const PetscScalar *b; 6734396437dSToby Isaac PetscScalar *y; 6744905a7bcSToby Isaac PetscInt n, _blda, _xlda; 6754396437dSToby Isaac PetscBLASInt nrhs=0,m=0,k=0,blda=0,xlda=0,ylda=0; 6764905a7bcSToby Isaac 6774905a7bcSToby Isaac PetscFunctionBegin; 67837b8ee88SJose E. Roman *_ylda=0; *_m=0; *_nrhs=0; *_k=0; 6794905a7bcSToby Isaac ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 6804905a7bcSToby Isaac ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr); 6814905a7bcSToby Isaac ierr = MatGetSize(B,NULL,&n);CHKERRQ(ierr); 6824905a7bcSToby Isaac ierr = PetscBLASIntCast(n,&nrhs);CHKERRQ(ierr); 6834905a7bcSToby Isaac ierr = MatDenseGetLDA(B,&_blda);CHKERRQ(ierr); 6844905a7bcSToby Isaac ierr = PetscBLASIntCast(_blda, &blda);CHKERRQ(ierr); 6854905a7bcSToby Isaac ierr = MatDenseGetLDA(X,&_xlda);CHKERRQ(ierr); 6864905a7bcSToby Isaac ierr = PetscBLASIntCast(_xlda, &xlda);CHKERRQ(ierr); 6874905a7bcSToby Isaac if (xlda < m) { 6884396437dSToby Isaac ierr = MatDenseGetArrayRead(B,&b);CHKERRQ(ierr); 6894396437dSToby Isaac ierr = PetscMalloc1(nrhs * m, &y);CHKERRQ(ierr); 6904905a7bcSToby Isaac if (blda == m) { 6914396437dSToby Isaac ierr = PetscArraycpy(y,b,blda*nrhs);CHKERRQ(ierr); 6924905a7bcSToby Isaac } else { 6934905a7bcSToby Isaac for (PetscInt j = 0; j < nrhs; j++) { 6944396437dSToby Isaac ierr = PetscArraycpy(&y[j*m],&b[j*blda],m);CHKERRQ(ierr); 6954905a7bcSToby Isaac } 6964905a7bcSToby Isaac } 6974396437dSToby Isaac ylda = m; 6984396437dSToby Isaac ierr = MatDenseRestoreArrayRead(B,&b);CHKERRQ(ierr); 6994905a7bcSToby Isaac } else { 7004905a7bcSToby Isaac if (blda == xlda) { 7014396437dSToby Isaac ierr = MatCopy(B, X, SAME_NONZERO_PATTERN);CHKERRQ(ierr); 7024396437dSToby Isaac ierr = MatDenseGetArray(X,&y);CHKERRQ(ierr); 7034905a7bcSToby Isaac } else { 7044396437dSToby Isaac ierr = MatDenseGetArray(X,&y);CHKERRQ(ierr); 7054396437dSToby Isaac ierr = MatDenseGetArrayRead(B,&b);CHKERRQ(ierr); 7064905a7bcSToby Isaac for (PetscInt j = 0; j < nrhs; j++) { 7074396437dSToby Isaac ierr = PetscArraycpy(&y[j*xlda],&b[j*blda],m);CHKERRQ(ierr); 7084905a7bcSToby Isaac } 7094396437dSToby Isaac ierr = MatDenseRestoreArrayRead(B,&b);CHKERRQ(ierr); 7104905a7bcSToby Isaac } 7114396437dSToby Isaac ylda = xlda; 7124905a7bcSToby Isaac } 7134396437dSToby Isaac *_y = y; 7144396437dSToby Isaac *_ylda = ylda; 7154396437dSToby Isaac *_k = k; 7164396437dSToby Isaac *_m = m; 7174396437dSToby Isaac *_nrhs = nrhs; 7184396437dSToby Isaac PetscFunctionReturn(0); 7194396437dSToby Isaac } 7204396437dSToby Isaac 7214396437dSToby Isaac static PetscErrorCode MatMatSolve_SeqDense_TearDown(Mat A, Mat B, Mat X, PetscScalar **_y, PetscBLASInt *_ylda, PetscBLASInt *_m, PetscBLASInt *_nrhs, PetscBLASInt *_k) 7224396437dSToby Isaac { 7234396437dSToby Isaac PetscScalar *y; 7244396437dSToby Isaac PetscInt _xlda; 7254396437dSToby Isaac PetscBLASInt k,ylda,nrhs,xlda=0; 7264396437dSToby Isaac PetscErrorCode ierr; 7274396437dSToby Isaac 7284396437dSToby Isaac PetscFunctionBegin; 7294396437dSToby Isaac y = *_y; 7304396437dSToby Isaac *_y = NULL; 7314396437dSToby Isaac k = *_k; 7324396437dSToby Isaac ylda = *_ylda; 7334396437dSToby Isaac nrhs = *_nrhs; 7344396437dSToby Isaac ierr = MatDenseGetLDA(X,&_xlda);CHKERRQ(ierr); 7354396437dSToby Isaac ierr = PetscBLASIntCast(_xlda, &xlda);CHKERRQ(ierr); 7364396437dSToby Isaac if (xlda != ylda) { 7374905a7bcSToby Isaac PetscScalar *xv; 7384905a7bcSToby Isaac ierr = MatDenseGetArray(X,&xv);CHKERRQ(ierr); 7394905a7bcSToby Isaac for (PetscInt j = 0; j < nrhs; j++) { 7404396437dSToby Isaac ierr = PetscArraycpy(&xv[j*xlda],&y[j*ylda],k);CHKERRQ(ierr); 7414905a7bcSToby Isaac } 7424905a7bcSToby Isaac ierr = MatDenseRestoreArray(X,&xv);CHKERRQ(ierr); 7434396437dSToby Isaac ierr = PetscFree(y);CHKERRQ(ierr); 7444905a7bcSToby Isaac } else { 7454396437dSToby Isaac ierr = MatDenseRestoreArray(X,&y);CHKERRQ(ierr); 7464905a7bcSToby Isaac } 74785e2c93fSHong Zhang PetscFunctionReturn(0); 74885e2c93fSHong Zhang } 74985e2c93fSHong Zhang 7504396437dSToby Isaac static PetscErrorCode MatMatSolve_SeqDense_LU(Mat A, Mat B, Mat X) 7514396437dSToby Isaac { 7524396437dSToby Isaac PetscScalar *y; 7534396437dSToby Isaac PetscBLASInt m, k, ylda, nrhs; 7544396437dSToby Isaac PetscErrorCode ierr; 7554396437dSToby Isaac 7564396437dSToby Isaac PetscFunctionBegin; 7574396437dSToby Isaac ierr = MatMatSolve_SeqDense_SetUp(A, B, X, &y, &ylda, &m, &nrhs, &k);CHKERRQ(ierr); 7584396437dSToby Isaac ierr = MatSolve_SeqDense_Internal_LU(A, y, ylda, m, nrhs, k, PETSC_FALSE);CHKERRQ(ierr); 7594396437dSToby Isaac ierr = MatMatSolve_SeqDense_TearDown(A, B, X, &y, &ylda, &m, &nrhs, &k);CHKERRQ(ierr); 7604396437dSToby Isaac PetscFunctionReturn(0); 7614396437dSToby Isaac } 7624396437dSToby Isaac 7634396437dSToby Isaac static PetscErrorCode MatMatSolveTranspose_SeqDense_LU(Mat A, Mat B, Mat X) 7644396437dSToby Isaac { 7654396437dSToby Isaac PetscScalar *y; 7664396437dSToby Isaac PetscBLASInt m, k, ylda, nrhs; 7674396437dSToby Isaac PetscErrorCode ierr; 7684396437dSToby Isaac 7694396437dSToby Isaac PetscFunctionBegin; 7704396437dSToby Isaac ierr = MatMatSolve_SeqDense_SetUp(A, B, X, &y, &ylda, &m, &nrhs, &k);CHKERRQ(ierr); 7714396437dSToby Isaac ierr = MatSolve_SeqDense_Internal_LU(A, y, ylda, m, nrhs, k, PETSC_TRUE);CHKERRQ(ierr); 7724396437dSToby Isaac ierr = MatMatSolve_SeqDense_TearDown(A, B, X, &y, &ylda, &m, &nrhs, &k);CHKERRQ(ierr); 7734396437dSToby Isaac PetscFunctionReturn(0); 7744396437dSToby Isaac } 7754396437dSToby Isaac 7764396437dSToby Isaac static PetscErrorCode MatMatSolve_SeqDense_Cholesky(Mat A, Mat B, Mat X) 7774396437dSToby Isaac { 7784396437dSToby Isaac PetscScalar *y; 7794396437dSToby Isaac PetscBLASInt m, k, ylda, nrhs; 7804396437dSToby Isaac PetscErrorCode ierr; 7814396437dSToby Isaac 7824396437dSToby Isaac PetscFunctionBegin; 7834396437dSToby Isaac ierr = MatMatSolve_SeqDense_SetUp(A, B, X, &y, &ylda, &m, &nrhs, &k);CHKERRQ(ierr); 7844396437dSToby Isaac ierr = MatSolve_SeqDense_Internal_Cholesky(A, y, ylda, m, nrhs, k, PETSC_FALSE);CHKERRQ(ierr); 7854396437dSToby Isaac ierr = MatMatSolve_SeqDense_TearDown(A, B, X, &y, &ylda, &m, &nrhs, &k);CHKERRQ(ierr); 7864396437dSToby Isaac PetscFunctionReturn(0); 7874396437dSToby Isaac } 7884396437dSToby Isaac 7894396437dSToby Isaac static PetscErrorCode MatMatSolveTranspose_SeqDense_Cholesky(Mat A, Mat B, Mat X) 7904396437dSToby Isaac { 7914396437dSToby Isaac PetscScalar *y; 7924396437dSToby Isaac PetscBLASInt m, k, ylda, nrhs; 7934396437dSToby Isaac PetscErrorCode ierr; 7944396437dSToby Isaac 7954396437dSToby Isaac PetscFunctionBegin; 7964396437dSToby Isaac ierr = MatMatSolve_SeqDense_SetUp(A, B, X, &y, &ylda, &m, &nrhs, &k);CHKERRQ(ierr); 7974396437dSToby Isaac ierr = MatSolve_SeqDense_Internal_Cholesky(A, y, ylda, m, nrhs, k, PETSC_TRUE);CHKERRQ(ierr); 7984396437dSToby Isaac ierr = MatMatSolve_SeqDense_TearDown(A, B, X, &y, &ylda, &m, &nrhs, &k);CHKERRQ(ierr); 7994396437dSToby Isaac PetscFunctionReturn(0); 8004396437dSToby Isaac } 8014396437dSToby Isaac 8024396437dSToby Isaac static PetscErrorCode MatMatSolve_SeqDense_QR(Mat A, Mat B, Mat X) 8034396437dSToby Isaac { 8044396437dSToby Isaac PetscScalar *y; 8054396437dSToby Isaac PetscBLASInt m, k, ylda, nrhs; 8064396437dSToby Isaac PetscErrorCode ierr; 8074396437dSToby Isaac 8084396437dSToby Isaac PetscFunctionBegin; 8094396437dSToby Isaac ierr = MatMatSolve_SeqDense_SetUp(A, B, X, &y, &ylda, &m, &nrhs, &k);CHKERRQ(ierr); 8104396437dSToby Isaac ierr = MatSolve_SeqDense_Internal_QR(A, y, ylda, m, nrhs, k);CHKERRQ(ierr); 8114396437dSToby Isaac ierr = MatMatSolve_SeqDense_TearDown(A, B, X, &y, &ylda, &m, &nrhs, &k);CHKERRQ(ierr); 8124396437dSToby Isaac PetscFunctionReturn(0); 8134396437dSToby Isaac } 8144396437dSToby Isaac 8154396437dSToby Isaac static PetscErrorCode MatMatSolveTranspose_SeqDense_QR(Mat A, Mat B, Mat X) 8164396437dSToby Isaac { 8174396437dSToby Isaac PetscScalar *y; 8184396437dSToby Isaac PetscBLASInt m, k, ylda, nrhs; 8194396437dSToby Isaac PetscErrorCode ierr; 8204396437dSToby Isaac 8214396437dSToby Isaac PetscFunctionBegin; 8224396437dSToby Isaac ierr = MatMatSolve_SeqDense_SetUp(A, B, X, &y, &ylda, &m, &nrhs, &k);CHKERRQ(ierr); 8234396437dSToby Isaac ierr = MatSolveTranspose_SeqDense_Internal_QR(A, y, ylda, m, nrhs, k);CHKERRQ(ierr); 8244396437dSToby Isaac ierr = MatMatSolve_SeqDense_TearDown(A, B, X, &y, &ylda, &m, &nrhs, &k);CHKERRQ(ierr); 8254396437dSToby Isaac PetscFunctionReturn(0); 8264396437dSToby Isaac } 8274396437dSToby Isaac 82800121966SStefano Zampini static PetscErrorCode MatConjugate_SeqDense(Mat); 82900121966SStefano Zampini 830db4efbfdSBarry Smith /* ---------------------------------------------------------------*/ 831db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots, 832db4efbfdSBarry Smith rather than put it in the Mat->row slot.*/ 833ca15aa20SStefano Zampini PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo) 834db4efbfdSBarry Smith { 835db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 836db4efbfdSBarry Smith PetscErrorCode ierr; 837db4efbfdSBarry Smith PetscBLASInt n,m,info; 838db4efbfdSBarry Smith 839db4efbfdSBarry Smith PetscFunctionBegin; 840c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 841c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 842db4efbfdSBarry Smith if (!mat->pivots) { 8438208b9aeSStefano Zampini ierr = PetscMalloc1(A->rmap->n,&mat->pivots);CHKERRQ(ierr); 8443bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr); 845db4efbfdSBarry Smith } 846db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 8478e57ea43SSatish Balay ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 8488b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrf",LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info)); 8498e57ea43SSatish Balay ierr = PetscFPTrapPop();CHKERRQ(ierr); 8508e57ea43SSatish Balay 851e32f2f54SBarry Smith if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization"); 852e32f2f54SBarry Smith if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization"); 8538208b9aeSStefano Zampini 8544396437dSToby Isaac A->ops->solve = MatSolve_SeqDense_LU; 8554396437dSToby Isaac A->ops->matsolve = MatMatSolve_SeqDense_LU; 8564396437dSToby Isaac A->ops->solvetranspose = MatSolveTranspose_SeqDense_LU; 8574396437dSToby Isaac A->ops->matsolvetranspose = MatMatSolveTranspose_SeqDense_LU; 858d5f3da31SBarry Smith A->factortype = MAT_FACTOR_LU; 859db4efbfdSBarry Smith 860f6224b95SHong Zhang ierr = PetscFree(A->solvertype);CHKERRQ(ierr); 861f6224b95SHong Zhang ierr = PetscStrallocpy(MATSOLVERPETSC,&A->solvertype);CHKERRQ(ierr); 862f6224b95SHong Zhang 863dc0b31edSSatish Balay ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr); 864db4efbfdSBarry Smith PetscFunctionReturn(0); 865db4efbfdSBarry Smith } 866db4efbfdSBarry Smith 8674396437dSToby Isaac static PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 8684396437dSToby Isaac { 8694396437dSToby Isaac MatFactorInfo info; 8704396437dSToby Isaac PetscErrorCode ierr; 8714396437dSToby Isaac 8724396437dSToby Isaac PetscFunctionBegin; 8734396437dSToby Isaac ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 8744396437dSToby Isaac ierr = (*fact->ops->lufactor)(fact,NULL,NULL,&info);CHKERRQ(ierr); 8754396437dSToby Isaac PetscFunctionReturn(0); 8764396437dSToby Isaac } 8774396437dSToby Isaac 8784396437dSToby Isaac PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info) 8794396437dSToby Isaac { 8804396437dSToby Isaac PetscFunctionBegin; 8814396437dSToby Isaac fact->preallocated = PETSC_TRUE; 8824396437dSToby Isaac fact->assembled = PETSC_TRUE; 8834396437dSToby Isaac fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense; 8844396437dSToby Isaac fact->ops->solve = MatSolve_SeqDense_LU; 8854396437dSToby Isaac fact->ops->matsolve = MatMatSolve_SeqDense_LU; 8864396437dSToby Isaac fact->ops->solvetranspose = MatSolveTranspose_SeqDense_LU; 8874396437dSToby Isaac PetscFunctionReturn(0); 8884396437dSToby Isaac } 8894396437dSToby Isaac 890a49dc2a2SStefano Zampini /* Cholesky as L*L^T or L*D*L^T and the symmetric/hermitian complex variants */ 891ca15aa20SStefano Zampini PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo) 892db4efbfdSBarry Smith { 893db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 894db4efbfdSBarry Smith PetscErrorCode ierr; 895c5df96a5SBarry Smith PetscBLASInt info,n; 896db4efbfdSBarry Smith 897db4efbfdSBarry Smith PetscFunctionBegin; 898c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 899db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 900a49dc2a2SStefano Zampini if (A->spd) { 90100121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 9028b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrf",LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info)); 90300121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 904a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX) 905a49dc2a2SStefano Zampini } else if (A->hermitian) { 906a49dc2a2SStefano Zampini if (!mat->pivots) { 907a49dc2a2SStefano Zampini ierr = PetscMalloc1(A->rmap->n,&mat->pivots);CHKERRQ(ierr); 908a49dc2a2SStefano Zampini ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr); 909a49dc2a2SStefano Zampini } 910a49dc2a2SStefano Zampini if (!mat->fwork) { 911a49dc2a2SStefano Zampini PetscScalar dummy; 912a49dc2a2SStefano Zampini 913a49dc2a2SStefano Zampini mat->lfwork = -1; 91400121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 915a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKhetrf",LAPACKhetrf_("L",&n,mat->v,&mat->lda,mat->pivots,&dummy,&mat->lfwork,&info)); 91600121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 917a49dc2a2SStefano Zampini mat->lfwork = (PetscInt)PetscRealPart(dummy); 918a49dc2a2SStefano Zampini ierr = PetscMalloc1(mat->lfwork,&mat->fwork);CHKERRQ(ierr); 919a49dc2a2SStefano Zampini ierr = PetscLogObjectMemory((PetscObject)A,mat->lfwork*sizeof(PetscBLASInt));CHKERRQ(ierr); 920a49dc2a2SStefano Zampini } 92100121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 922a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKhetrf",LAPACKhetrf_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&mat->lfwork,&info)); 92300121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 924a49dc2a2SStefano Zampini #endif 925a49dc2a2SStefano Zampini } else { /* symmetric case */ 926a49dc2a2SStefano Zampini if (!mat->pivots) { 927a49dc2a2SStefano Zampini ierr = PetscMalloc1(A->rmap->n,&mat->pivots);CHKERRQ(ierr); 928a49dc2a2SStefano Zampini ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr); 929a49dc2a2SStefano Zampini } 930a49dc2a2SStefano Zampini if (!mat->fwork) { 931a49dc2a2SStefano Zampini PetscScalar dummy; 932a49dc2a2SStefano Zampini 933a49dc2a2SStefano Zampini mat->lfwork = -1; 93400121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 935a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrf",LAPACKsytrf_("L",&n,mat->v,&mat->lda,mat->pivots,&dummy,&mat->lfwork,&info)); 93600121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 937a49dc2a2SStefano Zampini mat->lfwork = (PetscInt)PetscRealPart(dummy); 938a49dc2a2SStefano Zampini ierr = PetscMalloc1(mat->lfwork,&mat->fwork);CHKERRQ(ierr); 939a49dc2a2SStefano Zampini ierr = PetscLogObjectMemory((PetscObject)A,mat->lfwork*sizeof(PetscBLASInt));CHKERRQ(ierr); 940a49dc2a2SStefano Zampini } 94100121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 942a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrf",LAPACKsytrf_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&mat->lfwork,&info)); 94300121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 944a49dc2a2SStefano Zampini } 945e32f2f54SBarry Smith if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1); 9468208b9aeSStefano Zampini 9474396437dSToby Isaac A->ops->solve = MatSolve_SeqDense_Cholesky; 9484396437dSToby Isaac A->ops->matsolve = MatMatSolve_SeqDense_Cholesky; 9494396437dSToby Isaac A->ops->solvetranspose = MatSolveTranspose_SeqDense_Cholesky; 9504396437dSToby Isaac A->ops->matsolvetranspose = MatMatSolveTranspose_SeqDense_Cholesky; 951d5f3da31SBarry Smith A->factortype = MAT_FACTOR_CHOLESKY; 9522205254eSKarl Rupp 953f6224b95SHong Zhang ierr = PetscFree(A->solvertype);CHKERRQ(ierr); 954f6224b95SHong Zhang ierr = PetscStrallocpy(MATSOLVERPETSC,&A->solvertype);CHKERRQ(ierr); 955f6224b95SHong Zhang 956eb3f19e4SBarry Smith ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr); 957db4efbfdSBarry Smith PetscFunctionReturn(0); 958db4efbfdSBarry Smith } 959db4efbfdSBarry Smith 9604396437dSToby Isaac static PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 961db4efbfdSBarry Smith { 962db4efbfdSBarry Smith PetscErrorCode ierr; 963db4efbfdSBarry Smith MatFactorInfo info; 964db4efbfdSBarry Smith 965db4efbfdSBarry Smith PetscFunctionBegin; 966db4efbfdSBarry Smith info.fill = 1.0; 9672205254eSKarl Rupp 968c3ef05f6SHong Zhang ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 969f4259b30SLisandro Dalcin ierr = (*fact->ops->choleskyfactor)(fact,NULL,&info);CHKERRQ(ierr); 970db4efbfdSBarry Smith PetscFunctionReturn(0); 971db4efbfdSBarry Smith } 972db4efbfdSBarry Smith 973ca15aa20SStefano Zampini PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info) 974db4efbfdSBarry Smith { 975db4efbfdSBarry Smith PetscFunctionBegin; 976c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 9771bbcc794SSatish Balay fact->preallocated = PETSC_TRUE; 978719d5645SBarry Smith fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense; 9794396437dSToby Isaac fact->ops->solve = MatSolve_SeqDense_Cholesky; 9804396437dSToby Isaac fact->ops->matsolve = MatMatSolve_SeqDense_Cholesky; 9814396437dSToby Isaac fact->ops->solvetranspose = MatSolve_SeqDense_Cholesky; 982db4efbfdSBarry Smith PetscFunctionReturn(0); 983db4efbfdSBarry Smith } 984db4efbfdSBarry Smith 9854905a7bcSToby Isaac static PetscErrorCode MatQRFactor_SeqDense(Mat A,IS col,const MatFactorInfo *minfo) 9864905a7bcSToby Isaac { 9874905a7bcSToby Isaac Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 9884905a7bcSToby Isaac PetscErrorCode ierr; 9894905a7bcSToby Isaac PetscBLASInt n,m,info, min, max; 9904905a7bcSToby Isaac 9914905a7bcSToby Isaac PetscFunctionBegin; 9924905a7bcSToby Isaac ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 9934905a7bcSToby Isaac ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 9944396437dSToby Isaac max = PetscMax(m, n); 9954396437dSToby Isaac min = PetscMin(m, n); 9964905a7bcSToby Isaac if (!mat->tau) { 9974396437dSToby Isaac ierr = PetscMalloc1(min,&mat->tau);CHKERRQ(ierr); 9984396437dSToby Isaac ierr = PetscLogObjectMemory((PetscObject)A,min*sizeof(PetscScalar));CHKERRQ(ierr); 9994396437dSToby Isaac } 10004396437dSToby Isaac if (!mat->pivots) { 10014396437dSToby Isaac ierr = PetscMalloc1(m,&mat->pivots);CHKERRQ(ierr); 10024396437dSToby Isaac ierr = PetscLogObjectMemory((PetscObject)A,m*sizeof(PetscScalar));CHKERRQ(ierr); 10034396437dSToby Isaac } 10044396437dSToby Isaac if (!mat->qrrhs) { 10054396437dSToby Isaac ierr = MatCreateVecs(A, NULL, &(mat->qrrhs));CHKERRQ(ierr); 10064905a7bcSToby Isaac } 10074905a7bcSToby Isaac if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 10084905a7bcSToby Isaac if (!mat->fwork) { 10094905a7bcSToby Isaac PetscScalar dummy; 10104905a7bcSToby Isaac 10114905a7bcSToby Isaac mat->lfwork = -1; 10124905a7bcSToby Isaac ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 10134905a7bcSToby Isaac PetscStackCallBLAS("LAPACKgeqrf",LAPACKgeqrf_(&m,&n,mat->v,&mat->lda,mat->tau,&dummy,&mat->lfwork,&info)); 10144905a7bcSToby Isaac ierr = PetscFPTrapPop();CHKERRQ(ierr); 10154905a7bcSToby Isaac mat->lfwork = (PetscInt)PetscRealPart(dummy); 10164905a7bcSToby Isaac ierr = PetscMalloc1(mat->lfwork,&mat->fwork);CHKERRQ(ierr); 10174905a7bcSToby Isaac ierr = PetscLogObjectMemory((PetscObject)A,mat->lfwork*sizeof(PetscBLASInt));CHKERRQ(ierr); 10184905a7bcSToby Isaac } 10194905a7bcSToby Isaac ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 10204905a7bcSToby Isaac PetscStackCallBLAS("LAPACKgeqrf",LAPACKgeqrf_(&m,&n,mat->v,&mat->lda,mat->tau,mat->fwork,&mat->lfwork,&info)); 10214905a7bcSToby Isaac ierr = PetscFPTrapPop();CHKERRQ(ierr); 10224905a7bcSToby Isaac if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to QR factorization"); 10234905a7bcSToby 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 10244905a7bcSToby Isaac mat->rank = min; 10254905a7bcSToby Isaac 10264396437dSToby Isaac A->ops->solve = MatSolve_SeqDense_QR; 10274396437dSToby Isaac A->ops->matsolve = MatMatSolve_SeqDense_QR; 10284905a7bcSToby Isaac A->factortype = MAT_FACTOR_QR; 10294905a7bcSToby Isaac if (m == n) { 10304396437dSToby Isaac A->ops->solvetranspose = MatSolveTranspose_SeqDense_QR; 10314396437dSToby Isaac A->ops->matsolvetranspose = MatMatSolveTranspose_SeqDense_QR; 10324905a7bcSToby Isaac } 10334905a7bcSToby Isaac 10344905a7bcSToby Isaac ierr = PetscFree(A->solvertype);CHKERRQ(ierr); 10354905a7bcSToby Isaac ierr = PetscStrallocpy(MATSOLVERPETSC,&A->solvertype);CHKERRQ(ierr); 10364905a7bcSToby Isaac 10374905a7bcSToby Isaac ierr = PetscLogFlops(2.0*min*min*(max-min/3.0));CHKERRQ(ierr); 10384905a7bcSToby Isaac PetscFunctionReturn(0); 10394905a7bcSToby Isaac } 10404905a7bcSToby Isaac 10414905a7bcSToby Isaac static PetscErrorCode MatQRFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 10424905a7bcSToby Isaac { 10434905a7bcSToby Isaac PetscErrorCode ierr; 10444905a7bcSToby Isaac MatFactorInfo info; 10454905a7bcSToby Isaac 10464905a7bcSToby Isaac PetscFunctionBegin; 10474905a7bcSToby Isaac info.fill = 1.0; 10484905a7bcSToby Isaac 10494905a7bcSToby Isaac ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 10504905a7bcSToby Isaac ierr = MatQRFactor_SeqDense(fact,NULL,&info);CHKERRQ(ierr); 10514905a7bcSToby Isaac PetscFunctionReturn(0); 10524905a7bcSToby Isaac } 10534905a7bcSToby Isaac 10544905a7bcSToby Isaac static PetscErrorCode MatQRFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info) 10554905a7bcSToby Isaac { 10564905a7bcSToby Isaac PetscErrorCode ierr; 10574905a7bcSToby Isaac 10584905a7bcSToby Isaac PetscFunctionBegin; 10594905a7bcSToby Isaac fact->assembled = PETSC_TRUE; 10604905a7bcSToby Isaac fact->preallocated = PETSC_TRUE; 10614396437dSToby Isaac fact->ops->solve = MatSolve_SeqDense_QR; 10624396437dSToby Isaac fact->ops->matsolve = MatMatSolve_SeqDense_QR; 10634396437dSToby Isaac if (A->cmap->n == A->rmap->n) { 10644396437dSToby Isaac fact->ops->solvetranspose = MatSolveTranspose_SeqDense_QR; 10654396437dSToby Isaac fact->ops->matsolvetranspose = MatMatSolveTranspose_SeqDense_QR; 10664396437dSToby Isaac } 10674905a7bcSToby Isaac ierr = PetscObjectComposeFunction((PetscObject)fact,"MatQRFactorNumeric_C",MatQRFactorNumeric_SeqDense);CHKERRQ(ierr); 10684905a7bcSToby Isaac PetscFunctionReturn(0); 10694905a7bcSToby Isaac } 10704905a7bcSToby Isaac 10714905a7bcSToby Isaac 1072ca15aa20SStefano Zampini /* uses LAPACK */ 1073cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact) 1074db4efbfdSBarry Smith { 1075db4efbfdSBarry Smith PetscErrorCode ierr; 1076db4efbfdSBarry Smith 1077db4efbfdSBarry Smith PetscFunctionBegin; 1078ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),fact);CHKERRQ(ierr); 1079db4efbfdSBarry Smith ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 1080ca15aa20SStefano Zampini ierr = MatSetType(*fact,MATDENSE);CHKERRQ(ierr); 10812a350339SBarry Smith if (ftype == MAT_FACTOR_LU || ftype == MAT_FACTOR_ILU) { 1082db4efbfdSBarry Smith (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense; 10832a350339SBarry Smith (*fact)->ops->ilufactorsymbolic = MatLUFactorSymbolic_SeqDense; 1084db4efbfdSBarry Smith } else { 1085db4efbfdSBarry Smith (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense; 1086db4efbfdSBarry Smith } 1087d5f3da31SBarry Smith (*fact)->factortype = ftype; 108800c67f3bSHong Zhang 108900c67f3bSHong Zhang ierr = PetscFree((*fact)->solvertype);CHKERRQ(ierr); 109000c67f3bSHong Zhang ierr = PetscStrallocpy(MATSOLVERPETSC,&(*fact)->solvertype);CHKERRQ(ierr); 10914ac6704cSBarry Smith ierr = PetscStrallocpy(MATORDERINGEXTERNAL,(char**)&(*fact)->preferredordering[MAT_FACTOR_LU]);CHKERRQ(ierr); 10924ac6704cSBarry Smith ierr = PetscStrallocpy(MATORDERINGEXTERNAL,(char**)&(*fact)->preferredordering[MAT_FACTOR_ILU]);CHKERRQ(ierr); 10934ac6704cSBarry Smith ierr = PetscStrallocpy(MATORDERINGEXTERNAL,(char**)&(*fact)->preferredordering[MAT_FACTOR_CHOLESKY]);CHKERRQ(ierr); 10944ac6704cSBarry Smith ierr = PetscStrallocpy(MATORDERINGEXTERNAL,(char**)&(*fact)->preferredordering[MAT_FACTOR_ICC]);CHKERRQ(ierr); 1095db4efbfdSBarry Smith PetscFunctionReturn(0); 1096db4efbfdSBarry Smith } 1097db4efbfdSBarry Smith 1098289bc588SBarry Smith /* ------------------------------------------------------------------*/ 1099e0877f53SBarry Smith static PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx) 1100289bc588SBarry Smith { 1101c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1102d9ca1df4SBarry Smith PetscScalar *x,*v = mat->v,zero = 0.0,xt; 1103d9ca1df4SBarry Smith const PetscScalar *b; 1104dfbe8321SBarry Smith PetscErrorCode ierr; 1105d0f46423SBarry Smith PetscInt m = A->rmap->n,i; 110623fff9afSBarry Smith PetscBLASInt o = 1,bm = 0; 1107289bc588SBarry Smith 11083a40ed3dSBarry Smith PetscFunctionBegin; 1109ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA) 1110c70f7ee4SJunchao Zhang if (A->offloadmask == PETSC_OFFLOAD_GPU) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Not implemented"); 1111ca15aa20SStefano Zampini #endif 1112422a814eSBarry Smith if (shift == -1) shift = 0.0; /* negative shift indicates do not error on zero diagonal; this code never zeros on zero diagonal */ 1113c5df96a5SBarry Smith ierr = PetscBLASIntCast(m,&bm);CHKERRQ(ierr); 1114289bc588SBarry Smith if (flag & SOR_ZERO_INITIAL_GUESS) { 11153bffc371SBarry Smith /* this is a hack fix, should have another version without the second BLASdotu */ 11162dcb1b2aSMatthew Knepley ierr = VecSet(xx,zero);CHKERRQ(ierr); 1117289bc588SBarry Smith } 11181ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 1119d9ca1df4SBarry Smith ierr = VecGetArrayRead(bb,&b);CHKERRQ(ierr); 1120b965ef7fSBarry Smith its = its*lits; 1121e32f2f54SBarry Smith if (its <= 0) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Relaxation requires global its %D and local its %D both positive",its,lits); 1122289bc588SBarry Smith while (its--) { 1123fccaa45eSBarry Smith if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) { 1124289bc588SBarry Smith for (i=0; i<m; i++) { 11253bffc371SBarry Smith PetscStackCallBLAS("BLASdotu",xt = b[i] - BLASdotu_(&bm,v+i,&bm,x,&o)); 112655a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 1127289bc588SBarry Smith } 1128289bc588SBarry Smith } 1129fccaa45eSBarry Smith if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) { 1130289bc588SBarry Smith for (i=m-1; i>=0; i--) { 11313bffc371SBarry Smith PetscStackCallBLAS("BLASdotu",xt = b[i] - BLASdotu_(&bm,v+i,&bm,x,&o)); 113255a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 1133289bc588SBarry Smith } 1134289bc588SBarry Smith } 1135289bc588SBarry Smith } 1136d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(bb,&b);CHKERRQ(ierr); 11371ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 11383a40ed3dSBarry Smith PetscFunctionReturn(0); 1139289bc588SBarry Smith } 1140289bc588SBarry Smith 1141289bc588SBarry Smith /* -----------------------------------------------------------------*/ 1142ca15aa20SStefano Zampini PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy) 1143289bc588SBarry Smith { 1144c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1145d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 1146d9ca1df4SBarry Smith PetscScalar *y; 1147dfbe8321SBarry Smith PetscErrorCode ierr; 11480805154bSBarry Smith PetscBLASInt m, n,_One=1; 1149ea709b57SSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 11503a40ed3dSBarry Smith 11513a40ed3dSBarry Smith PetscFunctionBegin; 1152c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 1153c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 1154d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 11552bf066beSStefano Zampini ierr = VecGetArrayWrite(yy,&y);CHKERRQ(ierr); 11565ac36cfcSBarry Smith if (!A->rmap->n || !A->cmap->n) { 11575ac36cfcSBarry Smith PetscBLASInt i; 11585ac36cfcSBarry Smith for (i=0; i<n; i++) y[i] = 0.0; 11595ac36cfcSBarry Smith } else { 11608b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One)); 11615ac36cfcSBarry Smith ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 11625ac36cfcSBarry Smith } 1163d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 11642bf066beSStefano Zampini ierr = VecRestoreArrayWrite(yy,&y);CHKERRQ(ierr); 11653a40ed3dSBarry Smith PetscFunctionReturn(0); 1166289bc588SBarry Smith } 1167800995b7SMatthew Knepley 1168ca15aa20SStefano Zampini PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy) 1169289bc588SBarry Smith { 1170c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1171d9ca1df4SBarry Smith PetscScalar *y,_DOne=1.0,_DZero=0.0; 1172dfbe8321SBarry Smith PetscErrorCode ierr; 11730805154bSBarry Smith PetscBLASInt m, n, _One=1; 1174d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 11753a40ed3dSBarry Smith 11763a40ed3dSBarry Smith PetscFunctionBegin; 1177c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 1178c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 1179d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 11802bf066beSStefano Zampini ierr = VecGetArrayWrite(yy,&y);CHKERRQ(ierr); 11815ac36cfcSBarry Smith if (!A->rmap->n || !A->cmap->n) { 11825ac36cfcSBarry Smith PetscBLASInt i; 11835ac36cfcSBarry Smith for (i=0; i<m; i++) y[i] = 0.0; 11845ac36cfcSBarry Smith } else { 11858b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One)); 11865ac36cfcSBarry Smith ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr); 11875ac36cfcSBarry Smith } 1188d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 11892bf066beSStefano Zampini ierr = VecRestoreArrayWrite(yy,&y);CHKERRQ(ierr); 11903a40ed3dSBarry Smith PetscFunctionReturn(0); 1191289bc588SBarry Smith } 11926ee01492SSatish Balay 1193ca15aa20SStefano Zampini PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 1194289bc588SBarry Smith { 1195c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1196d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 1197d9ca1df4SBarry Smith PetscScalar *y,_DOne=1.0; 1198dfbe8321SBarry Smith PetscErrorCode ierr; 11990805154bSBarry Smith PetscBLASInt m, n, _One=1; 12003a40ed3dSBarry Smith 12013a40ed3dSBarry Smith PetscFunctionBegin; 1202c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 1203c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 120417b127eeSStefano Zampini ierr = VecCopy(zz,yy);CHKERRQ(ierr); 1205d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 1206d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 12071ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 12088b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One)); 1209d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 12101ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 1211dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 12123a40ed3dSBarry Smith PetscFunctionReturn(0); 1213289bc588SBarry Smith } 12146ee01492SSatish Balay 1215ca15aa20SStefano Zampini PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 1216289bc588SBarry Smith { 1217c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1218d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 1219d9ca1df4SBarry Smith PetscScalar *y; 1220dfbe8321SBarry Smith PetscErrorCode ierr; 12210805154bSBarry Smith PetscBLASInt m, n, _One=1; 122287828ca2SBarry Smith PetscScalar _DOne=1.0; 12233a40ed3dSBarry Smith 12243a40ed3dSBarry Smith PetscFunctionBegin; 1225c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 1226c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 122717b127eeSStefano Zampini ierr = VecCopy(zz,yy);CHKERRQ(ierr); 1228d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 1229d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 12301ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 12318b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One)); 1232d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 12331ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 1234dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 12353a40ed3dSBarry Smith PetscFunctionReturn(0); 1236289bc588SBarry Smith } 1237289bc588SBarry Smith 1238289bc588SBarry Smith /* -----------------------------------------------------------------*/ 1239e0877f53SBarry Smith static PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 1240289bc588SBarry Smith { 1241c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 12426849ba73SBarry Smith PetscErrorCode ierr; 124313f74950SBarry Smith PetscInt i; 124467e560aaSBarry Smith 12453a40ed3dSBarry Smith PetscFunctionBegin; 1246d0f46423SBarry Smith *ncols = A->cmap->n; 1247289bc588SBarry Smith if (cols) { 12483741e84bSPierre Jolivet ierr = PetscMalloc1(A->cmap->n,cols);CHKERRQ(ierr); 1249d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) (*cols)[i] = i; 1250289bc588SBarry Smith } 1251289bc588SBarry Smith if (vals) { 1252ca15aa20SStefano Zampini const PetscScalar *v; 1253ca15aa20SStefano Zampini 1254ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&v);CHKERRQ(ierr); 12553741e84bSPierre Jolivet ierr = PetscMalloc1(A->cmap->n,vals);CHKERRQ(ierr); 1256ca15aa20SStefano Zampini v += row; 1257d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;} 1258ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&v);CHKERRQ(ierr); 1259289bc588SBarry Smith } 12603a40ed3dSBarry Smith PetscFunctionReturn(0); 1261289bc588SBarry Smith } 12626ee01492SSatish Balay 1263e0877f53SBarry Smith static PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 1264289bc588SBarry Smith { 1265dfbe8321SBarry Smith PetscErrorCode ierr; 12666e111a19SKarl Rupp 1267606d414cSSatish Balay PetscFunctionBegin; 1268cb4a9cd9SHong Zhang if (ncols) *ncols = 0; 1269606d414cSSatish Balay if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);} 1270606d414cSSatish Balay if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); } 12713a40ed3dSBarry Smith PetscFunctionReturn(0); 1272289bc588SBarry Smith } 1273289bc588SBarry Smith /* ----------------------------------------------------------------*/ 1274e0877f53SBarry Smith static PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv) 1275289bc588SBarry Smith { 1276c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1277ca15aa20SStefano Zampini PetscScalar *av; 127813f74950SBarry Smith PetscInt i,j,idx=0; 1279ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA) 1280c70f7ee4SJunchao Zhang PetscOffloadMask oldf; 1281ca15aa20SStefano Zampini #endif 1282ca15aa20SStefano Zampini PetscErrorCode ierr; 1283d6dfbf8fSBarry Smith 12843a40ed3dSBarry Smith PetscFunctionBegin; 1285ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&av);CHKERRQ(ierr); 1286289bc588SBarry Smith if (!mat->roworiented) { 1287dbb450caSBarry Smith if (addv == INSERT_VALUES) { 1288289bc588SBarry Smith for (j=0; j<n; j++) { 1289cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 1290cf9c20a2SJed Brown if (PetscUnlikelyDebug(indexn[j] >= A->cmap->n)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1); 1291289bc588SBarry Smith for (i=0; i<m; i++) { 1292cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 1293cf9c20a2SJed Brown if (PetscUnlikelyDebug(indexm[i] >= A->rmap->n)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1); 1294ca15aa20SStefano Zampini av[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 1295289bc588SBarry Smith } 1296289bc588SBarry Smith } 12973a40ed3dSBarry Smith } else { 1298289bc588SBarry Smith for (j=0; j<n; j++) { 1299cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 1300cf9c20a2SJed Brown if (PetscUnlikelyDebug(indexn[j] >= A->cmap->n)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1); 1301289bc588SBarry Smith for (i=0; i<m; i++) { 1302cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 1303cf9c20a2SJed Brown if (PetscUnlikelyDebug(indexm[i] >= A->rmap->n)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1); 1304ca15aa20SStefano Zampini av[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 1305289bc588SBarry Smith } 1306289bc588SBarry Smith } 1307289bc588SBarry Smith } 13083a40ed3dSBarry Smith } else { 1309dbb450caSBarry Smith if (addv == INSERT_VALUES) { 1310e8d4e0b9SBarry Smith for (i=0; i<m; i++) { 1311cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 1312cf9c20a2SJed Brown if (PetscUnlikelyDebug(indexm[i] >= A->rmap->n)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1); 1313e8d4e0b9SBarry Smith for (j=0; j<n; j++) { 1314cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 1315cf9c20a2SJed Brown if (PetscUnlikelyDebug(indexn[j] >= A->cmap->n)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1); 1316ca15aa20SStefano Zampini av[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 1317e8d4e0b9SBarry Smith } 1318e8d4e0b9SBarry Smith } 13193a40ed3dSBarry Smith } else { 1320289bc588SBarry Smith for (i=0; i<m; i++) { 1321cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 1322cf9c20a2SJed Brown if (PetscUnlikelyDebug(indexm[i] >= A->rmap->n)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1); 1323289bc588SBarry Smith for (j=0; j<n; j++) { 1324cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 1325cf9c20a2SJed Brown if (PetscUnlikelyDebug(indexn[j] >= A->cmap->n)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1); 1326ca15aa20SStefano Zampini av[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 1327289bc588SBarry Smith } 1328289bc588SBarry Smith } 1329289bc588SBarry Smith } 1330e8d4e0b9SBarry Smith } 1331ca15aa20SStefano Zampini /* hack to prevent unneeded copy to the GPU while returning the array */ 1332ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA) 1333c70f7ee4SJunchao Zhang oldf = A->offloadmask; 1334c70f7ee4SJunchao Zhang A->offloadmask = PETSC_OFFLOAD_GPU; 1335ca15aa20SStefano Zampini #endif 1336ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&av);CHKERRQ(ierr); 1337ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA) 1338c70f7ee4SJunchao Zhang A->offloadmask = (oldf == PETSC_OFFLOAD_UNALLOCATED ? PETSC_OFFLOAD_UNALLOCATED : PETSC_OFFLOAD_CPU); 1339ca15aa20SStefano Zampini #endif 13403a40ed3dSBarry Smith PetscFunctionReturn(0); 1341289bc588SBarry Smith } 1342e8d4e0b9SBarry Smith 1343e0877f53SBarry Smith static PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[]) 1344ae80bb75SLois Curfman McInnes { 1345ae80bb75SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1346ca15aa20SStefano Zampini const PetscScalar *vv; 134713f74950SBarry Smith PetscInt i,j; 1348ca15aa20SStefano Zampini PetscErrorCode ierr; 1349ae80bb75SLois Curfman McInnes 13503a40ed3dSBarry Smith PetscFunctionBegin; 1351ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&vv);CHKERRQ(ierr); 1352ae80bb75SLois Curfman McInnes /* row-oriented output */ 1353ae80bb75SLois Curfman McInnes for (i=0; i<m; i++) { 135497e567efSBarry Smith if (indexm[i] < 0) {v += n;continue;} 1355e32f2f54SBarry Smith if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row %D requested larger than number rows %D",indexm[i],A->rmap->n); 1356ae80bb75SLois Curfman McInnes for (j=0; j<n; j++) { 13576f31f424SBarry Smith if (indexn[j] < 0) {v++; continue;} 1358e32f2f54SBarry Smith if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column %D requested larger than number columns %D",indexn[j],A->cmap->n); 1359ca15aa20SStefano Zampini *v++ = vv[indexn[j]*mat->lda + indexm[i]]; 1360ae80bb75SLois Curfman McInnes } 1361ae80bb75SLois Curfman McInnes } 1362ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&vv);CHKERRQ(ierr); 13633a40ed3dSBarry Smith PetscFunctionReturn(0); 1364ae80bb75SLois Curfman McInnes } 1365ae80bb75SLois Curfman McInnes 1366289bc588SBarry Smith /* -----------------------------------------------------------------*/ 1367289bc588SBarry Smith 13688491ab44SLisandro Dalcin PetscErrorCode MatView_Dense_Binary(Mat mat,PetscViewer viewer) 1369aabbc4fbSShri Abhyankar { 1370aabbc4fbSShri Abhyankar PetscErrorCode ierr; 13718491ab44SLisandro Dalcin PetscBool skipHeader; 13728491ab44SLisandro Dalcin PetscViewerFormat format; 13738491ab44SLisandro Dalcin PetscInt header[4],M,N,m,lda,i,j,k; 13748491ab44SLisandro Dalcin const PetscScalar *v; 13758491ab44SLisandro Dalcin PetscScalar *vwork; 1376aabbc4fbSShri Abhyankar 1377aabbc4fbSShri Abhyankar PetscFunctionBegin; 13788491ab44SLisandro Dalcin ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr); 13798491ab44SLisandro Dalcin ierr = PetscViewerBinaryGetSkipHeader(viewer,&skipHeader);CHKERRQ(ierr); 13808491ab44SLisandro Dalcin ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 13818491ab44SLisandro Dalcin if (skipHeader) format = PETSC_VIEWER_NATIVE; 1382aabbc4fbSShri Abhyankar 13838491ab44SLisandro Dalcin ierr = MatGetSize(mat,&M,&N);CHKERRQ(ierr); 13848491ab44SLisandro Dalcin 13858491ab44SLisandro Dalcin /* write matrix header */ 13868491ab44SLisandro Dalcin header[0] = MAT_FILE_CLASSID; header[1] = M; header[2] = N; 13878491ab44SLisandro Dalcin header[3] = (format == PETSC_VIEWER_NATIVE) ? MATRIX_BINARY_FORMAT_DENSE : M*N; 13888491ab44SLisandro Dalcin if (!skipHeader) {ierr = PetscViewerBinaryWrite(viewer,header,4,PETSC_INT);CHKERRQ(ierr);} 13898491ab44SLisandro Dalcin 13908491ab44SLisandro Dalcin ierr = MatGetLocalSize(mat,&m,NULL);CHKERRQ(ierr); 13918491ab44SLisandro Dalcin if (format != PETSC_VIEWER_NATIVE) { 13928491ab44SLisandro Dalcin PetscInt nnz = m*N, *iwork; 13938491ab44SLisandro Dalcin /* store row lengths for each row */ 13948491ab44SLisandro Dalcin ierr = PetscMalloc1(nnz,&iwork);CHKERRQ(ierr); 13958491ab44SLisandro Dalcin for (i=0; i<m; i++) iwork[i] = N; 13968491ab44SLisandro Dalcin ierr = PetscViewerBinaryWriteAll(viewer,iwork,m,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_INT);CHKERRQ(ierr); 13978491ab44SLisandro Dalcin /* store column indices (zero start index) */ 13988491ab44SLisandro Dalcin for (k=0, i=0; i<m; i++) 13998491ab44SLisandro Dalcin for (j=0; j<N; j++, k++) 14008491ab44SLisandro Dalcin iwork[k] = j; 14018491ab44SLisandro Dalcin ierr = PetscViewerBinaryWriteAll(viewer,iwork,nnz,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_INT);CHKERRQ(ierr); 14028491ab44SLisandro Dalcin ierr = PetscFree(iwork);CHKERRQ(ierr); 14038491ab44SLisandro Dalcin } 14048491ab44SLisandro Dalcin /* store matrix values as a dense matrix in row major order */ 14058491ab44SLisandro Dalcin ierr = PetscMalloc1(m*N,&vwork);CHKERRQ(ierr); 14068491ab44SLisandro Dalcin ierr = MatDenseGetArrayRead(mat,&v);CHKERRQ(ierr); 14078491ab44SLisandro Dalcin ierr = MatDenseGetLDA(mat,&lda);CHKERRQ(ierr); 14088491ab44SLisandro Dalcin for (k=0, i=0; i<m; i++) 14098491ab44SLisandro Dalcin for (j=0; j<N; j++, k++) 14108491ab44SLisandro Dalcin vwork[k] = v[i+lda*j]; 14118491ab44SLisandro Dalcin ierr = MatDenseRestoreArrayRead(mat,&v);CHKERRQ(ierr); 14128491ab44SLisandro Dalcin ierr = PetscViewerBinaryWriteAll(viewer,vwork,m*N,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_SCALAR);CHKERRQ(ierr); 14138491ab44SLisandro Dalcin ierr = PetscFree(vwork);CHKERRQ(ierr); 14148491ab44SLisandro Dalcin PetscFunctionReturn(0); 14158491ab44SLisandro Dalcin } 14168491ab44SLisandro Dalcin 14178491ab44SLisandro Dalcin PetscErrorCode MatLoad_Dense_Binary(Mat mat,PetscViewer viewer) 14188491ab44SLisandro Dalcin { 14198491ab44SLisandro Dalcin PetscErrorCode ierr; 14208491ab44SLisandro Dalcin PetscBool skipHeader; 14218491ab44SLisandro Dalcin PetscInt header[4],M,N,m,nz,lda,i,j,k; 14228491ab44SLisandro Dalcin PetscInt rows,cols; 14238491ab44SLisandro Dalcin PetscScalar *v,*vwork; 14248491ab44SLisandro Dalcin 14258491ab44SLisandro Dalcin PetscFunctionBegin; 14268491ab44SLisandro Dalcin ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr); 14278491ab44SLisandro Dalcin ierr = PetscViewerBinaryGetSkipHeader(viewer,&skipHeader);CHKERRQ(ierr); 14288491ab44SLisandro Dalcin 14298491ab44SLisandro Dalcin if (!skipHeader) { 14308491ab44SLisandro Dalcin ierr = PetscViewerBinaryRead(viewer,header,4,NULL,PETSC_INT);CHKERRQ(ierr); 14318491ab44SLisandro Dalcin if (header[0] != MAT_FILE_CLASSID) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"Not a matrix object in file"); 14328491ab44SLisandro Dalcin M = header[1]; N = header[2]; 14338491ab44SLisandro Dalcin if (M < 0) SETERRQ1(PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"Matrix row size (%D) in file is negative",M); 14348491ab44SLisandro Dalcin if (N < 0) SETERRQ1(PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"Matrix column size (%D) in file is negative",N); 14358491ab44SLisandro Dalcin nz = header[3]; 14368491ab44SLisandro Dalcin if (nz != MATRIX_BINARY_FORMAT_DENSE && nz < 0) SETERRQ1(PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"Unknown matrix format %D in file",nz); 1437aabbc4fbSShri Abhyankar } else { 14388491ab44SLisandro Dalcin ierr = MatGetSize(mat,&M,&N);CHKERRQ(ierr); 14398491ab44SLisandro Dalcin if (M < 0 || N < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Matrix binary file header was skipped, thus the user must specify the global sizes of input matrix"); 14408491ab44SLisandro Dalcin nz = MATRIX_BINARY_FORMAT_DENSE; 1441e6324fbbSBarry Smith } 1442aabbc4fbSShri Abhyankar 14438491ab44SLisandro Dalcin /* setup global sizes if not set */ 14448491ab44SLisandro Dalcin if (mat->rmap->N < 0) mat->rmap->N = M; 14458491ab44SLisandro Dalcin if (mat->cmap->N < 0) mat->cmap->N = N; 14468491ab44SLisandro Dalcin ierr = MatSetUp(mat);CHKERRQ(ierr); 14478491ab44SLisandro Dalcin /* check if global sizes are correct */ 14488491ab44SLisandro Dalcin ierr = MatGetSize(mat,&rows,&cols);CHKERRQ(ierr); 14498491ab44SLisandro Dalcin if (M != rows || N != cols) SETERRQ4(PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED, "Matrix in file of different sizes (%d, %d) than the input matrix (%d, %d)",M,N,rows,cols); 1450aabbc4fbSShri Abhyankar 14518491ab44SLisandro Dalcin ierr = MatGetSize(mat,NULL,&N);CHKERRQ(ierr); 14528491ab44SLisandro Dalcin ierr = MatGetLocalSize(mat,&m,NULL);CHKERRQ(ierr); 14538491ab44SLisandro Dalcin ierr = MatDenseGetArray(mat,&v);CHKERRQ(ierr); 14548491ab44SLisandro Dalcin ierr = MatDenseGetLDA(mat,&lda);CHKERRQ(ierr); 14558491ab44SLisandro Dalcin if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense format */ 14568491ab44SLisandro Dalcin PetscInt nnz = m*N; 14578491ab44SLisandro Dalcin /* read in matrix values */ 14588491ab44SLisandro Dalcin ierr = PetscMalloc1(nnz,&vwork);CHKERRQ(ierr); 14598491ab44SLisandro Dalcin ierr = PetscViewerBinaryReadAll(viewer,vwork,nnz,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_SCALAR);CHKERRQ(ierr); 14608491ab44SLisandro Dalcin /* store values in column major order */ 14618491ab44SLisandro Dalcin for (j=0; j<N; j++) 14628491ab44SLisandro Dalcin for (i=0; i<m; i++) 14638491ab44SLisandro Dalcin v[i+lda*j] = vwork[i*N+j]; 14648491ab44SLisandro Dalcin ierr = PetscFree(vwork);CHKERRQ(ierr); 14658491ab44SLisandro Dalcin } else { /* matrix in file is sparse format */ 14668491ab44SLisandro Dalcin PetscInt nnz = 0, *rlens, *icols; 14678491ab44SLisandro Dalcin /* read in row lengths */ 14688491ab44SLisandro Dalcin ierr = PetscMalloc1(m,&rlens);CHKERRQ(ierr); 14698491ab44SLisandro Dalcin ierr = PetscViewerBinaryReadAll(viewer,rlens,m,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_INT);CHKERRQ(ierr); 14708491ab44SLisandro Dalcin for (i=0; i<m; i++) nnz += rlens[i]; 14718491ab44SLisandro Dalcin /* read in column indices and values */ 14728491ab44SLisandro Dalcin ierr = PetscMalloc2(nnz,&icols,nnz,&vwork);CHKERRQ(ierr); 14738491ab44SLisandro Dalcin ierr = PetscViewerBinaryReadAll(viewer,icols,nnz,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_INT);CHKERRQ(ierr); 14748491ab44SLisandro Dalcin ierr = PetscViewerBinaryReadAll(viewer,vwork,nnz,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_SCALAR);CHKERRQ(ierr); 14758491ab44SLisandro Dalcin /* store values in column major order */ 14768491ab44SLisandro Dalcin for (k=0, i=0; i<m; i++) 14778491ab44SLisandro Dalcin for (j=0; j<rlens[i]; j++, k++) 14788491ab44SLisandro Dalcin v[i+lda*icols[k]] = vwork[k]; 14798491ab44SLisandro Dalcin ierr = PetscFree(rlens);CHKERRQ(ierr); 14808491ab44SLisandro Dalcin ierr = PetscFree2(icols,vwork);CHKERRQ(ierr); 1481aabbc4fbSShri Abhyankar } 14828491ab44SLisandro Dalcin ierr = MatDenseRestoreArray(mat,&v);CHKERRQ(ierr); 14838491ab44SLisandro Dalcin ierr = MatAssemblyBegin(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 14848491ab44SLisandro Dalcin ierr = MatAssemblyEnd(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1485aabbc4fbSShri Abhyankar PetscFunctionReturn(0); 1486aabbc4fbSShri Abhyankar } 1487aabbc4fbSShri Abhyankar 1488eb91f321SVaclav Hapla PetscErrorCode MatLoad_SeqDense(Mat newMat, PetscViewer viewer) 1489eb91f321SVaclav Hapla { 1490eb91f321SVaclav Hapla PetscBool isbinary, ishdf5; 1491eb91f321SVaclav Hapla PetscErrorCode ierr; 1492eb91f321SVaclav Hapla 1493eb91f321SVaclav Hapla PetscFunctionBegin; 1494eb91f321SVaclav Hapla PetscValidHeaderSpecific(newMat,MAT_CLASSID,1); 1495eb91f321SVaclav Hapla PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 1496eb91f321SVaclav Hapla /* force binary viewer to load .info file if it has not yet done so */ 1497eb91f321SVaclav Hapla ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr); 1498eb91f321SVaclav Hapla ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 1499eb91f321SVaclav Hapla ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERHDF5, &ishdf5);CHKERRQ(ierr); 1500eb91f321SVaclav Hapla if (isbinary) { 15018491ab44SLisandro Dalcin ierr = MatLoad_Dense_Binary(newMat,viewer);CHKERRQ(ierr); 1502eb91f321SVaclav Hapla } else if (ishdf5) { 1503eb91f321SVaclav Hapla #if defined(PETSC_HAVE_HDF5) 1504eb91f321SVaclav Hapla ierr = MatLoad_Dense_HDF5(newMat,viewer);CHKERRQ(ierr); 1505eb91f321SVaclav Hapla #else 1506eb91f321SVaclav Hapla SETERRQ(PetscObjectComm((PetscObject)newMat),PETSC_ERR_SUP,"HDF5 not supported in this build.\nPlease reconfigure using --download-hdf5"); 1507eb91f321SVaclav Hapla #endif 1508eb91f321SVaclav Hapla } else { 1509eb91f321SVaclav Hapla SETERRQ2(PetscObjectComm((PetscObject)newMat),PETSC_ERR_SUP,"Viewer type %s not yet supported for reading %s matrices",((PetscObject)viewer)->type_name,((PetscObject)newMat)->type_name); 1510eb91f321SVaclav Hapla } 1511eb91f321SVaclav Hapla PetscFunctionReturn(0); 1512eb91f321SVaclav Hapla } 1513eb91f321SVaclav Hapla 15146849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer) 1515289bc588SBarry Smith { 1516932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1517dfbe8321SBarry Smith PetscErrorCode ierr; 151813f74950SBarry Smith PetscInt i,j; 15192dcb1b2aSMatthew Knepley const char *name; 1520ca15aa20SStefano Zampini PetscScalar *v,*av; 1521f3ef73ceSBarry Smith PetscViewerFormat format; 15225f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX) 1523ace3abfcSBarry Smith PetscBool allreal = PETSC_TRUE; 15245f481a85SSatish Balay #endif 1525932b0c3eSLois Curfman McInnes 15263a40ed3dSBarry Smith PetscFunctionBegin; 1527ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,(const PetscScalar**)&av);CHKERRQ(ierr); 1528b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1529456192e2SBarry Smith if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 15303a40ed3dSBarry Smith PetscFunctionReturn(0); /* do nothing for now */ 1531fb9695e5SSatish Balay } else if (format == PETSC_VIEWER_ASCII_COMMON) { 1532d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 1533d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 1534ca15aa20SStefano Zampini v = av + i; 153577431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr); 1536d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1537aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 1538329f5518SBarry Smith if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) { 153957622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g + %g i) ",j,(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr); 1540329f5518SBarry Smith } else if (PetscRealPart(*v)) { 154157622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)PetscRealPart(*v));CHKERRQ(ierr); 15426831982aSBarry Smith } 154380cd9d93SLois Curfman McInnes #else 15446831982aSBarry Smith if (*v) { 154557622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)*v);CHKERRQ(ierr); 15466831982aSBarry Smith } 154780cd9d93SLois Curfman McInnes #endif 15481b807ce4Svictorle v += a->lda; 154980cd9d93SLois Curfman McInnes } 1550b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 155180cd9d93SLois Curfman McInnes } 1552d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 15533a40ed3dSBarry Smith } else { 1554d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 1555aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 155647989497SBarry Smith /* determine if matrix has all real values */ 1557ca15aa20SStefano Zampini v = av; 1558d0f46423SBarry Smith for (i=0; i<A->rmap->n*A->cmap->n; i++) { 1559ffac6cdbSBarry Smith if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break;} 156047989497SBarry Smith } 156147989497SBarry Smith #endif 1562fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 15633a7fca6bSBarry Smith ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr); 1564d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr); 1565d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 1566fb9695e5SSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr); 1567ffac6cdbSBarry Smith } 1568ffac6cdbSBarry Smith 1569d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 1570ca15aa20SStefano Zampini v = av + i; 1571d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1572aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 157347989497SBarry Smith if (allreal) { 1574c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr); 157547989497SBarry Smith } else { 1576c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr); 157747989497SBarry Smith } 1578289bc588SBarry Smith #else 1579c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr); 1580289bc588SBarry Smith #endif 15811b807ce4Svictorle v += a->lda; 1582289bc588SBarry Smith } 1583b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 1584289bc588SBarry Smith } 1585fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 1586b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr); 1587ffac6cdbSBarry Smith } 1588d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 1589da3a660dSBarry Smith } 1590ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,(const PetscScalar**)&av);CHKERRQ(ierr); 1591b0a32e0cSBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 15923a40ed3dSBarry Smith PetscFunctionReturn(0); 1593289bc588SBarry Smith } 1594289bc588SBarry Smith 15959804daf3SBarry Smith #include <petscdraw.h> 1596e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa) 1597f1af5d2fSBarry Smith { 1598f1af5d2fSBarry Smith Mat A = (Mat) Aa; 15996849ba73SBarry Smith PetscErrorCode ierr; 1600383922c3SLisandro Dalcin PetscInt m = A->rmap->n,n = A->cmap->n,i,j; 1601383922c3SLisandro Dalcin int color = PETSC_DRAW_WHITE; 1602ca15aa20SStefano Zampini const PetscScalar *v; 1603b0a32e0cSBarry Smith PetscViewer viewer; 1604b05fc000SLisandro Dalcin PetscReal xl,yl,xr,yr,x_l,x_r,y_l,y_r; 1605f3ef73ceSBarry Smith PetscViewerFormat format; 1606f1af5d2fSBarry Smith 1607f1af5d2fSBarry Smith PetscFunctionBegin; 1608f1af5d2fSBarry Smith ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr); 1609b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1610b0a32e0cSBarry Smith ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr); 1611f1af5d2fSBarry Smith 1612f1af5d2fSBarry Smith /* Loop over matrix elements drawing boxes */ 1613ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&v);CHKERRQ(ierr); 1614fb9695e5SSatish Balay if (format != PETSC_VIEWER_DRAW_CONTOUR) { 1615383922c3SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 1616f1af5d2fSBarry Smith /* Blue for negative and Red for positive */ 1617f1af5d2fSBarry Smith for (j = 0; j < n; j++) { 1618383922c3SLisandro Dalcin x_l = j; x_r = x_l + 1.0; 1619f1af5d2fSBarry Smith for (i = 0; i < m; i++) { 1620f1af5d2fSBarry Smith y_l = m - i - 1.0; 1621f1af5d2fSBarry Smith y_r = y_l + 1.0; 1622ca15aa20SStefano Zampini if (PetscRealPart(v[j*m+i]) > 0.) color = PETSC_DRAW_RED; 1623ca15aa20SStefano Zampini else if (PetscRealPart(v[j*m+i]) < 0.) color = PETSC_DRAW_BLUE; 1624ca15aa20SStefano Zampini else continue; 1625b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1626f1af5d2fSBarry Smith } 1627f1af5d2fSBarry Smith } 1628383922c3SLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 1629f1af5d2fSBarry Smith } else { 1630f1af5d2fSBarry Smith /* use contour shading to indicate magnitude of values */ 1631f1af5d2fSBarry Smith /* first determine max of all nonzero values */ 1632b05fc000SLisandro Dalcin PetscReal minv = 0.0, maxv = 0.0; 1633b05fc000SLisandro Dalcin PetscDraw popup; 1634b05fc000SLisandro Dalcin 1635f1af5d2fSBarry Smith for (i=0; i < m*n; i++) { 1636f1af5d2fSBarry Smith if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]); 1637f1af5d2fSBarry Smith } 1638383922c3SLisandro Dalcin if (minv >= maxv) maxv = minv + PETSC_SMALL; 1639b0a32e0cSBarry Smith ierr = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr); 164045f3bb6eSLisandro Dalcin ierr = PetscDrawScalePopup(popup,minv,maxv);CHKERRQ(ierr); 1641383922c3SLisandro Dalcin 1642383922c3SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 1643f1af5d2fSBarry Smith for (j=0; j<n; j++) { 1644f1af5d2fSBarry Smith x_l = j; 1645f1af5d2fSBarry Smith x_r = x_l + 1.0; 1646f1af5d2fSBarry Smith for (i=0; i<m; i++) { 1647f1af5d2fSBarry Smith y_l = m - i - 1.0; 1648f1af5d2fSBarry Smith y_r = y_l + 1.0; 1649b05fc000SLisandro Dalcin color = PetscDrawRealToColor(PetscAbsScalar(v[j*m+i]),minv,maxv); 1650b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1651f1af5d2fSBarry Smith } 1652f1af5d2fSBarry Smith } 1653383922c3SLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 1654f1af5d2fSBarry Smith } 1655ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&v);CHKERRQ(ierr); 1656f1af5d2fSBarry Smith PetscFunctionReturn(0); 1657f1af5d2fSBarry Smith } 1658f1af5d2fSBarry Smith 1659e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer) 1660f1af5d2fSBarry Smith { 1661b0a32e0cSBarry Smith PetscDraw draw; 1662ace3abfcSBarry Smith PetscBool isnull; 1663329f5518SBarry Smith PetscReal xr,yr,xl,yl,h,w; 1664dfbe8321SBarry Smith PetscErrorCode ierr; 1665f1af5d2fSBarry Smith 1666f1af5d2fSBarry Smith PetscFunctionBegin; 1667b0a32e0cSBarry Smith ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr); 1668b0a32e0cSBarry Smith ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 1669abc0a331SBarry Smith if (isnull) PetscFunctionReturn(0); 1670f1af5d2fSBarry Smith 1671d0f46423SBarry Smith xr = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0; 1672f1af5d2fSBarry Smith xr += w; yr += h; xl = -w; yl = -h; 1673b0a32e0cSBarry Smith ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr); 1674832b7cebSLisandro Dalcin ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr); 1675b0a32e0cSBarry Smith ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr); 16760298fd71SBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr); 1677832b7cebSLisandro Dalcin ierr = PetscDrawSave(draw);CHKERRQ(ierr); 1678f1af5d2fSBarry Smith PetscFunctionReturn(0); 1679f1af5d2fSBarry Smith } 1680f1af5d2fSBarry Smith 1681dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer) 1682932b0c3eSLois Curfman McInnes { 1683dfbe8321SBarry Smith PetscErrorCode ierr; 1684ace3abfcSBarry Smith PetscBool iascii,isbinary,isdraw; 1685932b0c3eSLois Curfman McInnes 16863a40ed3dSBarry Smith PetscFunctionBegin; 1687251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 1688251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 1689251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 16900f5bd95cSBarry Smith 1691c45a1595SBarry Smith if (iascii) { 1692c45a1595SBarry Smith ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr); 16930f5bd95cSBarry Smith } else if (isbinary) { 1694637a0070SStefano Zampini ierr = MatView_Dense_Binary(A,viewer);CHKERRQ(ierr); 1695f1af5d2fSBarry Smith } else if (isdraw) { 1696f1af5d2fSBarry Smith ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr); 1697932b0c3eSLois Curfman McInnes } 16983a40ed3dSBarry Smith PetscFunctionReturn(0); 1699932b0c3eSLois Curfman McInnes } 1700289bc588SBarry Smith 1701637a0070SStefano Zampini static PetscErrorCode MatDensePlaceArray_SeqDense(Mat A,const PetscScalar *array) 1702d3042a70SBarry Smith { 1703d3042a70SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1704d3042a70SBarry Smith 1705d3042a70SBarry Smith PetscFunctionBegin; 17065ea7661aSPierre Jolivet if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first"); 17075ea7661aSPierre Jolivet if (a->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first"); 17085ea7661aSPierre Jolivet if (a->unplacedarray) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreArray() first"); 1709d3042a70SBarry Smith a->unplacedarray = a->v; 1710d3042a70SBarry Smith a->unplaced_user_alloc = a->user_alloc; 1711d3042a70SBarry Smith a->v = (PetscScalar*) array; 1712637a0070SStefano Zampini a->user_alloc = PETSC_TRUE; 1713ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA) 1714c70f7ee4SJunchao Zhang A->offloadmask = PETSC_OFFLOAD_CPU; 1715ca15aa20SStefano Zampini #endif 1716d3042a70SBarry Smith PetscFunctionReturn(0); 1717d3042a70SBarry Smith } 1718d3042a70SBarry Smith 1719d3042a70SBarry Smith static PetscErrorCode MatDenseResetArray_SeqDense(Mat A) 1720d3042a70SBarry Smith { 1721d3042a70SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1722d3042a70SBarry Smith 1723d3042a70SBarry Smith PetscFunctionBegin; 17245ea7661aSPierre Jolivet if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first"); 17255ea7661aSPierre Jolivet if (a->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first"); 1726d3042a70SBarry Smith a->v = a->unplacedarray; 1727d3042a70SBarry Smith a->user_alloc = a->unplaced_user_alloc; 1728d3042a70SBarry Smith a->unplacedarray = NULL; 1729ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA) 1730c70f7ee4SJunchao Zhang A->offloadmask = PETSC_OFFLOAD_CPU; 1731ca15aa20SStefano Zampini #endif 1732d3042a70SBarry Smith PetscFunctionReturn(0); 1733d3042a70SBarry Smith } 1734d3042a70SBarry Smith 1735d5ea218eSStefano Zampini static PetscErrorCode MatDenseReplaceArray_SeqDense(Mat A,const PetscScalar *array) 1736d5ea218eSStefano Zampini { 1737d5ea218eSStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1738d5ea218eSStefano Zampini PetscErrorCode ierr; 1739d5ea218eSStefano Zampini 1740d5ea218eSStefano Zampini PetscFunctionBegin; 17415ea7661aSPierre Jolivet if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first"); 17425ea7661aSPierre Jolivet if (a->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first"); 1743d5ea218eSStefano Zampini if (!a->user_alloc) { ierr = PetscFree(a->v);CHKERRQ(ierr); } 1744d5ea218eSStefano Zampini a->v = (PetscScalar*) array; 1745d5ea218eSStefano Zampini a->user_alloc = PETSC_FALSE; 1746d5ea218eSStefano Zampini #if defined(PETSC_HAVE_CUDA) 1747d5ea218eSStefano Zampini A->offloadmask = PETSC_OFFLOAD_CPU; 1748d5ea218eSStefano Zampini #endif 1749d5ea218eSStefano Zampini PetscFunctionReturn(0); 1750d5ea218eSStefano Zampini } 1751d5ea218eSStefano Zampini 1752ca15aa20SStefano Zampini PetscErrorCode MatDestroy_SeqDense(Mat mat) 1753289bc588SBarry Smith { 1754ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)mat->data; 1755dfbe8321SBarry Smith PetscErrorCode ierr; 175690f02eecSBarry Smith 17573a40ed3dSBarry Smith PetscFunctionBegin; 1758aa482453SBarry Smith #if defined(PETSC_USE_LOG) 1759d0f46423SBarry Smith PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n); 1760a5a9c739SBarry Smith #endif 17614396437dSToby Isaac ierr = VecDestroy(&(l->qrrhs));CHKERRQ(ierr); 17624905a7bcSToby Isaac ierr = PetscFree(l->tau);CHKERRQ(ierr); 176305b42c5fSBarry Smith ierr = PetscFree(l->pivots);CHKERRQ(ierr); 1764a49dc2a2SStefano Zampini ierr = PetscFree(l->fwork);CHKERRQ(ierr); 1765abc3b08eSStefano Zampini ierr = MatDestroy(&l->ptapwork);CHKERRQ(ierr); 17666857c123SSatish Balay if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);} 1767637a0070SStefano Zampini if (!l->unplaced_user_alloc) {ierr = PetscFree(l->unplacedarray);CHKERRQ(ierr);} 17685ea7661aSPierre Jolivet if (l->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first"); 17695ea7661aSPierre Jolivet if (l->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first"); 17706947451fSStefano Zampini ierr = VecDestroy(&l->cvec);CHKERRQ(ierr); 17715ea7661aSPierre Jolivet ierr = MatDestroy(&l->cmat);CHKERRQ(ierr); 1772bf0cc555SLisandro Dalcin ierr = PetscFree(mat->data);CHKERRQ(ierr); 1773dbd8c25aSHong Zhang 1774f4259b30SLisandro Dalcin ierr = PetscObjectChangeTypeName((PetscObject)mat,NULL);CHKERRQ(ierr); 17754905a7bcSToby Isaac ierr = PetscObjectComposeFunction((PetscObject)mat,"MatQRFactor_C",NULL);CHKERRQ(ierr); 17764905a7bcSToby Isaac ierr = PetscObjectComposeFunction((PetscObject)mat,"MatQRFactorNumeric_C",NULL);CHKERRQ(ierr); 17774905a7bcSToby Isaac ierr = PetscObjectComposeFunction((PetscObject)mat,"MatQRFactorSymbolic_C",NULL);CHKERRQ(ierr); 177849a6ff4bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetLDA_C",NULL);CHKERRQ(ierr); 1779ad16ce7aSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseSetLDA_C",NULL);CHKERRQ(ierr); 1780bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL);CHKERRQ(ierr); 178152c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL);CHKERRQ(ierr); 1782d3042a70SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDensePlaceArray_C",NULL);CHKERRQ(ierr); 1783d3042a70SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseResetArray_C",NULL);CHKERRQ(ierr); 1784d5ea218eSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseReplaceArray_C",NULL);CHKERRQ(ierr); 178552c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArrayRead_C",NULL);CHKERRQ(ierr); 178652c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArrayRead_C",NULL);CHKERRQ(ierr); 17876947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArrayWrite_C",NULL);CHKERRQ(ierr); 17886947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArrayWrite_C",NULL);CHKERRQ(ierr); 17898baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL);CHKERRQ(ierr); 17908baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 17918baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL);CHKERRQ(ierr); 17928baccfbdSHong Zhang #endif 1793d24d4204SJose E. Roman #if defined(PETSC_HAVE_SCALAPACK) 1794d24d4204SJose E. Roman ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_scalapack_C",NULL);CHKERRQ(ierr); 1795d24d4204SJose E. Roman #endif 17962bf066beSStefano Zampini #if defined(PETSC_HAVE_CUDA) 17972bf066beSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqdensecuda_C",NULL);CHKERRQ(ierr); 17984222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqdensecuda_seqdensecuda_C",NULL);CHKERRQ(ierr); 17994222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqdensecuda_seqdense_C",NULL);CHKERRQ(ierr); 18002bf066beSStefano Zampini #endif 1801bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL);CHKERRQ(ierr); 18024222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 18034222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqdense_seqdense_C",NULL);CHKERRQ(ierr); 18044222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqbaij_seqdense_C",NULL);CHKERRQ(ierr); 18054222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqsbaij_seqdense_C",NULL);CHKERRQ(ierr); 180652c5f739Sprj- 180786aefd0dSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumn_C",NULL);CHKERRQ(ierr); 180886aefd0dSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumn_C",NULL);CHKERRQ(ierr); 18096947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumnVec_C",NULL);CHKERRQ(ierr); 18106947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumnVec_C",NULL);CHKERRQ(ierr); 18116947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumnVecRead_C",NULL);CHKERRQ(ierr); 18126947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumnVecRead_C",NULL);CHKERRQ(ierr); 18136947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumnVecWrite_C",NULL);CHKERRQ(ierr); 18146947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumnVecWrite_C",NULL);CHKERRQ(ierr); 18155ea7661aSPierre Jolivet ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetSubMatrix_C",NULL);CHKERRQ(ierr); 18165ea7661aSPierre Jolivet ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreSubMatrix_C",NULL);CHKERRQ(ierr); 18173a40ed3dSBarry Smith PetscFunctionReturn(0); 1818289bc588SBarry Smith } 1819289bc588SBarry Smith 1820e0877f53SBarry Smith static PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout) 1821289bc588SBarry Smith { 1822c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 18236849ba73SBarry Smith PetscErrorCode ierr; 18246536e3caSStefano Zampini PetscInt k,j,m = A->rmap->n, M = mat->lda, n = A->cmap->n; 182587828ca2SBarry Smith PetscScalar *v,tmp; 182648b35521SBarry Smith 18273a40ed3dSBarry Smith PetscFunctionBegin; 18286536e3caSStefano Zampini if (reuse == MAT_INPLACE_MATRIX) { 18296536e3caSStefano Zampini if (m == n) { /* in place transpose */ 1830ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr); 1831d3e5ee88SLois Curfman McInnes for (j=0; j<m; j++) { 1832289bc588SBarry Smith for (k=0; k<j; k++) { 18331b807ce4Svictorle tmp = v[j + k*M]; 18341b807ce4Svictorle v[j + k*M] = v[k + j*M]; 18351b807ce4Svictorle v[k + j*M] = tmp; 1836289bc588SBarry Smith } 1837289bc588SBarry Smith } 1838ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr); 18396536e3caSStefano Zampini } else { /* reuse memory, temporary allocates new memory */ 18406536e3caSStefano Zampini PetscScalar *v2; 18416536e3caSStefano Zampini PetscLayout tmplayout; 18426536e3caSStefano Zampini 18436536e3caSStefano Zampini ierr = PetscMalloc1((size_t)m*n,&v2);CHKERRQ(ierr); 18446536e3caSStefano Zampini ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr); 18456536e3caSStefano Zampini for (j=0; j<n; j++) { 18466536e3caSStefano Zampini for (k=0; k<m; k++) v2[j + (size_t)k*n] = v[k + (size_t)j*M]; 18476536e3caSStefano Zampini } 18486536e3caSStefano Zampini ierr = PetscArraycpy(v,v2,(size_t)m*n);CHKERRQ(ierr); 18496536e3caSStefano Zampini ierr = PetscFree(v2);CHKERRQ(ierr); 18506536e3caSStefano Zampini ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr); 18516536e3caSStefano Zampini /* cleanup size dependent quantities */ 18526536e3caSStefano Zampini ierr = VecDestroy(&mat->cvec);CHKERRQ(ierr); 18536536e3caSStefano Zampini ierr = MatDestroy(&mat->cmat);CHKERRQ(ierr); 18546536e3caSStefano Zampini ierr = PetscFree(mat->pivots);CHKERRQ(ierr); 18556536e3caSStefano Zampini ierr = PetscFree(mat->fwork);CHKERRQ(ierr); 18566536e3caSStefano Zampini ierr = MatDestroy(&mat->ptapwork);CHKERRQ(ierr); 18576536e3caSStefano Zampini /* swap row/col layouts */ 18586536e3caSStefano Zampini mat->lda = n; 18596536e3caSStefano Zampini tmplayout = A->rmap; 18606536e3caSStefano Zampini A->rmap = A->cmap; 18616536e3caSStefano Zampini A->cmap = tmplayout; 18626536e3caSStefano Zampini } 18633a40ed3dSBarry Smith } else { /* out-of-place transpose */ 1864d3e5ee88SLois Curfman McInnes Mat tmat; 1865ec8511deSBarry Smith Mat_SeqDense *tmatd; 186687828ca2SBarry Smith PetscScalar *v2; 1867af36a384SStefano Zampini PetscInt M2; 1868ea709b57SSatish Balay 18696536e3caSStefano Zampini if (reuse == MAT_INITIAL_MATRIX) { 1870ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr); 1871d0f46423SBarry Smith ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr); 18727adad957SLisandro Dalcin ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 18730298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr); 1874ca15aa20SStefano Zampini } else tmat = *matout; 1875ca15aa20SStefano Zampini 1876ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,(const PetscScalar**)&v);CHKERRQ(ierr); 1877ca15aa20SStefano Zampini ierr = MatDenseGetArray(tmat,&v2);CHKERRQ(ierr); 1878ec8511deSBarry Smith tmatd = (Mat_SeqDense*)tmat->data; 1879ca15aa20SStefano Zampini M2 = tmatd->lda; 1880d3e5ee88SLois Curfman McInnes for (j=0; j<n; j++) { 1881af36a384SStefano Zampini for (k=0; k<m; k++) v2[j + k*M2] = v[k + j*M]; 1882d3e5ee88SLois Curfman McInnes } 1883ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(tmat,&v2);CHKERRQ(ierr); 1884ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,(const PetscScalar**)&v);CHKERRQ(ierr); 18856d4a8577SBarry Smith ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 18866d4a8577SBarry Smith ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 18876536e3caSStefano Zampini *matout = tmat; 188848b35521SBarry Smith } 18893a40ed3dSBarry Smith PetscFunctionReturn(0); 1890289bc588SBarry Smith } 1891289bc588SBarry Smith 1892e0877f53SBarry Smith static PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool *flg) 1893289bc588SBarry Smith { 1894c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data; 1895c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data; 1896ca15aa20SStefano Zampini PetscInt i; 1897ca15aa20SStefano Zampini const PetscScalar *v1,*v2; 1898ca15aa20SStefano Zampini PetscErrorCode ierr; 18999ea5d5aeSSatish Balay 19003a40ed3dSBarry Smith PetscFunctionBegin; 1901d0f46423SBarry Smith if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1902d0f46423SBarry Smith if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1903ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A1,&v1);CHKERRQ(ierr); 1904ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A2,&v2);CHKERRQ(ierr); 1905ca15aa20SStefano Zampini for (i=0; i<A1->cmap->n; i++) { 1906ca15aa20SStefano Zampini ierr = PetscArraycmp(v1,v2,A1->rmap->n,flg);CHKERRQ(ierr); 1907ca15aa20SStefano Zampini if (*flg == PETSC_FALSE) PetscFunctionReturn(0); 1908ca15aa20SStefano Zampini v1 += mat1->lda; 1909ca15aa20SStefano Zampini v2 += mat2->lda; 19101b807ce4Svictorle } 1911ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A1,&v1);CHKERRQ(ierr); 1912ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A2,&v2);CHKERRQ(ierr); 191377c4ece6SBarry Smith *flg = PETSC_TRUE; 19143a40ed3dSBarry Smith PetscFunctionReturn(0); 1915289bc588SBarry Smith } 1916289bc588SBarry Smith 1917e0877f53SBarry Smith static PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v) 1918289bc588SBarry Smith { 1919c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 192013f74950SBarry Smith PetscInt i,n,len; 1921ca15aa20SStefano Zampini PetscScalar *x; 1922ca15aa20SStefano Zampini const PetscScalar *vv; 1923ca15aa20SStefano Zampini PetscErrorCode ierr; 192444cd7ae7SLois Curfman McInnes 19253a40ed3dSBarry Smith PetscFunctionBegin; 19267a97a34bSBarry Smith ierr = VecGetSize(v,&n);CHKERRQ(ierr); 19271ebc52fbSHong Zhang ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1928d0f46423SBarry Smith len = PetscMin(A->rmap->n,A->cmap->n); 1929ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&vv);CHKERRQ(ierr); 1930e32f2f54SBarry Smith if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec"); 193144cd7ae7SLois Curfman McInnes for (i=0; i<len; i++) { 1932ca15aa20SStefano Zampini x[i] = vv[i*mat->lda + i]; 1933289bc588SBarry Smith } 1934ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&vv);CHKERRQ(ierr); 19351ebc52fbSHong Zhang ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 19363a40ed3dSBarry Smith PetscFunctionReturn(0); 1937289bc588SBarry Smith } 1938289bc588SBarry Smith 1939e0877f53SBarry Smith static PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr) 1940289bc588SBarry Smith { 1941c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1942f1ceaac6SMatthew G. Knepley const PetscScalar *l,*r; 1943ca15aa20SStefano Zampini PetscScalar x,*v,*vv; 1944dfbe8321SBarry Smith PetscErrorCode ierr; 1945d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n; 194655659b69SBarry Smith 19473a40ed3dSBarry Smith PetscFunctionBegin; 1948ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&vv);CHKERRQ(ierr); 194928988994SBarry Smith if (ll) { 19507a97a34bSBarry Smith ierr = VecGetSize(ll,&m);CHKERRQ(ierr); 1951f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(ll,&l);CHKERRQ(ierr); 1952e32f2f54SBarry Smith if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size"); 1953da3a660dSBarry Smith for (i=0; i<m; i++) { 1954da3a660dSBarry Smith x = l[i]; 1955ca15aa20SStefano Zampini v = vv + i; 1956b43bac26SStefano Zampini for (j=0; j<n; j++) { (*v) *= x; v+= mat->lda;} 1957da3a660dSBarry Smith } 1958f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(ll,&l);CHKERRQ(ierr); 1959eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr); 1960da3a660dSBarry Smith } 196128988994SBarry Smith if (rr) { 19627a97a34bSBarry Smith ierr = VecGetSize(rr,&n);CHKERRQ(ierr); 1963f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(rr,&r);CHKERRQ(ierr); 1964e32f2f54SBarry Smith if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size"); 1965da3a660dSBarry Smith for (i=0; i<n; i++) { 1966da3a660dSBarry Smith x = r[i]; 1967ca15aa20SStefano Zampini v = vv + i*mat->lda; 19682205254eSKarl Rupp for (j=0; j<m; j++) (*v++) *= x; 1969da3a660dSBarry Smith } 1970f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(rr,&r);CHKERRQ(ierr); 1971eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr); 1972da3a660dSBarry Smith } 1973ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&vv);CHKERRQ(ierr); 19743a40ed3dSBarry Smith PetscFunctionReturn(0); 1975289bc588SBarry Smith } 1976289bc588SBarry Smith 1977ca15aa20SStefano Zampini PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm) 1978289bc588SBarry Smith { 1979c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1980ca15aa20SStefano Zampini PetscScalar *v,*vv; 1981329f5518SBarry Smith PetscReal sum = 0.0; 1982d0f46423SBarry Smith PetscInt lda =mat->lda,m=A->rmap->n,i,j; 1983efee365bSSatish Balay PetscErrorCode ierr; 198455659b69SBarry Smith 19853a40ed3dSBarry Smith PetscFunctionBegin; 1986ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,(const PetscScalar**)&vv);CHKERRQ(ierr); 1987ca15aa20SStefano Zampini v = vv; 1988289bc588SBarry Smith if (type == NORM_FROBENIUS) { 1989a5ce6ee0Svictorle if (lda>m) { 1990d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1991ca15aa20SStefano Zampini v = vv+j*lda; 1992a5ce6ee0Svictorle for (i=0; i<m; i++) { 1993a5ce6ee0Svictorle sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1994a5ce6ee0Svictorle } 1995a5ce6ee0Svictorle } 1996a5ce6ee0Svictorle } else { 1997570b7f6dSBarry Smith #if defined(PETSC_USE_REAL___FP16) 1998570b7f6dSBarry Smith PetscBLASInt one = 1,cnt = A->cmap->n*A->rmap->n; 199973cf7048SBarry Smith PetscStackCallBLAS("BLASnrm2",*nrm = BLASnrm2_(&cnt,v,&one)); 2000570b7f6dSBarry Smith } 2001570b7f6dSBarry Smith #else 2002d0f46423SBarry Smith for (i=0; i<A->cmap->n*A->rmap->n; i++) { 2003329f5518SBarry Smith sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 2004289bc588SBarry Smith } 2005a5ce6ee0Svictorle } 20068f1a2a5eSBarry Smith *nrm = PetscSqrtReal(sum); 2007570b7f6dSBarry Smith #endif 2008dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 20093a40ed3dSBarry Smith } else if (type == NORM_1) { 2010064f8208SBarry Smith *nrm = 0.0; 2011d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 2012ca15aa20SStefano Zampini v = vv + j*mat->lda; 2013289bc588SBarry Smith sum = 0.0; 2014d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 201533a8263dSBarry Smith sum += PetscAbsScalar(*v); v++; 2016289bc588SBarry Smith } 2017064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 2018289bc588SBarry Smith } 2019eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 20203a40ed3dSBarry Smith } else if (type == NORM_INFINITY) { 2021064f8208SBarry Smith *nrm = 0.0; 2022d0f46423SBarry Smith for (j=0; j<A->rmap->n; j++) { 2023ca15aa20SStefano Zampini v = vv + j; 2024289bc588SBarry Smith sum = 0.0; 2025d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) { 20261b807ce4Svictorle sum += PetscAbsScalar(*v); v += mat->lda; 2027289bc588SBarry Smith } 2028064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 2029289bc588SBarry Smith } 2030eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 2031e7e72b3dSBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm"); 2032ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,(const PetscScalar**)&vv);CHKERRQ(ierr); 20333a40ed3dSBarry Smith PetscFunctionReturn(0); 2034289bc588SBarry Smith } 2035289bc588SBarry Smith 2036e0877f53SBarry Smith static PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg) 2037289bc588SBarry Smith { 2038c0bbcb79SLois Curfman McInnes Mat_SeqDense *aij = (Mat_SeqDense*)A->data; 203963ba0a88SBarry Smith PetscErrorCode ierr; 204067e560aaSBarry Smith 20413a40ed3dSBarry Smith PetscFunctionBegin; 2042b5a2b587SKris Buschelman switch (op) { 2043b5a2b587SKris Buschelman case MAT_ROW_ORIENTED: 20444e0d8c25SBarry Smith aij->roworiented = flg; 2045b5a2b587SKris Buschelman break; 2046512a5fc5SBarry Smith case MAT_NEW_NONZERO_LOCATIONS: 2047b5a2b587SKris Buschelman case MAT_NEW_NONZERO_LOCATION_ERR: 20483971808eSMatthew Knepley case MAT_NEW_NONZERO_ALLOCATION_ERR: 20498c78258cSHong Zhang case MAT_FORCE_DIAGONAL_ENTRIES: 205013fa8e87SLisandro Dalcin case MAT_KEEP_NONZERO_PATTERN: 2051b5a2b587SKris Buschelman case MAT_IGNORE_OFF_PROC_ENTRIES: 2052b5a2b587SKris Buschelman case MAT_USE_HASH_TABLE: 20530f8fb01aSBarry Smith case MAT_IGNORE_ZERO_ENTRIES: 20545021d80fSJed Brown case MAT_IGNORE_LOWER_TRIANGULAR: 2055071fcb05SBarry Smith case MAT_SORTED_FULL: 20565021d80fSJed Brown ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr); 20575021d80fSJed Brown break; 20585021d80fSJed Brown case MAT_SPD: 205977e54ba9SKris Buschelman case MAT_SYMMETRIC: 206077e54ba9SKris Buschelman case MAT_STRUCTURALLY_SYMMETRIC: 20619a4540c5SBarry Smith case MAT_HERMITIAN: 20629a4540c5SBarry Smith case MAT_SYMMETRY_ETERNAL: 20635021d80fSJed Brown /* These options are handled directly by MatSetOption() */ 206477e54ba9SKris Buschelman break; 2065b5a2b587SKris Buschelman default: 2066e32f2f54SBarry Smith SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]); 20673a40ed3dSBarry Smith } 20683a40ed3dSBarry Smith PetscFunctionReturn(0); 2069289bc588SBarry Smith } 2070289bc588SBarry Smith 2071*3d8925e7SStefano Zampini PetscErrorCode MatZeroEntries_SeqDense(Mat A) 20726f0a148fSBarry Smith { 2073ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 20746849ba73SBarry Smith PetscErrorCode ierr; 2075*3d8925e7SStefano Zampini PetscInt lda=l->lda,m=A->rmap->n,n=A->cmap->n,j; 2076ca15aa20SStefano Zampini PetscScalar *v; 20773a40ed3dSBarry Smith 20783a40ed3dSBarry Smith PetscFunctionBegin; 2079*3d8925e7SStefano Zampini ierr = MatDenseGetArrayWrite(A,&v);CHKERRQ(ierr); 2080a5ce6ee0Svictorle if (lda>m) { 2081*3d8925e7SStefano Zampini for (j=0; j<n; j++) { 2082ca15aa20SStefano Zampini ierr = PetscArrayzero(v+j*lda,m);CHKERRQ(ierr); 2083a5ce6ee0Svictorle } 2084a5ce6ee0Svictorle } else { 2085*3d8925e7SStefano Zampini ierr = PetscArrayzero(v,PetscInt64Mult(m,n));CHKERRQ(ierr); 2086a5ce6ee0Svictorle } 2087*3d8925e7SStefano Zampini ierr = MatDenseRestoreArrayWrite(A,&v);CHKERRQ(ierr); 20883a40ed3dSBarry Smith PetscFunctionReturn(0); 20896f0a148fSBarry Smith } 20906f0a148fSBarry Smith 2091e0877f53SBarry Smith static PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b) 20926f0a148fSBarry Smith { 209397b48c8fSBarry Smith PetscErrorCode ierr; 2094ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 2095b9679d65SBarry Smith PetscInt m = l->lda, n = A->cmap->n, i,j; 2096ca15aa20SStefano Zampini PetscScalar *slot,*bb,*v; 209797b48c8fSBarry Smith const PetscScalar *xx; 209855659b69SBarry Smith 20993a40ed3dSBarry Smith PetscFunctionBegin; 210076bd3646SJed Brown if (PetscDefined(USE_DEBUG)) { 2101b9679d65SBarry Smith for (i=0; i<N; i++) { 2102b9679d65SBarry Smith if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed"); 2103b9679d65SBarry Smith if (rows[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row %D requested to be zeroed greater than or equal number of rows %D",rows[i],A->rmap->n); 2104b9679d65SBarry Smith } 210576bd3646SJed Brown } 2106ca15aa20SStefano Zampini if (!N) PetscFunctionReturn(0); 2107b9679d65SBarry Smith 210897b48c8fSBarry Smith /* fix right hand side if needed */ 210997b48c8fSBarry Smith if (x && b) { 211097b48c8fSBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 211197b48c8fSBarry Smith ierr = VecGetArray(b,&bb);CHKERRQ(ierr); 21122205254eSKarl Rupp for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]]; 211397b48c8fSBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 211497b48c8fSBarry Smith ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr); 211597b48c8fSBarry Smith } 211697b48c8fSBarry Smith 2117ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr); 21186f0a148fSBarry Smith for (i=0; i<N; i++) { 2119ca15aa20SStefano Zampini slot = v + rows[i]; 2120b9679d65SBarry Smith for (j=0; j<n; j++) { *slot = 0.0; slot += m;} 21216f0a148fSBarry Smith } 2122f4df32b1SMatthew Knepley if (diag != 0.0) { 2123b9679d65SBarry Smith if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 21246f0a148fSBarry Smith for (i=0; i<N; i++) { 2125ca15aa20SStefano Zampini slot = v + (m+1)*rows[i]; 2126f4df32b1SMatthew Knepley *slot = diag; 21276f0a148fSBarry Smith } 21286f0a148fSBarry Smith } 2129ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr); 21303a40ed3dSBarry Smith PetscFunctionReturn(0); 21316f0a148fSBarry Smith } 2132557bce09SLois Curfman McInnes 213349a6ff4bSBarry Smith static PetscErrorCode MatDenseGetLDA_SeqDense(Mat A,PetscInt *lda) 213449a6ff4bSBarry Smith { 213549a6ff4bSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 213649a6ff4bSBarry Smith 213749a6ff4bSBarry Smith PetscFunctionBegin; 213849a6ff4bSBarry Smith *lda = mat->lda; 213949a6ff4bSBarry Smith PetscFunctionReturn(0); 214049a6ff4bSBarry Smith } 214149a6ff4bSBarry Smith 2142637a0070SStefano Zampini PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar **array) 214364e87e97SBarry Smith { 2144c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 21453a40ed3dSBarry Smith 21463a40ed3dSBarry Smith PetscFunctionBegin; 2147616b8fbbSStefano Zampini if (mat->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first"); 214864e87e97SBarry Smith *array = mat->v; 21493a40ed3dSBarry Smith PetscFunctionReturn(0); 215064e87e97SBarry Smith } 21510754003eSLois Curfman McInnes 2152637a0070SStefano Zampini PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar **array) 2153ff14e315SSatish Balay { 21543a40ed3dSBarry Smith PetscFunctionBegin; 2155637a0070SStefano Zampini *array = NULL; 21563a40ed3dSBarry Smith PetscFunctionReturn(0); 2157ff14e315SSatish Balay } 21580754003eSLois Curfman McInnes 2159dec5eb66SMatthew G Knepley /*@C 216049a6ff4bSBarry Smith MatDenseGetLDA - gets the leading dimension of the array returned from MatDenseGetArray() 216149a6ff4bSBarry Smith 2162ad16ce7aSStefano Zampini Not collective 216349a6ff4bSBarry Smith 216449a6ff4bSBarry Smith Input Parameter: 216549a6ff4bSBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 216649a6ff4bSBarry Smith 216749a6ff4bSBarry Smith Output Parameter: 216849a6ff4bSBarry Smith . lda - the leading dimension 216949a6ff4bSBarry Smith 217049a6ff4bSBarry Smith Level: intermediate 217149a6ff4bSBarry Smith 2172ad16ce7aSStefano Zampini .seealso: MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead(), MatDenseSetLDA() 217349a6ff4bSBarry Smith @*/ 217449a6ff4bSBarry Smith PetscErrorCode MatDenseGetLDA(Mat A,PetscInt *lda) 217549a6ff4bSBarry Smith { 217649a6ff4bSBarry Smith PetscErrorCode ierr; 217749a6ff4bSBarry Smith 217849a6ff4bSBarry Smith PetscFunctionBegin; 2179d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 2180d5ea218eSStefano Zampini PetscValidPointer(lda,2); 218149a6ff4bSBarry Smith ierr = PetscUseMethod(A,"MatDenseGetLDA_C",(Mat,PetscInt*),(A,lda));CHKERRQ(ierr); 218249a6ff4bSBarry Smith PetscFunctionReturn(0); 218349a6ff4bSBarry Smith } 218449a6ff4bSBarry Smith 218549a6ff4bSBarry Smith /*@C 2186ad16ce7aSStefano Zampini MatDenseSetLDA - Sets the leading dimension of the array used by the dense matrix 2187ad16ce7aSStefano Zampini 2188ad16ce7aSStefano Zampini Not collective 2189ad16ce7aSStefano Zampini 2190ad16ce7aSStefano Zampini Input Parameter: 2191ad16ce7aSStefano Zampini + mat - a MATSEQDENSE or MATMPIDENSE matrix 2192ad16ce7aSStefano Zampini - lda - the leading dimension 2193ad16ce7aSStefano Zampini 2194ad16ce7aSStefano Zampini Level: intermediate 2195ad16ce7aSStefano Zampini 2196ad16ce7aSStefano Zampini .seealso: MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead(), MatDenseGetLDA() 2197ad16ce7aSStefano Zampini @*/ 2198ad16ce7aSStefano Zampini PetscErrorCode MatDenseSetLDA(Mat A,PetscInt lda) 2199ad16ce7aSStefano Zampini { 2200ad16ce7aSStefano Zampini PetscErrorCode ierr; 2201ad16ce7aSStefano Zampini 2202ad16ce7aSStefano Zampini PetscFunctionBegin; 2203ad16ce7aSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 2204ad16ce7aSStefano Zampini ierr = PetscTryMethod(A,"MatDenseSetLDA_C",(Mat,PetscInt),(A,lda));CHKERRQ(ierr); 2205ad16ce7aSStefano Zampini PetscFunctionReturn(0); 2206ad16ce7aSStefano Zampini } 2207ad16ce7aSStefano Zampini 2208ad16ce7aSStefano Zampini /*@C 22096947451fSStefano Zampini MatDenseGetArray - gives read-write access to the array where the data for a dense matrix is stored 221073a71a0fSBarry Smith 22118572280aSBarry Smith Logically Collective on Mat 221273a71a0fSBarry Smith 221373a71a0fSBarry Smith Input Parameter: 22146947451fSStefano Zampini . mat - a dense matrix 221573a71a0fSBarry Smith 221673a71a0fSBarry Smith Output Parameter: 221773a71a0fSBarry Smith . array - pointer to the data 221873a71a0fSBarry Smith 221973a71a0fSBarry Smith Level: intermediate 222073a71a0fSBarry Smith 22216947451fSStefano Zampini .seealso: MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead(), MatDenseGetArrayWrite(), MatDenseRestoreArrayWrite() 222273a71a0fSBarry Smith @*/ 22238c778c55SBarry Smith PetscErrorCode MatDenseGetArray(Mat A,PetscScalar **array) 222473a71a0fSBarry Smith { 222573a71a0fSBarry Smith PetscErrorCode ierr; 222673a71a0fSBarry Smith 222773a71a0fSBarry Smith PetscFunctionBegin; 2228d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 2229d5ea218eSStefano Zampini PetscValidPointer(array,2); 22308c778c55SBarry Smith ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 223173a71a0fSBarry Smith PetscFunctionReturn(0); 223273a71a0fSBarry Smith } 223373a71a0fSBarry Smith 2234dec5eb66SMatthew G Knepley /*@C 2235579dbff0SBarry Smith MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray() 223673a71a0fSBarry Smith 22378572280aSBarry Smith Logically Collective on Mat 22388572280aSBarry Smith 22398572280aSBarry Smith Input Parameters: 22406947451fSStefano Zampini + mat - a dense matrix 2241a2b725a8SWilliam Gropp - array - pointer to the data 22428572280aSBarry Smith 22438572280aSBarry Smith Level: intermediate 22448572280aSBarry Smith 22456947451fSStefano Zampini .seealso: MatDenseGetArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead(), MatDenseGetArrayWrite(), MatDenseRestoreArrayWrite() 22468572280aSBarry Smith @*/ 22478572280aSBarry Smith PetscErrorCode MatDenseRestoreArray(Mat A,PetscScalar **array) 22488572280aSBarry Smith { 22498572280aSBarry Smith PetscErrorCode ierr; 22508572280aSBarry Smith 22518572280aSBarry Smith PetscFunctionBegin; 2252d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 2253d5ea218eSStefano Zampini PetscValidPointer(array,2); 22548572280aSBarry Smith ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 22558572280aSBarry Smith ierr = PetscObjectStateIncrease((PetscObject)A);CHKERRQ(ierr); 2256637a0070SStefano Zampini #if defined(PETSC_HAVE_CUDA) 2257637a0070SStefano Zampini A->offloadmask = PETSC_OFFLOAD_CPU; 2258637a0070SStefano Zampini #endif 22598572280aSBarry Smith PetscFunctionReturn(0); 22608572280aSBarry Smith } 22618572280aSBarry Smith 22628572280aSBarry Smith /*@C 22636947451fSStefano Zampini MatDenseGetArrayRead - gives read-only access to the array where the data for a dense matrix is stored 22648572280aSBarry Smith 22658572280aSBarry Smith Not Collective 22668572280aSBarry Smith 22678572280aSBarry Smith Input Parameter: 22686947451fSStefano Zampini . mat - a dense matrix 22698572280aSBarry Smith 22708572280aSBarry Smith Output Parameter: 22718572280aSBarry Smith . array - pointer to the data 22728572280aSBarry Smith 22738572280aSBarry Smith Level: intermediate 22748572280aSBarry Smith 22756947451fSStefano Zampini .seealso: MatDenseRestoreArrayRead(), MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayWrite(), MatDenseRestoreArrayWrite() 22768572280aSBarry Smith @*/ 22778572280aSBarry Smith PetscErrorCode MatDenseGetArrayRead(Mat A,const PetscScalar **array) 22788572280aSBarry Smith { 22798572280aSBarry Smith PetscErrorCode ierr; 22808572280aSBarry Smith 22818572280aSBarry Smith PetscFunctionBegin; 2282d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 2283d5ea218eSStefano Zampini PetscValidPointer(array,2); 22848572280aSBarry Smith ierr = PetscUseMethod(A,"MatDenseGetArrayRead_C",(Mat,const PetscScalar**),(A,array));CHKERRQ(ierr); 22858572280aSBarry Smith PetscFunctionReturn(0); 22868572280aSBarry Smith } 22878572280aSBarry Smith 22888572280aSBarry Smith /*@C 22896947451fSStefano Zampini MatDenseRestoreArrayRead - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArrayRead() 22908572280aSBarry Smith 229173a71a0fSBarry Smith Not Collective 229273a71a0fSBarry Smith 229373a71a0fSBarry Smith Input Parameters: 22946947451fSStefano Zampini + mat - a dense matrix 2295a2b725a8SWilliam Gropp - array - pointer to the data 229673a71a0fSBarry Smith 229773a71a0fSBarry Smith Level: intermediate 229873a71a0fSBarry Smith 22996947451fSStefano Zampini .seealso: MatDenseGetArrayRead(), MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayWrite(), MatDenseRestoreArrayWrite() 230073a71a0fSBarry Smith @*/ 23018572280aSBarry Smith PetscErrorCode MatDenseRestoreArrayRead(Mat A,const PetscScalar **array) 230273a71a0fSBarry Smith { 230373a71a0fSBarry Smith PetscErrorCode ierr; 230473a71a0fSBarry Smith 230573a71a0fSBarry Smith PetscFunctionBegin; 2306d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 2307d5ea218eSStefano Zampini PetscValidPointer(array,2); 23088572280aSBarry Smith ierr = PetscUseMethod(A,"MatDenseRestoreArrayRead_C",(Mat,const PetscScalar**),(A,array));CHKERRQ(ierr); 230973a71a0fSBarry Smith PetscFunctionReturn(0); 231073a71a0fSBarry Smith } 231173a71a0fSBarry Smith 23126947451fSStefano Zampini /*@C 23136947451fSStefano Zampini MatDenseGetArrayWrite - gives write-only access to the array where the data for a dense matrix is stored 23146947451fSStefano Zampini 23156947451fSStefano Zampini Not Collective 23166947451fSStefano Zampini 23176947451fSStefano Zampini Input Parameter: 23186947451fSStefano Zampini . mat - a dense matrix 23196947451fSStefano Zampini 23206947451fSStefano Zampini Output Parameter: 23216947451fSStefano Zampini . array - pointer to the data 23226947451fSStefano Zampini 23236947451fSStefano Zampini Level: intermediate 23246947451fSStefano Zampini 23256947451fSStefano Zampini .seealso: MatDenseRestoreArrayWrite(), MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead() 23266947451fSStefano Zampini @*/ 23276947451fSStefano Zampini PetscErrorCode MatDenseGetArrayWrite(Mat A,PetscScalar **array) 23286947451fSStefano Zampini { 23296947451fSStefano Zampini PetscErrorCode ierr; 23306947451fSStefano Zampini 23316947451fSStefano Zampini PetscFunctionBegin; 2332d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 2333d5ea218eSStefano Zampini PetscValidPointer(array,2); 23346947451fSStefano Zampini ierr = PetscUseMethod(A,"MatDenseGetArrayWrite_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 23356947451fSStefano Zampini PetscFunctionReturn(0); 23366947451fSStefano Zampini } 23376947451fSStefano Zampini 23386947451fSStefano Zampini /*@C 23396947451fSStefano Zampini MatDenseRestoreArrayWrite - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArrayWrite() 23406947451fSStefano Zampini 23416947451fSStefano Zampini Not Collective 23426947451fSStefano Zampini 23436947451fSStefano Zampini Input Parameters: 23446947451fSStefano Zampini + mat - a dense matrix 23456947451fSStefano Zampini - array - pointer to the data 23466947451fSStefano Zampini 23476947451fSStefano Zampini Level: intermediate 23486947451fSStefano Zampini 23496947451fSStefano Zampini .seealso: MatDenseGetArrayWrite(), MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead() 23506947451fSStefano Zampini @*/ 23516947451fSStefano Zampini PetscErrorCode MatDenseRestoreArrayWrite(Mat A,PetscScalar **array) 23526947451fSStefano Zampini { 23536947451fSStefano Zampini PetscErrorCode ierr; 23546947451fSStefano Zampini 23556947451fSStefano Zampini PetscFunctionBegin; 2356d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 2357d5ea218eSStefano Zampini PetscValidPointer(array,2); 23586947451fSStefano Zampini ierr = PetscUseMethod(A,"MatDenseRestoreArrayWrite_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 23596947451fSStefano Zampini ierr = PetscObjectStateIncrease((PetscObject)A);CHKERRQ(ierr); 23606947451fSStefano Zampini #if defined(PETSC_HAVE_CUDA) 23616947451fSStefano Zampini A->offloadmask = PETSC_OFFLOAD_CPU; 23626947451fSStefano Zampini #endif 23636947451fSStefano Zampini PetscFunctionReturn(0); 23646947451fSStefano Zampini } 23656947451fSStefano Zampini 2366023c16fcSToby Isaac static PetscErrorCode MatCreateSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,MatReuse scall,Mat *B) 23670754003eSLois Curfman McInnes { 2368c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 23696849ba73SBarry Smith PetscErrorCode ierr; 2370ca15aa20SStefano Zampini PetscInt i,j,nrows,ncols,blda; 23715d0c19d7SBarry Smith const PetscInt *irow,*icol; 237287828ca2SBarry Smith PetscScalar *av,*bv,*v = mat->v; 23730754003eSLois Curfman McInnes Mat newmat; 23740754003eSLois Curfman McInnes 23753a40ed3dSBarry Smith PetscFunctionBegin; 237678b31e54SBarry Smith ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr); 237778b31e54SBarry Smith ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr); 2378e03a110bSBarry Smith ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr); 2379e03a110bSBarry Smith ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr); 23800754003eSLois Curfman McInnes 2381182d2002SSatish Balay /* Check submatrixcall */ 2382182d2002SSatish Balay if (scall == MAT_REUSE_MATRIX) { 238313f74950SBarry Smith PetscInt n_cols,n_rows; 2384182d2002SSatish Balay ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr); 238521a2c019SBarry Smith if (n_rows != nrows || n_cols != ncols) { 2386f746d493SDmitry Karpeev /* resize the result matrix to match number of requested rows/columns */ 2387c61587bbSBarry Smith ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 238821a2c019SBarry Smith } 2389182d2002SSatish Balay newmat = *B; 2390182d2002SSatish Balay } else { 23910754003eSLois Curfman McInnes /* Create and fill new matrix */ 2392ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr); 2393f69a0ea3SMatthew Knepley ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 23947adad957SLisandro Dalcin ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 23950298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr); 2396182d2002SSatish Balay } 2397182d2002SSatish Balay 2398182d2002SSatish Balay /* Now extract the data pointers and do the copy,column at a time */ 2399ca15aa20SStefano Zampini ierr = MatDenseGetArray(newmat,&bv);CHKERRQ(ierr); 2400ca15aa20SStefano Zampini ierr = MatDenseGetLDA(newmat,&blda);CHKERRQ(ierr); 2401182d2002SSatish Balay for (i=0; i<ncols; i++) { 24026de62eeeSBarry Smith av = v + mat->lda*icol[i]; 2403ca15aa20SStefano Zampini for (j=0; j<nrows; j++) bv[j] = av[irow[j]]; 2404ca15aa20SStefano Zampini bv += blda; 24050754003eSLois Curfman McInnes } 2406ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(newmat,&bv);CHKERRQ(ierr); 2407182d2002SSatish Balay 2408182d2002SSatish Balay /* Assemble the matrices so that the correct flags are set */ 24096d4a8577SBarry Smith ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 24106d4a8577SBarry Smith ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 24110754003eSLois Curfman McInnes 24120754003eSLois Curfman McInnes /* Free work space */ 241378b31e54SBarry Smith ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr); 241478b31e54SBarry Smith ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr); 2415182d2002SSatish Balay *B = newmat; 24163a40ed3dSBarry Smith PetscFunctionReturn(0); 24170754003eSLois Curfman McInnes } 24180754003eSLois Curfman McInnes 24197dae84e0SHong Zhang static PetscErrorCode MatCreateSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[]) 2420905e6a2fSBarry Smith { 24216849ba73SBarry Smith PetscErrorCode ierr; 242213f74950SBarry Smith PetscInt i; 2423905e6a2fSBarry Smith 24243a40ed3dSBarry Smith PetscFunctionBegin; 2425905e6a2fSBarry Smith if (scall == MAT_INITIAL_MATRIX) { 24263741e84bSPierre Jolivet ierr = PetscCalloc1(n,B);CHKERRQ(ierr); 2427905e6a2fSBarry Smith } 2428905e6a2fSBarry Smith 2429905e6a2fSBarry Smith for (i=0; i<n; i++) { 2430023c16fcSToby Isaac ierr = MatCreateSubMatrix_SeqDense(A,irow[i],icol[i],scall,&(*B)[i]);CHKERRQ(ierr); 2431905e6a2fSBarry Smith } 24323a40ed3dSBarry Smith PetscFunctionReturn(0); 2433905e6a2fSBarry Smith } 2434905e6a2fSBarry Smith 2435e0877f53SBarry Smith static PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode) 2436c0aa2d19SHong Zhang { 2437c0aa2d19SHong Zhang PetscFunctionBegin; 2438c0aa2d19SHong Zhang PetscFunctionReturn(0); 2439c0aa2d19SHong Zhang } 2440c0aa2d19SHong Zhang 2441e0877f53SBarry Smith static PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode) 2442c0aa2d19SHong Zhang { 2443c0aa2d19SHong Zhang PetscFunctionBegin; 2444c0aa2d19SHong Zhang PetscFunctionReturn(0); 2445c0aa2d19SHong Zhang } 2446c0aa2d19SHong Zhang 2447a76f77c3SStefano Zampini PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str) 24484b0e389bSBarry Smith { 24494b0e389bSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data; 24506849ba73SBarry Smith PetscErrorCode ierr; 2451ca15aa20SStefano Zampini const PetscScalar *va; 2452ca15aa20SStefano Zampini PetscScalar *vb; 2453d0f46423SBarry Smith PetscInt lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j; 24543a40ed3dSBarry Smith 24553a40ed3dSBarry Smith PetscFunctionBegin; 245633f4a19fSKris Buschelman /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */ 245733f4a19fSKris Buschelman if (A->ops->copy != B->ops->copy) { 2458cb5b572fSBarry Smith ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr); 24593a40ed3dSBarry Smith PetscFunctionReturn(0); 24603a40ed3dSBarry Smith } 2461e32f2f54SBarry Smith if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)"); 2462ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&va);CHKERRQ(ierr); 2463ca15aa20SStefano Zampini ierr = MatDenseGetArray(B,&vb);CHKERRQ(ierr); 2464a5ce6ee0Svictorle if (lda1>m || lda2>m) { 24650dbb7854Svictorle for (j=0; j<n; j++) { 2466ca15aa20SStefano Zampini ierr = PetscArraycpy(vb+j*lda2,va+j*lda1,m);CHKERRQ(ierr); 2467a5ce6ee0Svictorle } 2468a5ce6ee0Svictorle } else { 2469ca15aa20SStefano Zampini ierr = PetscArraycpy(vb,va,A->rmap->n*A->cmap->n);CHKERRQ(ierr); 2470a5ce6ee0Svictorle } 2471ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(B,&vb);CHKERRQ(ierr); 2472ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&va);CHKERRQ(ierr); 2473ca15aa20SStefano Zampini ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2474ca15aa20SStefano Zampini ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2475273d9f13SBarry Smith PetscFunctionReturn(0); 2476273d9f13SBarry Smith } 2477273d9f13SBarry Smith 2478e0877f53SBarry Smith static PetscErrorCode MatSetUp_SeqDense(Mat A) 2479273d9f13SBarry Smith { 2480dfbe8321SBarry Smith PetscErrorCode ierr; 2481273d9f13SBarry Smith 2482273d9f13SBarry Smith PetscFunctionBegin; 248318992e5dSStefano Zampini ierr = PetscLayoutSetUp(A->rmap);CHKERRQ(ierr); 248418992e5dSStefano Zampini ierr = PetscLayoutSetUp(A->cmap);CHKERRQ(ierr); 248518992e5dSStefano Zampini if (!A->preallocated) { 2486f4259b30SLisandro Dalcin ierr = MatSeqDenseSetPreallocation(A,NULL);CHKERRQ(ierr); 248718992e5dSStefano Zampini } 24883a40ed3dSBarry Smith PetscFunctionReturn(0); 24894b0e389bSBarry Smith } 24904b0e389bSBarry Smith 2491ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A) 2492ba337c44SJed Brown { 24934396437dSToby Isaac Mat_SeqDense *mat = (Mat_SeqDense *) A->data; 2494ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 24954396437dSToby Isaac PetscInt min = PetscMin(A->rmap->n,A->cmap->n); 2496ca15aa20SStefano Zampini PetscScalar *aa; 2497ca15aa20SStefano Zampini PetscErrorCode ierr; 2498ba337c44SJed Brown 2499ba337c44SJed Brown PetscFunctionBegin; 2500ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&aa);CHKERRQ(ierr); 2501ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]); 2502ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&aa);CHKERRQ(ierr); 25034396437dSToby Isaac if (mat->tau) for (i = 0; i < min; i++) mat->tau[i] = PetscConj(mat->tau[i]); 2504ba337c44SJed Brown PetscFunctionReturn(0); 2505ba337c44SJed Brown } 2506ba337c44SJed Brown 2507ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A) 2508ba337c44SJed Brown { 2509ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 2510ca15aa20SStefano Zampini PetscScalar *aa; 2511ca15aa20SStefano Zampini PetscErrorCode ierr; 2512ba337c44SJed Brown 2513ba337c44SJed Brown PetscFunctionBegin; 2514ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&aa);CHKERRQ(ierr); 2515ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]); 2516ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&aa);CHKERRQ(ierr); 2517ba337c44SJed Brown PetscFunctionReturn(0); 2518ba337c44SJed Brown } 2519ba337c44SJed Brown 2520ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A) 2521ba337c44SJed Brown { 2522ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 2523ca15aa20SStefano Zampini PetscScalar *aa; 2524ca15aa20SStefano Zampini PetscErrorCode ierr; 2525ba337c44SJed Brown 2526ba337c44SJed Brown PetscFunctionBegin; 2527ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&aa);CHKERRQ(ierr); 2528ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]); 2529ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&aa);CHKERRQ(ierr); 2530ba337c44SJed Brown PetscFunctionReturn(0); 2531ba337c44SJed Brown } 2532284134d9SBarry Smith 2533a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/ 25344222ddf1SHong Zhang PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat C) 2535a9fe9ddaSSatish Balay { 2536ee16a9a1SHong Zhang PetscErrorCode ierr; 2537d0f46423SBarry Smith PetscInt m=A->rmap->n,n=B->cmap->n; 25387a3c3d58SStefano Zampini PetscBool cisdense; 2539a9fe9ddaSSatish Balay 2540ee16a9a1SHong Zhang PetscFunctionBegin; 25414222ddf1SHong Zhang ierr = MatSetSizes(C,m,n,m,n);CHKERRQ(ierr); 25427a3c3d58SStefano Zampini ierr = PetscObjectTypeCompareAny((PetscObject)C,&cisdense,MATSEQDENSE,MATSEQDENSECUDA,"");CHKERRQ(ierr); 25437a3c3d58SStefano Zampini if (!cisdense) { 25447a3c3d58SStefano Zampini PetscBool flg; 25457a3c3d58SStefano Zampini 2546ca15aa20SStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)B,((PetscObject)A)->type_name,&flg);CHKERRQ(ierr); 25474222ddf1SHong Zhang ierr = MatSetType(C,flg ? ((PetscObject)A)->type_name : MATDENSE);CHKERRQ(ierr); 25487a3c3d58SStefano Zampini } 254918992e5dSStefano Zampini ierr = MatSetUp(C);CHKERRQ(ierr); 2550ee16a9a1SHong Zhang PetscFunctionReturn(0); 2551ee16a9a1SHong Zhang } 2552a9fe9ddaSSatish Balay 2553a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 2554a9fe9ddaSSatish Balay { 25556718818eSStefano Zampini Mat_SeqDense *a=(Mat_SeqDense*)A->data,*b=(Mat_SeqDense*)B->data,*c=(Mat_SeqDense*)C->data; 25560805154bSBarry Smith PetscBLASInt m,n,k; 2557ca15aa20SStefano Zampini const PetscScalar *av,*bv; 2558ca15aa20SStefano Zampini PetscScalar *cv; 2559a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 2560c2916339SPierre Jolivet PetscErrorCode ierr; 2561a9fe9ddaSSatish Balay 2562a9fe9ddaSSatish Balay PetscFunctionBegin; 25638208b9aeSStefano Zampini ierr = PetscBLASIntCast(C->rmap->n,&m);CHKERRQ(ierr); 25648208b9aeSStefano Zampini ierr = PetscBLASIntCast(C->cmap->n,&n);CHKERRQ(ierr); 2565c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr); 256649d0e964SStefano Zampini if (!m || !n || !k) PetscFunctionReturn(0); 2567ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&av);CHKERRQ(ierr); 2568ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(B,&bv);CHKERRQ(ierr); 25696718818eSStefano Zampini ierr = MatDenseGetArrayWrite(C,&cv);CHKERRQ(ierr); 2570ca15aa20SStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("N","N",&m,&n,&k,&_DOne,av,&a->lda,bv,&b->lda,&_DZero,cv,&c->lda)); 2571ca15aa20SStefano Zampini ierr = PetscLogFlops(1.0*m*n*k + 1.0*m*n*(k-1));CHKERRQ(ierr); 2572ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&av);CHKERRQ(ierr); 2573ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(B,&bv);CHKERRQ(ierr); 25746718818eSStefano Zampini ierr = MatDenseRestoreArrayWrite(C,&cv);CHKERRQ(ierr); 2575a9fe9ddaSSatish Balay PetscFunctionReturn(0); 2576a9fe9ddaSSatish Balay } 2577a9fe9ddaSSatish Balay 25784222ddf1SHong Zhang PetscErrorCode MatMatTransposeMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat C) 257969f65d41SStefano Zampini { 258069f65d41SStefano Zampini PetscErrorCode ierr; 258169f65d41SStefano Zampini PetscInt m=A->rmap->n,n=B->rmap->n; 25827a3c3d58SStefano Zampini PetscBool cisdense; 258369f65d41SStefano Zampini 258469f65d41SStefano Zampini PetscFunctionBegin; 25854222ddf1SHong Zhang ierr = MatSetSizes(C,m,n,m,n);CHKERRQ(ierr); 25867a3c3d58SStefano Zampini ierr = PetscObjectTypeCompareAny((PetscObject)C,&cisdense,MATSEQDENSE,MATSEQDENSECUDA,"");CHKERRQ(ierr); 25877a3c3d58SStefano Zampini if (!cisdense) { 25887a3c3d58SStefano Zampini PetscBool flg; 25897a3c3d58SStefano Zampini 2590ca15aa20SStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)B,((PetscObject)A)->type_name,&flg);CHKERRQ(ierr); 25914222ddf1SHong Zhang ierr = MatSetType(C,flg ? ((PetscObject)A)->type_name : MATDENSE);CHKERRQ(ierr); 25927a3c3d58SStefano Zampini } 259318992e5dSStefano Zampini ierr = MatSetUp(C);CHKERRQ(ierr); 259469f65d41SStefano Zampini PetscFunctionReturn(0); 259569f65d41SStefano Zampini } 259669f65d41SStefano Zampini 259769f65d41SStefano Zampini PetscErrorCode MatMatTransposeMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 259869f65d41SStefano Zampini { 259969f65d41SStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 260069f65d41SStefano Zampini Mat_SeqDense *b = (Mat_SeqDense*)B->data; 260169f65d41SStefano Zampini Mat_SeqDense *c = (Mat_SeqDense*)C->data; 26026718818eSStefano Zampini const PetscScalar *av,*bv; 26036718818eSStefano Zampini PetscScalar *cv; 260469f65d41SStefano Zampini PetscBLASInt m,n,k; 260569f65d41SStefano Zampini PetscScalar _DOne=1.0,_DZero=0.0; 260669f65d41SStefano Zampini PetscErrorCode ierr; 260769f65d41SStefano Zampini 260869f65d41SStefano Zampini PetscFunctionBegin; 260949d0e964SStefano Zampini ierr = PetscBLASIntCast(C->rmap->n,&m);CHKERRQ(ierr); 261049d0e964SStefano Zampini ierr = PetscBLASIntCast(C->cmap->n,&n);CHKERRQ(ierr); 261169f65d41SStefano Zampini ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr); 261249d0e964SStefano Zampini if (!m || !n || !k) PetscFunctionReturn(0); 26136718818eSStefano Zampini ierr = MatDenseGetArrayRead(A,&av);CHKERRQ(ierr); 26146718818eSStefano Zampini ierr = MatDenseGetArrayRead(B,&bv);CHKERRQ(ierr); 26156718818eSStefano Zampini ierr = MatDenseGetArrayWrite(C,&cv);CHKERRQ(ierr); 26166718818eSStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("N","T",&m,&n,&k,&_DOne,av,&a->lda,bv,&b->lda,&_DZero,cv,&c->lda)); 26176718818eSStefano Zampini ierr = MatDenseRestoreArrayRead(A,&av);CHKERRQ(ierr); 26186718818eSStefano Zampini ierr = MatDenseRestoreArrayRead(B,&bv);CHKERRQ(ierr); 26196718818eSStefano Zampini ierr = MatDenseRestoreArrayWrite(C,&cv);CHKERRQ(ierr); 2620ca15aa20SStefano Zampini ierr = PetscLogFlops(1.0*m*n*k + 1.0*m*n*(k-1));CHKERRQ(ierr); 262169f65d41SStefano Zampini PetscFunctionReturn(0); 262269f65d41SStefano Zampini } 262369f65d41SStefano Zampini 26244222ddf1SHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat C) 2625a9fe9ddaSSatish Balay { 2626ee16a9a1SHong Zhang PetscErrorCode ierr; 2627d0f46423SBarry Smith PetscInt m=A->cmap->n,n=B->cmap->n; 26287a3c3d58SStefano Zampini PetscBool cisdense; 2629a9fe9ddaSSatish Balay 2630ee16a9a1SHong Zhang PetscFunctionBegin; 26314222ddf1SHong Zhang ierr = MatSetSizes(C,m,n,m,n);CHKERRQ(ierr); 26327a3c3d58SStefano Zampini ierr = PetscObjectTypeCompareAny((PetscObject)C,&cisdense,MATSEQDENSE,MATSEQDENSECUDA,"");CHKERRQ(ierr); 26337a3c3d58SStefano Zampini if (!cisdense) { 26347a3c3d58SStefano Zampini PetscBool flg; 26357a3c3d58SStefano Zampini 2636ca15aa20SStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)B,((PetscObject)A)->type_name,&flg);CHKERRQ(ierr); 26374222ddf1SHong Zhang ierr = MatSetType(C,flg ? ((PetscObject)A)->type_name : MATDENSE);CHKERRQ(ierr); 26387a3c3d58SStefano Zampini } 263918992e5dSStefano Zampini ierr = MatSetUp(C);CHKERRQ(ierr); 2640ee16a9a1SHong Zhang PetscFunctionReturn(0); 2641ee16a9a1SHong Zhang } 2642a9fe9ddaSSatish Balay 264375648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 2644a9fe9ddaSSatish Balay { 2645a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2646a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 2647a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 26486718818eSStefano Zampini const PetscScalar *av,*bv; 26496718818eSStefano Zampini PetscScalar *cv; 26500805154bSBarry Smith PetscBLASInt m,n,k; 2651a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 2652c5df96a5SBarry Smith PetscErrorCode ierr; 2653a9fe9ddaSSatish Balay 2654a9fe9ddaSSatish Balay PetscFunctionBegin; 26558208b9aeSStefano Zampini ierr = PetscBLASIntCast(C->rmap->n,&m);CHKERRQ(ierr); 26568208b9aeSStefano Zampini ierr = PetscBLASIntCast(C->cmap->n,&n);CHKERRQ(ierr); 2657c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr); 265849d0e964SStefano Zampini if (!m || !n || !k) PetscFunctionReturn(0); 26596718818eSStefano Zampini ierr = MatDenseGetArrayRead(A,&av);CHKERRQ(ierr); 26606718818eSStefano Zampini ierr = MatDenseGetArrayRead(B,&bv);CHKERRQ(ierr); 26616718818eSStefano Zampini ierr = MatDenseGetArrayWrite(C,&cv);CHKERRQ(ierr); 26626718818eSStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("T","N",&m,&n,&k,&_DOne,av,&a->lda,bv,&b->lda,&_DZero,cv,&c->lda)); 26636718818eSStefano Zampini ierr = MatDenseRestoreArrayRead(A,&av);CHKERRQ(ierr); 26646718818eSStefano Zampini ierr = MatDenseRestoreArrayRead(B,&bv);CHKERRQ(ierr); 26656718818eSStefano Zampini ierr = MatDenseRestoreArrayWrite(C,&cv);CHKERRQ(ierr); 2666ca15aa20SStefano Zampini ierr = PetscLogFlops(1.0*m*n*k + 1.0*m*n*(k-1));CHKERRQ(ierr); 2667a9fe9ddaSSatish Balay PetscFunctionReturn(0); 2668a9fe9ddaSSatish Balay } 2669985db425SBarry Smith 26704222ddf1SHong Zhang /* ----------------------------------------------- */ 26714222ddf1SHong Zhang static PetscErrorCode MatProductSetFromOptions_SeqDense_AB(Mat C) 26724222ddf1SHong Zhang { 26734222ddf1SHong Zhang PetscFunctionBegin; 26744222ddf1SHong Zhang C->ops->matmultsymbolic = MatMatMultSymbolic_SeqDense_SeqDense; 26754222ddf1SHong Zhang C->ops->productsymbolic = MatProductSymbolic_AB; 26764222ddf1SHong Zhang PetscFunctionReturn(0); 26774222ddf1SHong Zhang } 26784222ddf1SHong Zhang 26794222ddf1SHong Zhang static PetscErrorCode MatProductSetFromOptions_SeqDense_AtB(Mat C) 26804222ddf1SHong Zhang { 26814222ddf1SHong Zhang PetscFunctionBegin; 26824222ddf1SHong Zhang C->ops->transposematmultsymbolic = MatTransposeMatMultSymbolic_SeqDense_SeqDense; 26834222ddf1SHong Zhang C->ops->productsymbolic = MatProductSymbolic_AtB; 26844222ddf1SHong Zhang PetscFunctionReturn(0); 26854222ddf1SHong Zhang } 26864222ddf1SHong Zhang 26874222ddf1SHong Zhang static PetscErrorCode MatProductSetFromOptions_SeqDense_ABt(Mat C) 26884222ddf1SHong Zhang { 26894222ddf1SHong Zhang PetscFunctionBegin; 26904222ddf1SHong Zhang C->ops->mattransposemultsymbolic = MatMatTransposeMultSymbolic_SeqDense_SeqDense; 26914222ddf1SHong Zhang C->ops->productsymbolic = MatProductSymbolic_ABt; 26924222ddf1SHong Zhang PetscFunctionReturn(0); 26934222ddf1SHong Zhang } 26944222ddf1SHong Zhang 26954222ddf1SHong Zhang PETSC_INTERN PetscErrorCode MatProductSetFromOptions_SeqDense(Mat C) 26964222ddf1SHong Zhang { 26974222ddf1SHong Zhang PetscErrorCode ierr; 26984222ddf1SHong Zhang Mat_Product *product = C->product; 26994222ddf1SHong Zhang 27004222ddf1SHong Zhang PetscFunctionBegin; 27014222ddf1SHong Zhang switch (product->type) { 27024222ddf1SHong Zhang case MATPRODUCT_AB: 27034222ddf1SHong Zhang ierr = MatProductSetFromOptions_SeqDense_AB(C);CHKERRQ(ierr); 27044222ddf1SHong Zhang break; 27054222ddf1SHong Zhang case MATPRODUCT_AtB: 27064222ddf1SHong Zhang ierr = MatProductSetFromOptions_SeqDense_AtB(C);CHKERRQ(ierr); 27074222ddf1SHong Zhang break; 27084222ddf1SHong Zhang case MATPRODUCT_ABt: 27094222ddf1SHong Zhang ierr = MatProductSetFromOptions_SeqDense_ABt(C);CHKERRQ(ierr); 27104222ddf1SHong Zhang break; 27116718818eSStefano Zampini default: 27124222ddf1SHong Zhang break; 27134222ddf1SHong Zhang } 27144222ddf1SHong Zhang PetscFunctionReturn(0); 27154222ddf1SHong Zhang } 27164222ddf1SHong Zhang /* ----------------------------------------------- */ 27174222ddf1SHong Zhang 2718e0877f53SBarry Smith static PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[]) 2719985db425SBarry Smith { 2720985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2721985db425SBarry Smith PetscErrorCode ierr; 2722d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 2723985db425SBarry Smith PetscScalar *x; 2724ca15aa20SStefano Zampini const PetscScalar *aa; 2725985db425SBarry Smith 2726985db425SBarry Smith PetscFunctionBegin; 2727e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2728985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2729985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 2730ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&aa);CHKERRQ(ierr); 2731e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2732985db425SBarry Smith for (i=0; i<m; i++) { 2733985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 2734985db425SBarry Smith for (j=1; j<n; j++) { 2735ca15aa20SStefano Zampini if (PetscRealPart(x[i]) < PetscRealPart(aa[i+a->lda*j])) {x[i] = aa[i + a->lda*j]; if (idx) idx[i] = j;} 2736985db425SBarry Smith } 2737985db425SBarry Smith } 2738ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&aa);CHKERRQ(ierr); 2739985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2740985db425SBarry Smith PetscFunctionReturn(0); 2741985db425SBarry Smith } 2742985db425SBarry Smith 2743e0877f53SBarry Smith static PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[]) 2744985db425SBarry Smith { 2745985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2746985db425SBarry Smith PetscErrorCode ierr; 2747d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 2748985db425SBarry Smith PetscScalar *x; 2749985db425SBarry Smith PetscReal atmp; 2750ca15aa20SStefano Zampini const PetscScalar *aa; 2751985db425SBarry Smith 2752985db425SBarry Smith PetscFunctionBegin; 2753e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2754985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2755985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 2756ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&aa);CHKERRQ(ierr); 2757e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2758985db425SBarry Smith for (i=0; i<m; i++) { 27599189402eSHong Zhang x[i] = PetscAbsScalar(aa[i]); 2760985db425SBarry Smith for (j=1; j<n; j++) { 2761ca15aa20SStefano Zampini atmp = PetscAbsScalar(aa[i+a->lda*j]); 2762985db425SBarry Smith if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;} 2763985db425SBarry Smith } 2764985db425SBarry Smith } 2765ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&aa);CHKERRQ(ierr); 2766985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2767985db425SBarry Smith PetscFunctionReturn(0); 2768985db425SBarry Smith } 2769985db425SBarry Smith 2770e0877f53SBarry Smith static PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[]) 2771985db425SBarry Smith { 2772985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2773985db425SBarry Smith PetscErrorCode ierr; 2774d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 2775985db425SBarry Smith PetscScalar *x; 2776ca15aa20SStefano Zampini const PetscScalar *aa; 2777985db425SBarry Smith 2778985db425SBarry Smith PetscFunctionBegin; 2779e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2780ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&aa);CHKERRQ(ierr); 2781985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2782985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 2783e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2784985db425SBarry Smith for (i=0; i<m; i++) { 2785985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 2786985db425SBarry Smith for (j=1; j<n; j++) { 2787ca15aa20SStefano Zampini if (PetscRealPart(x[i]) > PetscRealPart(aa[i+a->lda*j])) {x[i] = aa[i + a->lda*j]; if (idx) idx[i] = j;} 2788985db425SBarry Smith } 2789985db425SBarry Smith } 2790985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2791ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&aa);CHKERRQ(ierr); 2792985db425SBarry Smith PetscFunctionReturn(0); 2793985db425SBarry Smith } 2794985db425SBarry Smith 2795637a0070SStefano Zampini PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col) 27968d0534beSBarry Smith { 27978d0534beSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 27988d0534beSBarry Smith PetscErrorCode ierr; 27998d0534beSBarry Smith PetscScalar *x; 2800ca15aa20SStefano Zampini const PetscScalar *aa; 28018d0534beSBarry Smith 28028d0534beSBarry Smith PetscFunctionBegin; 2803e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2804ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&aa);CHKERRQ(ierr); 28058d0534beSBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2806ca15aa20SStefano Zampini ierr = PetscArraycpy(x,aa+col*a->lda,A->rmap->n);CHKERRQ(ierr); 28078d0534beSBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2808ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&aa);CHKERRQ(ierr); 28098d0534beSBarry Smith PetscFunctionReturn(0); 28108d0534beSBarry Smith } 28118d0534beSBarry Smith 281252c5f739Sprj- PETSC_INTERN PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms) 28130716a85fSBarry Smith { 28140716a85fSBarry Smith PetscErrorCode ierr; 28150716a85fSBarry Smith PetscInt i,j,m,n; 28161683a169SBarry Smith const PetscScalar *a; 28170716a85fSBarry Smith 28180716a85fSBarry Smith PetscFunctionBegin; 28190716a85fSBarry Smith ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr); 2820580bdb30SBarry Smith ierr = PetscArrayzero(norms,n);CHKERRQ(ierr); 28211683a169SBarry Smith ierr = MatDenseGetArrayRead(A,&a);CHKERRQ(ierr); 28220716a85fSBarry Smith if (type == NORM_2) { 28230716a85fSBarry Smith for (i=0; i<n; i++) { 28240716a85fSBarry Smith for (j=0; j<m; j++) { 28250716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]*a[j]); 28260716a85fSBarry Smith } 28270716a85fSBarry Smith a += m; 28280716a85fSBarry Smith } 28290716a85fSBarry Smith } else if (type == NORM_1) { 28300716a85fSBarry Smith for (i=0; i<n; i++) { 28310716a85fSBarry Smith for (j=0; j<m; j++) { 28320716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]); 28330716a85fSBarry Smith } 28340716a85fSBarry Smith a += m; 28350716a85fSBarry Smith } 28360716a85fSBarry Smith } else if (type == NORM_INFINITY) { 28370716a85fSBarry Smith for (i=0; i<n; i++) { 28380716a85fSBarry Smith for (j=0; j<m; j++) { 28390716a85fSBarry Smith norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]); 28400716a85fSBarry Smith } 28410716a85fSBarry Smith a += m; 28420716a85fSBarry Smith } 2843ce94432eSBarry Smith } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType"); 28441683a169SBarry Smith ierr = MatDenseRestoreArrayRead(A,&a);CHKERRQ(ierr); 28450716a85fSBarry Smith if (type == NORM_2) { 28468f1a2a5eSBarry Smith for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]); 28470716a85fSBarry Smith } 28480716a85fSBarry Smith PetscFunctionReturn(0); 28490716a85fSBarry Smith } 28500716a85fSBarry Smith 285173a71a0fSBarry Smith static PetscErrorCode MatSetRandom_SeqDense(Mat x,PetscRandom rctx) 285273a71a0fSBarry Smith { 285373a71a0fSBarry Smith PetscErrorCode ierr; 285473a71a0fSBarry Smith PetscScalar *a; 2855637a0070SStefano Zampini PetscInt lda,m,n,i,j; 285673a71a0fSBarry Smith 285773a71a0fSBarry Smith PetscFunctionBegin; 285873a71a0fSBarry Smith ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr); 2859637a0070SStefano Zampini ierr = MatDenseGetLDA(x,&lda);CHKERRQ(ierr); 28608c778c55SBarry Smith ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr); 2861637a0070SStefano Zampini for (j=0; j<n; j++) { 2862637a0070SStefano Zampini for (i=0; i<m; i++) { 2863637a0070SStefano Zampini ierr = PetscRandomGetValue(rctx,a+j*lda+i);CHKERRQ(ierr); 2864637a0070SStefano Zampini } 286573a71a0fSBarry Smith } 28668c778c55SBarry Smith ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr); 286773a71a0fSBarry Smith PetscFunctionReturn(0); 286873a71a0fSBarry Smith } 286973a71a0fSBarry Smith 28703b49f96aSBarry Smith static PetscErrorCode MatMissingDiagonal_SeqDense(Mat A,PetscBool *missing,PetscInt *d) 28713b49f96aSBarry Smith { 28723b49f96aSBarry Smith PetscFunctionBegin; 28733b49f96aSBarry Smith *missing = PETSC_FALSE; 28743b49f96aSBarry Smith PetscFunctionReturn(0); 28753b49f96aSBarry Smith } 287673a71a0fSBarry Smith 2877ca15aa20SStefano Zampini /* vals is not const */ 2878af53bab2SHong Zhang static PetscErrorCode MatDenseGetColumn_SeqDense(Mat A,PetscInt col,PetscScalar **vals) 287986aefd0dSHong Zhang { 2880ca15aa20SStefano Zampini PetscErrorCode ierr; 288186aefd0dSHong Zhang Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2882ca15aa20SStefano Zampini PetscScalar *v; 288386aefd0dSHong Zhang 288486aefd0dSHong Zhang PetscFunctionBegin; 288586aefd0dSHong Zhang if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2886ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr); 2887ca15aa20SStefano Zampini *vals = v+col*a->lda; 2888ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr); 288986aefd0dSHong Zhang PetscFunctionReturn(0); 289086aefd0dSHong Zhang } 289186aefd0dSHong Zhang 2892af53bab2SHong Zhang static PetscErrorCode MatDenseRestoreColumn_SeqDense(Mat A,PetscScalar **vals) 289386aefd0dSHong Zhang { 289486aefd0dSHong Zhang PetscFunctionBegin; 2895f4259b30SLisandro Dalcin *vals = NULL; /* user cannot accidently use the array later */ 289686aefd0dSHong Zhang PetscFunctionReturn(0); 289786aefd0dSHong Zhang } 2898abc3b08eSStefano Zampini 2899289bc588SBarry Smith /* -------------------------------------------------------------------*/ 2900a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense, 2901905e6a2fSBarry Smith MatGetRow_SeqDense, 2902905e6a2fSBarry Smith MatRestoreRow_SeqDense, 2903905e6a2fSBarry Smith MatMult_SeqDense, 290497304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense, 29057c922b88SBarry Smith MatMultTranspose_SeqDense, 29067c922b88SBarry Smith MatMultTransposeAdd_SeqDense, 2907f4259b30SLisandro Dalcin NULL, 2908f4259b30SLisandro Dalcin NULL, 2909f4259b30SLisandro Dalcin NULL, 2910f4259b30SLisandro Dalcin /* 10*/ NULL, 2911905e6a2fSBarry Smith MatLUFactor_SeqDense, 2912905e6a2fSBarry Smith MatCholeskyFactor_SeqDense, 291341f059aeSBarry Smith MatSOR_SeqDense, 2914ec8511deSBarry Smith MatTranspose_SeqDense, 291597304618SKris Buschelman /* 15*/ MatGetInfo_SeqDense, 2916905e6a2fSBarry Smith MatEqual_SeqDense, 2917905e6a2fSBarry Smith MatGetDiagonal_SeqDense, 2918905e6a2fSBarry Smith MatDiagonalScale_SeqDense, 2919905e6a2fSBarry Smith MatNorm_SeqDense, 2920c0aa2d19SHong Zhang /* 20*/ MatAssemblyBegin_SeqDense, 2921c0aa2d19SHong Zhang MatAssemblyEnd_SeqDense, 2922905e6a2fSBarry Smith MatSetOption_SeqDense, 2923905e6a2fSBarry Smith MatZeroEntries_SeqDense, 2924d519adbfSMatthew Knepley /* 24*/ MatZeroRows_SeqDense, 2925f4259b30SLisandro Dalcin NULL, 2926f4259b30SLisandro Dalcin NULL, 2927f4259b30SLisandro Dalcin NULL, 2928f4259b30SLisandro Dalcin NULL, 29294994cf47SJed Brown /* 29*/ MatSetUp_SeqDense, 2930f4259b30SLisandro Dalcin NULL, 2931f4259b30SLisandro Dalcin NULL, 2932f4259b30SLisandro Dalcin NULL, 2933f4259b30SLisandro Dalcin NULL, 2934d519adbfSMatthew Knepley /* 34*/ MatDuplicate_SeqDense, 2935f4259b30SLisandro Dalcin NULL, 2936f4259b30SLisandro Dalcin NULL, 2937f4259b30SLisandro Dalcin NULL, 2938f4259b30SLisandro Dalcin NULL, 2939d519adbfSMatthew Knepley /* 39*/ MatAXPY_SeqDense, 29407dae84e0SHong Zhang MatCreateSubMatrices_SeqDense, 2941f4259b30SLisandro Dalcin NULL, 29424b0e389bSBarry Smith MatGetValues_SeqDense, 2943a5ae1ecdSBarry Smith MatCopy_SeqDense, 2944d519adbfSMatthew Knepley /* 44*/ MatGetRowMax_SeqDense, 2945a5ae1ecdSBarry Smith MatScale_SeqDense, 29467d68702bSBarry Smith MatShift_Basic, 2947f4259b30SLisandro Dalcin NULL, 29483f49a652SStefano Zampini MatZeroRowsColumns_SeqDense, 294973a71a0fSBarry Smith /* 49*/ MatSetRandom_SeqDense, 2950f4259b30SLisandro Dalcin NULL, 2951f4259b30SLisandro Dalcin NULL, 2952f4259b30SLisandro Dalcin NULL, 2953f4259b30SLisandro Dalcin NULL, 2954f4259b30SLisandro Dalcin /* 54*/ NULL, 2955f4259b30SLisandro Dalcin NULL, 2956f4259b30SLisandro Dalcin NULL, 2957f4259b30SLisandro Dalcin NULL, 2958f4259b30SLisandro Dalcin NULL, 2959023c16fcSToby Isaac /* 59*/ MatCreateSubMatrix_SeqDense, 2960e03a110bSBarry Smith MatDestroy_SeqDense, 2961e03a110bSBarry Smith MatView_SeqDense, 2962f4259b30SLisandro Dalcin NULL, 2963f4259b30SLisandro Dalcin NULL, 2964f4259b30SLisandro Dalcin /* 64*/ NULL, 2965f4259b30SLisandro Dalcin NULL, 2966f4259b30SLisandro Dalcin NULL, 2967f4259b30SLisandro Dalcin NULL, 2968f4259b30SLisandro Dalcin NULL, 2969d519adbfSMatthew Knepley /* 69*/ MatGetRowMaxAbs_SeqDense, 2970f4259b30SLisandro Dalcin NULL, 2971f4259b30SLisandro Dalcin NULL, 2972f4259b30SLisandro Dalcin NULL, 2973f4259b30SLisandro Dalcin NULL, 2974f4259b30SLisandro Dalcin /* 74*/ NULL, 2975f4259b30SLisandro Dalcin NULL, 2976f4259b30SLisandro Dalcin NULL, 2977f4259b30SLisandro Dalcin NULL, 2978f4259b30SLisandro Dalcin NULL, 2979f4259b30SLisandro Dalcin /* 79*/ NULL, 2980f4259b30SLisandro Dalcin NULL, 2981f4259b30SLisandro Dalcin NULL, 2982f4259b30SLisandro Dalcin NULL, 29835bba2384SShri Abhyankar /* 83*/ MatLoad_SeqDense, 2984637a0070SStefano Zampini MatIsSymmetric_SeqDense, 29851cbb95d3SBarry Smith MatIsHermitian_SeqDense, 2986f4259b30SLisandro Dalcin NULL, 2987f4259b30SLisandro Dalcin NULL, 2988f4259b30SLisandro Dalcin NULL, 2989f4259b30SLisandro Dalcin /* 89*/ NULL, 2990f4259b30SLisandro Dalcin NULL, 2991a9fe9ddaSSatish Balay MatMatMultNumeric_SeqDense_SeqDense, 2992f4259b30SLisandro Dalcin NULL, 2993f4259b30SLisandro Dalcin NULL, 2994f4259b30SLisandro Dalcin /* 94*/ NULL, 2995f4259b30SLisandro Dalcin NULL, 2996f4259b30SLisandro Dalcin NULL, 299769f65d41SStefano Zampini MatMatTransposeMultNumeric_SeqDense_SeqDense, 2998f4259b30SLisandro Dalcin NULL, 29994222ddf1SHong Zhang /* 99*/ MatProductSetFromOptions_SeqDense, 3000f4259b30SLisandro Dalcin NULL, 3001f4259b30SLisandro Dalcin NULL, 3002ba337c44SJed Brown MatConjugate_SeqDense, 3003f4259b30SLisandro Dalcin NULL, 3004f4259b30SLisandro Dalcin /*104*/ NULL, 3005ba337c44SJed Brown MatRealPart_SeqDense, 3006ba337c44SJed Brown MatImaginaryPart_SeqDense, 3007f4259b30SLisandro Dalcin NULL, 3008f4259b30SLisandro Dalcin NULL, 3009f4259b30SLisandro Dalcin /*109*/ NULL, 3010f4259b30SLisandro Dalcin NULL, 30118d0534beSBarry Smith MatGetRowMin_SeqDense, 3012aabbc4fbSShri Abhyankar MatGetColumnVector_SeqDense, 30133b49f96aSBarry Smith MatMissingDiagonal_SeqDense, 3014f4259b30SLisandro Dalcin /*114*/ NULL, 3015f4259b30SLisandro Dalcin NULL, 3016f4259b30SLisandro Dalcin NULL, 3017f4259b30SLisandro Dalcin NULL, 3018f4259b30SLisandro Dalcin NULL, 3019f4259b30SLisandro Dalcin /*119*/ NULL, 3020f4259b30SLisandro Dalcin NULL, 3021f4259b30SLisandro Dalcin NULL, 3022f4259b30SLisandro Dalcin NULL, 3023f4259b30SLisandro Dalcin NULL, 3024f4259b30SLisandro Dalcin /*124*/ NULL, 30255df89d91SHong Zhang MatGetColumnNorms_SeqDense, 3026f4259b30SLisandro Dalcin NULL, 3027f4259b30SLisandro Dalcin NULL, 3028f4259b30SLisandro Dalcin NULL, 3029f4259b30SLisandro Dalcin /*129*/ NULL, 3030f4259b30SLisandro Dalcin NULL, 3031f4259b30SLisandro Dalcin NULL, 303275648e8dSHong Zhang MatTransposeMatMultNumeric_SeqDense_SeqDense, 3033f4259b30SLisandro Dalcin NULL, 3034f4259b30SLisandro Dalcin /*134*/ NULL, 3035f4259b30SLisandro Dalcin NULL, 3036f4259b30SLisandro Dalcin NULL, 3037f4259b30SLisandro Dalcin NULL, 3038f4259b30SLisandro Dalcin NULL, 3039f4259b30SLisandro Dalcin /*139*/ NULL, 3040f4259b30SLisandro Dalcin NULL, 3041f4259b30SLisandro Dalcin NULL, 3042f4259b30SLisandro Dalcin NULL, 3043f4259b30SLisandro Dalcin NULL, 30444222ddf1SHong Zhang MatCreateMPIMatConcatenateSeqMat_SeqDense, 3045f4259b30SLisandro Dalcin /*145*/ NULL, 3046f4259b30SLisandro Dalcin NULL, 3047f4259b30SLisandro Dalcin NULL 3048985db425SBarry Smith }; 304990ace30eSBarry Smith 30504b828684SBarry Smith /*@C 3051fafbff53SBarry Smith MatCreateSeqDense - Creates a sequential dense matrix that 3052d65003e9SLois Curfman McInnes is stored in column major order (the usual Fortran 77 manner). Many 3053d65003e9SLois Curfman McInnes of the matrix operations use the BLAS and LAPACK routines. 3054289bc588SBarry Smith 3055d083f849SBarry Smith Collective 3056db81eaa0SLois Curfman McInnes 305720563c6bSBarry Smith Input Parameters: 3058db81eaa0SLois Curfman McInnes + comm - MPI communicator, set to PETSC_COMM_SELF 30590c775827SLois Curfman McInnes . m - number of rows 306018f449edSLois Curfman McInnes . n - number of columns 30610298fd71SBarry Smith - data - optional location of matrix data in column major order. Set data=NULL for PETSc 3062dfc5480cSLois Curfman McInnes to control all matrix memory allocation. 306320563c6bSBarry Smith 306420563c6bSBarry Smith Output Parameter: 306544cd7ae7SLois Curfman McInnes . A - the matrix 306620563c6bSBarry Smith 3067b259b22eSLois Curfman McInnes Notes: 306818f449edSLois Curfman McInnes The data input variable is intended primarily for Fortran programmers 306918f449edSLois Curfman McInnes who wish to allocate their own matrix memory space. Most users should 30700298fd71SBarry Smith set data=NULL. 307118f449edSLois Curfman McInnes 3072027ccd11SLois Curfman McInnes Level: intermediate 3073027ccd11SLois Curfman McInnes 307469b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues() 307520563c6bSBarry Smith @*/ 30767087cfbeSBarry Smith PetscErrorCode MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A) 3077289bc588SBarry Smith { 3078dfbe8321SBarry Smith PetscErrorCode ierr; 30793b2fbd54SBarry Smith 30803a40ed3dSBarry Smith PetscFunctionBegin; 3081f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 3082f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr); 3083273d9f13SBarry Smith ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr); 3084273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr); 3085273d9f13SBarry Smith PetscFunctionReturn(0); 3086273d9f13SBarry Smith } 3087273d9f13SBarry Smith 3088273d9f13SBarry Smith /*@C 3089273d9f13SBarry Smith MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements 3090273d9f13SBarry Smith 3091d083f849SBarry Smith Collective 3092273d9f13SBarry Smith 3093273d9f13SBarry Smith Input Parameters: 30941c4f3114SJed Brown + B - the matrix 30950298fd71SBarry Smith - data - the array (or NULL) 3096273d9f13SBarry Smith 3097273d9f13SBarry Smith Notes: 3098273d9f13SBarry Smith The data input variable is intended primarily for Fortran programmers 3099273d9f13SBarry Smith who wish to allocate their own matrix memory space. Most users should 3100284134d9SBarry Smith need not call this routine. 3101273d9f13SBarry Smith 3102273d9f13SBarry Smith Level: intermediate 3103273d9f13SBarry Smith 3104ad16ce7aSStefano Zampini .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatDenseSetLDA() 3105867c911aSBarry Smith 3106273d9f13SBarry Smith @*/ 31077087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation(Mat B,PetscScalar data[]) 3108273d9f13SBarry Smith { 31094ac538c5SBarry Smith PetscErrorCode ierr; 3110a23d5eceSKris Buschelman 3111a23d5eceSKris Buschelman PetscFunctionBegin; 3112d5ea218eSStefano Zampini PetscValidHeaderSpecific(B,MAT_CLASSID,1); 31134ac538c5SBarry Smith ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr); 3114a23d5eceSKris Buschelman PetscFunctionReturn(0); 3115a23d5eceSKris Buschelman } 3116a23d5eceSKris Buschelman 31177087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data) 3118a23d5eceSKris Buschelman { 3119ad16ce7aSStefano Zampini Mat_SeqDense *b = (Mat_SeqDense*)B->data; 3120dfbe8321SBarry Smith PetscErrorCode ierr; 3121273d9f13SBarry Smith 3122273d9f13SBarry Smith PetscFunctionBegin; 3123616b8fbbSStefano Zampini if (b->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first"); 3124273d9f13SBarry Smith B->preallocated = PETSC_TRUE; 3125a868139aSShri Abhyankar 312634ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr); 312734ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr); 312834ef9618SShri Abhyankar 3129ad16ce7aSStefano Zampini if (b->lda <= 0) b->lda = B->rmap->n; 313086d161a7SShri Abhyankar 3131ad16ce7aSStefano Zampini ierr = PetscIntMultError(b->lda,B->cmap->n,NULL);CHKERRQ(ierr); 31329e8f95c4SLisandro Dalcin if (!data) { /* petsc-allocated storage */ 31339e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 3134ad16ce7aSStefano Zampini ierr = PetscCalloc1((size_t)b->lda*B->cmap->n,&b->v);CHKERRQ(ierr); 3135ad16ce7aSStefano Zampini ierr = PetscLogObjectMemory((PetscObject)B,b->lda*B->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 31362205254eSKarl Rupp 31379e8f95c4SLisandro Dalcin b->user_alloc = PETSC_FALSE; 3138273d9f13SBarry Smith } else { /* user-allocated storage */ 31399e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 3140273d9f13SBarry Smith b->v = data; 3141273d9f13SBarry Smith b->user_alloc = PETSC_TRUE; 3142273d9f13SBarry Smith } 31430450473dSBarry Smith B->assembled = PETSC_TRUE; 3144273d9f13SBarry Smith PetscFunctionReturn(0); 3145273d9f13SBarry Smith } 3146273d9f13SBarry Smith 314765b80a83SHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 3148cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat) 31498baccfbdSHong Zhang { 3150d77f618aSHong Zhang Mat mat_elemental; 3151d77f618aSHong Zhang PetscErrorCode ierr; 31521683a169SBarry Smith const PetscScalar *array; 31531683a169SBarry Smith PetscScalar *v_colwise; 3154d77f618aSHong Zhang PetscInt M=A->rmap->N,N=A->cmap->N,i,j,k,*rows,*cols; 3155d77f618aSHong Zhang 31568baccfbdSHong Zhang PetscFunctionBegin; 3157d77f618aSHong Zhang ierr = PetscMalloc3(M*N,&v_colwise,M,&rows,N,&cols);CHKERRQ(ierr); 31581683a169SBarry Smith ierr = MatDenseGetArrayRead(A,&array);CHKERRQ(ierr); 3159d77f618aSHong Zhang /* convert column-wise array into row-wise v_colwise, see MatSetValues_Elemental() */ 3160d77f618aSHong Zhang k = 0; 3161d77f618aSHong Zhang for (j=0; j<N; j++) { 3162d77f618aSHong Zhang cols[j] = j; 3163d77f618aSHong Zhang for (i=0; i<M; i++) { 3164d77f618aSHong Zhang v_colwise[j*M+i] = array[k++]; 3165d77f618aSHong Zhang } 3166d77f618aSHong Zhang } 3167d77f618aSHong Zhang for (i=0; i<M; i++) { 3168d77f618aSHong Zhang rows[i] = i; 3169d77f618aSHong Zhang } 31701683a169SBarry Smith ierr = MatDenseRestoreArrayRead(A,&array);CHKERRQ(ierr); 3171d77f618aSHong Zhang 3172d77f618aSHong Zhang ierr = MatCreate(PetscObjectComm((PetscObject)A), &mat_elemental);CHKERRQ(ierr); 3173d77f618aSHong Zhang ierr = MatSetSizes(mat_elemental,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr); 3174d77f618aSHong Zhang ierr = MatSetType(mat_elemental,MATELEMENTAL);CHKERRQ(ierr); 3175d77f618aSHong Zhang ierr = MatSetUp(mat_elemental);CHKERRQ(ierr); 3176d77f618aSHong Zhang 3177d77f618aSHong Zhang /* PETSc-Elemental interaface uses axpy for setting off-processor entries, only ADD_VALUES is allowed */ 3178d77f618aSHong Zhang ierr = MatSetValues(mat_elemental,M,rows,N,cols,v_colwise,ADD_VALUES);CHKERRQ(ierr); 3179d77f618aSHong Zhang ierr = MatAssemblyBegin(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 3180d77f618aSHong Zhang ierr = MatAssemblyEnd(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 3181d77f618aSHong Zhang ierr = PetscFree3(v_colwise,rows,cols);CHKERRQ(ierr); 3182d77f618aSHong Zhang 3183511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 318428be2f97SBarry Smith ierr = MatHeaderReplace(A,&mat_elemental);CHKERRQ(ierr); 3185d77f618aSHong Zhang } else { 3186d77f618aSHong Zhang *newmat = mat_elemental; 3187d77f618aSHong Zhang } 31888baccfbdSHong Zhang PetscFunctionReturn(0); 31898baccfbdSHong Zhang } 319065b80a83SHong Zhang #endif 31918baccfbdSHong Zhang 319217359960SJose E. Roman PetscErrorCode MatDenseSetLDA_SeqDense(Mat B,PetscInt lda) 31931b807ce4Svictorle { 31941b807ce4Svictorle Mat_SeqDense *b = (Mat_SeqDense*)B->data; 31957422da62SJose E. Roman PetscBool data; 319621a2c019SBarry Smith 31971b807ce4Svictorle PetscFunctionBegin; 31987422da62SJose E. Roman data = (PetscBool)((B->rmap->n > 0 && B->cmap->n > 0) ? (b->v ? PETSC_TRUE : PETSC_FALSE) : PETSC_FALSE); 31997422da62SJose E. Roman if (!b->user_alloc && data && b->lda!=lda) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"LDA cannot be changed after allocation of internal storage"); 3200e32f2f54SBarry Smith if (lda < B->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"LDA %D must be at least matrix dimension %D",lda,B->rmap->n); 32011b807ce4Svictorle b->lda = lda; 32021b807ce4Svictorle PetscFunctionReturn(0); 32031b807ce4Svictorle } 32041b807ce4Svictorle 3205d528f656SJakub Kruzik PetscErrorCode MatCreateMPIMatConcatenateSeqMat_SeqDense(MPI_Comm comm,Mat inmat,PetscInt n,MatReuse scall,Mat *outmat) 3206d528f656SJakub Kruzik { 3207d528f656SJakub Kruzik PetscErrorCode ierr; 3208d528f656SJakub Kruzik PetscMPIInt size; 3209d528f656SJakub Kruzik 3210d528f656SJakub Kruzik PetscFunctionBegin; 3211ffc4695bSBarry Smith ierr = MPI_Comm_size(comm,&size);CHKERRMPI(ierr); 3212d528f656SJakub Kruzik if (size == 1) { 3213d528f656SJakub Kruzik if (scall == MAT_INITIAL_MATRIX) { 3214d528f656SJakub Kruzik ierr = MatDuplicate(inmat,MAT_COPY_VALUES,outmat);CHKERRQ(ierr); 3215d528f656SJakub Kruzik } else { 3216d528f656SJakub Kruzik ierr = MatCopy(inmat,*outmat,SAME_NONZERO_PATTERN);CHKERRQ(ierr); 3217d528f656SJakub Kruzik } 3218d528f656SJakub Kruzik } else { 3219d528f656SJakub Kruzik ierr = MatCreateMPIMatConcatenateSeqMat_MPIDense(comm,inmat,n,scall,outmat);CHKERRQ(ierr); 3220d528f656SJakub Kruzik } 3221d528f656SJakub Kruzik PetscFunctionReturn(0); 3222d528f656SJakub Kruzik } 3223d528f656SJakub Kruzik 32246947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVec_SeqDense(Mat A,PetscInt col,Vec *v) 32256947451fSStefano Zampini { 32266947451fSStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 32276947451fSStefano Zampini PetscErrorCode ierr; 32286947451fSStefano Zampini 32296947451fSStefano Zampini PetscFunctionBegin; 32305ea7661aSPierre Jolivet if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first"); 32315ea7661aSPierre Jolivet if (a->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first"); 32326947451fSStefano Zampini if (!a->cvec) { 32336947451fSStefano Zampini ierr = VecCreateSeqWithArray(PetscObjectComm((PetscObject)A),A->rmap->bs,A->rmap->n,NULL,&a->cvec);CHKERRQ(ierr); 3234616b8fbbSStefano Zampini ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)a->cvec);CHKERRQ(ierr); 32356947451fSStefano Zampini } 32366947451fSStefano Zampini a->vecinuse = col + 1; 32376947451fSStefano Zampini ierr = MatDenseGetArray(A,(PetscScalar**)&a->ptrinuse);CHKERRQ(ierr); 32386947451fSStefano Zampini ierr = VecPlaceArray(a->cvec,a->ptrinuse + (size_t)col * (size_t)a->lda);CHKERRQ(ierr); 32396947451fSStefano Zampini *v = a->cvec; 32406947451fSStefano Zampini PetscFunctionReturn(0); 32416947451fSStefano Zampini } 32426947451fSStefano Zampini 32436947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVec_SeqDense(Mat A,PetscInt col,Vec *v) 32446947451fSStefano Zampini { 32456947451fSStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 32466947451fSStefano Zampini PetscErrorCode ierr; 32476947451fSStefano Zampini 32486947451fSStefano Zampini PetscFunctionBegin; 32495ea7661aSPierre Jolivet if (!a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseGetColumnVec() first"); 32506947451fSStefano Zampini if (!a->cvec) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing internal column vector"); 32516947451fSStefano Zampini a->vecinuse = 0; 32526947451fSStefano Zampini ierr = MatDenseRestoreArray(A,(PetscScalar**)&a->ptrinuse);CHKERRQ(ierr); 32536947451fSStefano Zampini ierr = VecResetArray(a->cvec);CHKERRQ(ierr); 32546947451fSStefano Zampini *v = NULL; 32556947451fSStefano Zampini PetscFunctionReturn(0); 32566947451fSStefano Zampini } 32576947451fSStefano Zampini 32586947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVecRead_SeqDense(Mat A,PetscInt col,Vec *v) 32596947451fSStefano Zampini { 32606947451fSStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 32616947451fSStefano Zampini PetscErrorCode ierr; 32626947451fSStefano Zampini 32636947451fSStefano Zampini PetscFunctionBegin; 32645ea7661aSPierre Jolivet if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first"); 32655ea7661aSPierre Jolivet if (a->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first"); 32666947451fSStefano Zampini if (!a->cvec) { 32676947451fSStefano Zampini ierr = VecCreateSeqWithArray(PetscObjectComm((PetscObject)A),A->rmap->bs,A->rmap->n,NULL,&a->cvec);CHKERRQ(ierr); 3268616b8fbbSStefano Zampini ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)a->cvec);CHKERRQ(ierr); 32696947451fSStefano Zampini } 32706947451fSStefano Zampini a->vecinuse = col + 1; 32716947451fSStefano Zampini ierr = MatDenseGetArrayRead(A,&a->ptrinuse);CHKERRQ(ierr); 32726947451fSStefano Zampini ierr = VecPlaceArray(a->cvec,a->ptrinuse + (size_t)col * (size_t)a->lda);CHKERRQ(ierr); 32736947451fSStefano Zampini ierr = VecLockReadPush(a->cvec);CHKERRQ(ierr); 32746947451fSStefano Zampini *v = a->cvec; 32756947451fSStefano Zampini PetscFunctionReturn(0); 32766947451fSStefano Zampini } 32776947451fSStefano Zampini 32786947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVecRead_SeqDense(Mat A,PetscInt col,Vec *v) 32796947451fSStefano Zampini { 32806947451fSStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 32816947451fSStefano Zampini PetscErrorCode ierr; 32826947451fSStefano Zampini 32836947451fSStefano Zampini PetscFunctionBegin; 32845ea7661aSPierre Jolivet if (!a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseGetColumnVec() first"); 32856947451fSStefano Zampini if (!a->cvec) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing internal column vector"); 32866947451fSStefano Zampini a->vecinuse = 0; 32876947451fSStefano Zampini ierr = MatDenseRestoreArrayRead(A,&a->ptrinuse);CHKERRQ(ierr); 32886947451fSStefano Zampini ierr = VecLockReadPop(a->cvec);CHKERRQ(ierr); 32896947451fSStefano Zampini ierr = VecResetArray(a->cvec);CHKERRQ(ierr); 32906947451fSStefano Zampini *v = NULL; 32916947451fSStefano Zampini PetscFunctionReturn(0); 32926947451fSStefano Zampini } 32936947451fSStefano Zampini 32946947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVecWrite_SeqDense(Mat A,PetscInt col,Vec *v) 32956947451fSStefano Zampini { 32966947451fSStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 32976947451fSStefano Zampini PetscErrorCode ierr; 32986947451fSStefano Zampini 32996947451fSStefano Zampini PetscFunctionBegin; 33005ea7661aSPierre Jolivet if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first"); 33015ea7661aSPierre Jolivet if (a->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first"); 33026947451fSStefano Zampini if (!a->cvec) { 33036947451fSStefano Zampini ierr = VecCreateSeqWithArray(PetscObjectComm((PetscObject)A),A->rmap->bs,A->rmap->n,NULL,&a->cvec);CHKERRQ(ierr); 3304616b8fbbSStefano Zampini ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)a->cvec);CHKERRQ(ierr); 33056947451fSStefano Zampini } 33066947451fSStefano Zampini a->vecinuse = col + 1; 33076947451fSStefano Zampini ierr = MatDenseGetArrayWrite(A,(PetscScalar**)&a->ptrinuse);CHKERRQ(ierr); 33086947451fSStefano Zampini ierr = VecPlaceArray(a->cvec,a->ptrinuse + (size_t)col * (size_t)a->lda);CHKERRQ(ierr); 33096947451fSStefano Zampini *v = a->cvec; 33106947451fSStefano Zampini PetscFunctionReturn(0); 33116947451fSStefano Zampini } 33126947451fSStefano Zampini 33136947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVecWrite_SeqDense(Mat A,PetscInt col,Vec *v) 33146947451fSStefano Zampini { 33156947451fSStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 33166947451fSStefano Zampini PetscErrorCode ierr; 33176947451fSStefano Zampini 33186947451fSStefano Zampini PetscFunctionBegin; 33195ea7661aSPierre Jolivet if (!a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseGetColumnVec() first"); 33206947451fSStefano Zampini if (!a->cvec) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing internal column vector"); 33216947451fSStefano Zampini a->vecinuse = 0; 33226947451fSStefano Zampini ierr = MatDenseRestoreArrayWrite(A,(PetscScalar**)&a->ptrinuse);CHKERRQ(ierr); 33236947451fSStefano Zampini ierr = VecResetArray(a->cvec);CHKERRQ(ierr); 33246947451fSStefano Zampini *v = NULL; 33256947451fSStefano Zampini PetscFunctionReturn(0); 33266947451fSStefano Zampini } 33276947451fSStefano Zampini 33285ea7661aSPierre Jolivet PetscErrorCode MatDenseGetSubMatrix_SeqDense(Mat A,PetscInt cbegin,PetscInt cend,Mat *v) 33295ea7661aSPierre Jolivet { 33305ea7661aSPierre Jolivet Mat_SeqDense *a = (Mat_SeqDense*)A->data; 33315ea7661aSPierre Jolivet PetscErrorCode ierr; 33325ea7661aSPierre Jolivet 33335ea7661aSPierre Jolivet PetscFunctionBegin; 33345ea7661aSPierre Jolivet if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first"); 33355ea7661aSPierre Jolivet if (a->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first"); 33365ea7661aSPierre Jolivet if (a->cmat && cend-cbegin != a->cmat->cmap->N) { 33375ea7661aSPierre Jolivet ierr = MatDestroy(&a->cmat);CHKERRQ(ierr); 33385ea7661aSPierre Jolivet } 33395ea7661aSPierre Jolivet if (!a->cmat) { 3340616b8fbbSStefano Zampini ierr = MatCreateDense(PetscObjectComm((PetscObject)A),A->rmap->n,PETSC_DECIDE,A->rmap->N,cend-cbegin,(PetscScalar*)a->v + (size_t)cbegin * (size_t)a->lda,&a->cmat);CHKERRQ(ierr); 3341616b8fbbSStefano Zampini ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)a->cmat);CHKERRQ(ierr); 33425ea7661aSPierre Jolivet } else { 3343616b8fbbSStefano Zampini ierr = MatDensePlaceArray(a->cmat,a->v + (size_t)cbegin * (size_t)a->lda);CHKERRQ(ierr); 33445ea7661aSPierre Jolivet } 3345616b8fbbSStefano Zampini ierr = MatDenseSetLDA(a->cmat,a->lda);CHKERRQ(ierr); 33465ea7661aSPierre Jolivet a->matinuse = cbegin + 1; 33475ea7661aSPierre Jolivet *v = a->cmat; 33485ea7661aSPierre Jolivet PetscFunctionReturn(0); 33495ea7661aSPierre Jolivet } 33505ea7661aSPierre Jolivet 33515ea7661aSPierre Jolivet PetscErrorCode MatDenseRestoreSubMatrix_SeqDense(Mat A,Mat *v) 33525ea7661aSPierre Jolivet { 33535ea7661aSPierre Jolivet Mat_SeqDense *a = (Mat_SeqDense*)A->data; 33545ea7661aSPierre Jolivet PetscErrorCode ierr; 33555ea7661aSPierre Jolivet 33565ea7661aSPierre Jolivet PetscFunctionBegin; 33575ea7661aSPierre Jolivet if (!a->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseGetSubMatrix() first"); 33585ea7661aSPierre Jolivet if (!a->cmat) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing internal column matrix"); 3359616b8fbbSStefano Zampini if (*v != a->cmat) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not the matrix obtained from MatDenseGetSubMatrix()"); 33605ea7661aSPierre Jolivet a->matinuse = 0; 33615ea7661aSPierre Jolivet ierr = MatDenseResetArray(a->cmat);CHKERRQ(ierr); 33625ea7661aSPierre Jolivet *v = NULL; 33635ea7661aSPierre Jolivet PetscFunctionReturn(0); 33645ea7661aSPierre Jolivet } 33655ea7661aSPierre Jolivet 33660bad9183SKris Buschelman /*MC 3367fafad747SKris Buschelman MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices. 33680bad9183SKris Buschelman 33690bad9183SKris Buschelman Options Database Keys: 33700bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions() 33710bad9183SKris Buschelman 33720bad9183SKris Buschelman Level: beginner 33730bad9183SKris Buschelman 337489665df3SBarry Smith .seealso: MatCreateSeqDense() 337589665df3SBarry Smith 33760bad9183SKris Buschelman M*/ 3377ca15aa20SStefano Zampini PetscErrorCode MatCreate_SeqDense(Mat B) 3378273d9f13SBarry Smith { 3379273d9f13SBarry Smith Mat_SeqDense *b; 3380dfbe8321SBarry Smith PetscErrorCode ierr; 33817c334f02SBarry Smith PetscMPIInt size; 3382273d9f13SBarry Smith 3383273d9f13SBarry Smith PetscFunctionBegin; 3384ffc4695bSBarry Smith ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRMPI(ierr); 3385e32f2f54SBarry Smith if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1"); 338655659b69SBarry Smith 3387b00a9115SJed Brown ierr = PetscNewLog(B,&b);CHKERRQ(ierr); 3388549d3d68SSatish Balay ierr = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr); 338944cd7ae7SLois Curfman McInnes B->data = (void*)b; 339018f449edSLois Curfman McInnes 3391273d9f13SBarry Smith b->roworiented = PETSC_TRUE; 33924e220ebcSLois Curfman McInnes 33934905a7bcSToby Isaac ierr = PetscObjectComposeFunction((PetscObject)B,"MatQRFactor_C",MatQRFactor_SeqDense);CHKERRQ(ierr); 33944905a7bcSToby Isaac ierr = PetscObjectComposeFunction((PetscObject)B,"MatQRFactorNumeric_C",MatQRFactorNumeric_SeqDense);CHKERRQ(ierr); 33954905a7bcSToby Isaac ierr = PetscObjectComposeFunction((PetscObject)B,"MatQRFactorSymbolic_C",MatQRFactorSymbolic_SeqDense);CHKERRQ(ierr); 339649a6ff4bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetLDA_C",MatDenseGetLDA_SeqDense);CHKERRQ(ierr); 3397ad16ce7aSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseSetLDA_C",MatDenseSetLDA_SeqDense);CHKERRQ(ierr); 3398bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr); 33998572280aSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr); 3400d3042a70SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDensePlaceArray_C",MatDensePlaceArray_SeqDense);CHKERRQ(ierr); 3401d3042a70SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseResetArray_C",MatDenseResetArray_SeqDense);CHKERRQ(ierr); 3402d5ea218eSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseReplaceArray_C",MatDenseReplaceArray_SeqDense);CHKERRQ(ierr); 34038572280aSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArrayRead_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr); 3404715b7558SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArrayRead_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr); 34056947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArrayWrite_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr); 34066947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArrayWrite_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr); 3407bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr); 34088baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 34098baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr); 34108baccfbdSHong Zhang #endif 3411d24d4204SJose E. Roman #if defined(PETSC_HAVE_SCALAPACK) 3412d24d4204SJose E. Roman ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_scalapack_C",MatConvert_Dense_ScaLAPACK);CHKERRQ(ierr); 3413d24d4204SJose E. Roman #endif 34142bf066beSStefano Zampini #if defined(PETSC_HAVE_CUDA) 34152bf066beSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqdensecuda_C",MatConvert_SeqDense_SeqDenseCUDA);CHKERRQ(ierr); 34164222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqdensecuda_seqdensecuda_C",MatProductSetFromOptions_SeqDense);CHKERRQ(ierr); 34174222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqdensecuda_seqdense_C",MatProductSetFromOptions_SeqDense);CHKERRQ(ierr); 3418637a0070SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqdense_seqdensecuda_C",MatProductSetFromOptions_SeqDense);CHKERRQ(ierr); 34192bf066beSStefano Zampini #endif 3420bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr); 34214222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqaij_seqdense_C",MatProductSetFromOptions_SeqAIJ_SeqDense);CHKERRQ(ierr); 34224222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqdense_seqdense_C",MatProductSetFromOptions_SeqDense);CHKERRQ(ierr); 34234222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqbaij_seqdense_C",MatProductSetFromOptions_SeqXBAIJ_SeqDense);CHKERRQ(ierr); 34244222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqsbaij_seqdense_C",MatProductSetFromOptions_SeqXBAIJ_SeqDense);CHKERRQ(ierr); 342596e6d5c4SRichard Tran Mills 3426af53bab2SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumn_C",MatDenseGetColumn_SeqDense);CHKERRQ(ierr); 3427af53bab2SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumn_C",MatDenseRestoreColumn_SeqDense);CHKERRQ(ierr); 34286947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumnVec_C",MatDenseGetColumnVec_SeqDense);CHKERRQ(ierr); 34296947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumnVec_C",MatDenseRestoreColumnVec_SeqDense);CHKERRQ(ierr); 34306947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumnVecRead_C",MatDenseGetColumnVecRead_SeqDense);CHKERRQ(ierr); 34316947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumnVecRead_C",MatDenseRestoreColumnVecRead_SeqDense);CHKERRQ(ierr); 34326947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumnVecWrite_C",MatDenseGetColumnVecWrite_SeqDense);CHKERRQ(ierr); 34336947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumnVecWrite_C",MatDenseRestoreColumnVecWrite_SeqDense);CHKERRQ(ierr); 34345ea7661aSPierre Jolivet ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetSubMatrix_C",MatDenseGetSubMatrix_SeqDense);CHKERRQ(ierr); 34355ea7661aSPierre Jolivet ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreSubMatrix_C",MatDenseRestoreSubMatrix_SeqDense);CHKERRQ(ierr); 343617667f90SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr); 34373a40ed3dSBarry Smith PetscFunctionReturn(0); 3438289bc588SBarry Smith } 343986aefd0dSHong Zhang 344086aefd0dSHong Zhang /*@C 3441af53bab2SHong 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. 344286aefd0dSHong Zhang 344386aefd0dSHong Zhang Not Collective 344486aefd0dSHong Zhang 34455ea7661aSPierre Jolivet Input Parameters: 344686aefd0dSHong Zhang + mat - a MATSEQDENSE or MATMPIDENSE matrix 344786aefd0dSHong Zhang - col - column index 344886aefd0dSHong Zhang 344986aefd0dSHong Zhang Output Parameter: 345086aefd0dSHong Zhang . vals - pointer to the data 345186aefd0dSHong Zhang 345286aefd0dSHong Zhang Level: intermediate 345386aefd0dSHong Zhang 345486aefd0dSHong Zhang .seealso: MatDenseRestoreColumn() 345586aefd0dSHong Zhang @*/ 345686aefd0dSHong Zhang PetscErrorCode MatDenseGetColumn(Mat A,PetscInt col,PetscScalar **vals) 345786aefd0dSHong Zhang { 345886aefd0dSHong Zhang PetscErrorCode ierr; 345986aefd0dSHong Zhang 346086aefd0dSHong Zhang PetscFunctionBegin; 3461d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 3462d5ea218eSStefano Zampini PetscValidLogicalCollectiveInt(A,col,2); 3463d5ea218eSStefano Zampini PetscValidPointer(vals,3); 346486aefd0dSHong Zhang ierr = PetscUseMethod(A,"MatDenseGetColumn_C",(Mat,PetscInt,PetscScalar**),(A,col,vals));CHKERRQ(ierr); 346586aefd0dSHong Zhang PetscFunctionReturn(0); 346686aefd0dSHong Zhang } 346786aefd0dSHong Zhang 346886aefd0dSHong Zhang /*@C 346986aefd0dSHong Zhang MatDenseRestoreColumn - returns access to a column of a dense matrix which is returned by MatDenseGetColumn(). 347086aefd0dSHong Zhang 347186aefd0dSHong Zhang Not Collective 347286aefd0dSHong Zhang 347386aefd0dSHong Zhang Input Parameter: 347486aefd0dSHong Zhang . mat - a MATSEQDENSE or MATMPIDENSE matrix 347586aefd0dSHong Zhang 347686aefd0dSHong Zhang Output Parameter: 347786aefd0dSHong Zhang . vals - pointer to the data 347886aefd0dSHong Zhang 347986aefd0dSHong Zhang Level: intermediate 348086aefd0dSHong Zhang 348186aefd0dSHong Zhang .seealso: MatDenseGetColumn() 348286aefd0dSHong Zhang @*/ 348386aefd0dSHong Zhang PetscErrorCode MatDenseRestoreColumn(Mat A,PetscScalar **vals) 348486aefd0dSHong Zhang { 348586aefd0dSHong Zhang PetscErrorCode ierr; 348686aefd0dSHong Zhang 348786aefd0dSHong Zhang PetscFunctionBegin; 3488d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 3489d5ea218eSStefano Zampini PetscValidPointer(vals,2); 349086aefd0dSHong Zhang ierr = PetscUseMethod(A,"MatDenseRestoreColumn_C",(Mat,PetscScalar**),(A,vals));CHKERRQ(ierr); 349186aefd0dSHong Zhang PetscFunctionReturn(0); 349286aefd0dSHong Zhang } 34936947451fSStefano Zampini 34946947451fSStefano Zampini /*@C 34956947451fSStefano Zampini MatDenseGetColumnVec - Gives read-write access to a column of a dense matrix, represented as a Vec. 34966947451fSStefano Zampini 34976947451fSStefano Zampini Collective 34986947451fSStefano Zampini 34995ea7661aSPierre Jolivet Input Parameters: 35006947451fSStefano Zampini + mat - the Mat object 35016947451fSStefano Zampini - col - the column index 35026947451fSStefano Zampini 35036947451fSStefano Zampini Output Parameter: 35046947451fSStefano Zampini . v - the vector 35056947451fSStefano Zampini 35066947451fSStefano Zampini Notes: 35076947451fSStefano Zampini The vector is owned by PETSc. Users need to call MatDenseRestoreColumnVec() when the vector is no longer needed. 35086947451fSStefano Zampini Use MatDenseGetColumnVecRead() to obtain read-only access or MatDenseGetColumnVecWrite() for write-only access. 35096947451fSStefano Zampini 35106947451fSStefano Zampini Level: intermediate 35116947451fSStefano Zampini 35126947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVecRead(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecRead(), MatDenseRestoreColumnVecWrite() 35136947451fSStefano Zampini @*/ 35146947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVec(Mat A,PetscInt col,Vec *v) 35156947451fSStefano Zampini { 35166947451fSStefano Zampini PetscErrorCode ierr; 35176947451fSStefano Zampini 35186947451fSStefano Zampini PetscFunctionBegin; 35196947451fSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 35206947451fSStefano Zampini PetscValidType(A,1); 35216947451fSStefano Zampini PetscValidLogicalCollectiveInt(A,col,2); 35226947451fSStefano Zampini PetscValidPointer(v,3); 35236947451fSStefano Zampini if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated"); 35246947451fSStefano Zampini if (col < 0 || col > A->cmap->N) SETERRQ2(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid col %D, should be in [0,%D)",col,A->cmap->N); 35256947451fSStefano Zampini ierr = PetscUseMethod(A,"MatDenseGetColumnVec_C",(Mat,PetscInt,Vec*),(A,col,v));CHKERRQ(ierr); 35266947451fSStefano Zampini PetscFunctionReturn(0); 35276947451fSStefano Zampini } 35286947451fSStefano Zampini 35296947451fSStefano Zampini /*@C 35306947451fSStefano Zampini MatDenseRestoreColumnVec - Returns access to a column of a dense matrix obtained from MatDenseGetColumnVec(). 35316947451fSStefano Zampini 35326947451fSStefano Zampini Collective 35336947451fSStefano Zampini 35345ea7661aSPierre Jolivet Input Parameters: 35356947451fSStefano Zampini + mat - the Mat object 35366947451fSStefano Zampini . col - the column index 35376947451fSStefano Zampini - v - the Vec object 35386947451fSStefano Zampini 35396947451fSStefano Zampini Level: intermediate 35406947451fSStefano Zampini 35416947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecRead(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVecRead(), MatDenseRestoreColumnVecWrite() 35426947451fSStefano Zampini @*/ 35436947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVec(Mat A,PetscInt col,Vec *v) 35446947451fSStefano Zampini { 35456947451fSStefano Zampini PetscErrorCode ierr; 35466947451fSStefano Zampini 35476947451fSStefano Zampini PetscFunctionBegin; 35486947451fSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 35496947451fSStefano Zampini PetscValidType(A,1); 35506947451fSStefano Zampini PetscValidLogicalCollectiveInt(A,col,2); 35516947451fSStefano Zampini PetscValidPointer(v,3); 35526947451fSStefano Zampini if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated"); 35536947451fSStefano Zampini if (col < 0 || col > A->cmap->N) SETERRQ2(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid col %D, should be in [0,%D)",col,A->cmap->N); 35546947451fSStefano Zampini ierr = PetscUseMethod(A,"MatDenseRestoreColumnVec_C",(Mat,PetscInt,Vec*),(A,col,v));CHKERRQ(ierr); 35556947451fSStefano Zampini PetscFunctionReturn(0); 35566947451fSStefano Zampini } 35576947451fSStefano Zampini 35586947451fSStefano Zampini /*@C 35596947451fSStefano Zampini MatDenseGetColumnVecRead - Gives read-only access to a column of a dense matrix, represented as a Vec. 35606947451fSStefano Zampini 35616947451fSStefano Zampini Collective 35626947451fSStefano Zampini 35635ea7661aSPierre Jolivet Input Parameters: 35646947451fSStefano Zampini + mat - the Mat object 35656947451fSStefano Zampini - col - the column index 35666947451fSStefano Zampini 35676947451fSStefano Zampini Output Parameter: 35686947451fSStefano Zampini . v - the vector 35696947451fSStefano Zampini 35706947451fSStefano Zampini Notes: 35716947451fSStefano Zampini The vector is owned by PETSc and users cannot modify it. 35726947451fSStefano Zampini Users need to call MatDenseRestoreColumnVecRead() when the vector is no longer needed. 35736947451fSStefano Zampini Use MatDenseGetColumnVec() to obtain read-write access or MatDenseGetColumnVecWrite() for write-only access. 35746947451fSStefano Zampini 35756947451fSStefano Zampini Level: intermediate 35766947451fSStefano Zampini 35776947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecRead(), MatDenseRestoreColumnVecWrite() 35786947451fSStefano Zampini @*/ 35796947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVecRead(Mat A,PetscInt col,Vec *v) 35806947451fSStefano Zampini { 35816947451fSStefano Zampini PetscErrorCode ierr; 35826947451fSStefano Zampini 35836947451fSStefano Zampini PetscFunctionBegin; 35846947451fSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 35856947451fSStefano Zampini PetscValidType(A,1); 35866947451fSStefano Zampini PetscValidLogicalCollectiveInt(A,col,2); 35876947451fSStefano Zampini PetscValidPointer(v,3); 35886947451fSStefano Zampini if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated"); 35896947451fSStefano Zampini if (col < 0 || col > A->cmap->N) SETERRQ2(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid col %D, should be in [0,%D)",col,A->cmap->N); 35906947451fSStefano Zampini ierr = PetscUseMethod(A,"MatDenseGetColumnVecRead_C",(Mat,PetscInt,Vec*),(A,col,v));CHKERRQ(ierr); 35916947451fSStefano Zampini PetscFunctionReturn(0); 35926947451fSStefano Zampini } 35936947451fSStefano Zampini 35946947451fSStefano Zampini /*@C 35956947451fSStefano Zampini MatDenseRestoreColumnVecRead - Returns access to a column of a dense matrix obtained from MatDenseGetColumnVecRead(). 35966947451fSStefano Zampini 35976947451fSStefano Zampini Collective 35986947451fSStefano Zampini 35995ea7661aSPierre Jolivet Input Parameters: 36006947451fSStefano Zampini + mat - the Mat object 36016947451fSStefano Zampini . col - the column index 36026947451fSStefano Zampini - v - the Vec object 36036947451fSStefano Zampini 36046947451fSStefano Zampini Level: intermediate 36056947451fSStefano Zampini 36066947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecRead(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecWrite() 36076947451fSStefano Zampini @*/ 36086947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVecRead(Mat A,PetscInt col,Vec *v) 36096947451fSStefano Zampini { 36106947451fSStefano Zampini PetscErrorCode ierr; 36116947451fSStefano Zampini 36126947451fSStefano Zampini PetscFunctionBegin; 36136947451fSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 36146947451fSStefano Zampini PetscValidType(A,1); 36156947451fSStefano Zampini PetscValidLogicalCollectiveInt(A,col,2); 36166947451fSStefano Zampini PetscValidPointer(v,3); 36176947451fSStefano Zampini if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated"); 36186947451fSStefano Zampini if (col < 0 || col > A->cmap->N) SETERRQ2(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid col %D, should be in [0,%D)",col,A->cmap->N); 36196947451fSStefano Zampini ierr = PetscUseMethod(A,"MatDenseRestoreColumnVecRead_C",(Mat,PetscInt,Vec*),(A,col,v));CHKERRQ(ierr); 36206947451fSStefano Zampini PetscFunctionReturn(0); 36216947451fSStefano Zampini } 36226947451fSStefano Zampini 36236947451fSStefano Zampini /*@C 36246947451fSStefano Zampini MatDenseGetColumnVecWrite - Gives write-only access to a column of a dense matrix, represented as a Vec. 36256947451fSStefano Zampini 36266947451fSStefano Zampini Collective 36276947451fSStefano Zampini 36285ea7661aSPierre Jolivet Input Parameters: 36296947451fSStefano Zampini + mat - the Mat object 36306947451fSStefano Zampini - col - the column index 36316947451fSStefano Zampini 36326947451fSStefano Zampini Output Parameter: 36336947451fSStefano Zampini . v - the vector 36346947451fSStefano Zampini 36356947451fSStefano Zampini Notes: 36366947451fSStefano Zampini The vector is owned by PETSc. Users need to call MatDenseRestoreColumnVecWrite() when the vector is no longer needed. 36376947451fSStefano Zampini Use MatDenseGetColumnVec() to obtain read-write access or MatDenseGetColumnVecRead() for read-only access. 36386947451fSStefano Zampini 36396947451fSStefano Zampini Level: intermediate 36406947451fSStefano Zampini 36416947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecRead(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecRead(), MatDenseRestoreColumnVecWrite() 36426947451fSStefano Zampini @*/ 36436947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVecWrite(Mat A,PetscInt col,Vec *v) 36446947451fSStefano Zampini { 36456947451fSStefano Zampini PetscErrorCode ierr; 36466947451fSStefano Zampini 36476947451fSStefano Zampini PetscFunctionBegin; 36486947451fSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 36496947451fSStefano Zampini PetscValidType(A,1); 36506947451fSStefano Zampini PetscValidLogicalCollectiveInt(A,col,2); 36516947451fSStefano Zampini PetscValidPointer(v,3); 36526947451fSStefano Zampini if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated"); 36536947451fSStefano Zampini if (col < 0 || col > A->cmap->N) SETERRQ2(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid col %D, should be in [0,%D)",col,A->cmap->N); 36546947451fSStefano Zampini ierr = PetscUseMethod(A,"MatDenseGetColumnVecWrite_C",(Mat,PetscInt,Vec*),(A,col,v));CHKERRQ(ierr); 36556947451fSStefano Zampini PetscFunctionReturn(0); 36566947451fSStefano Zampini } 36576947451fSStefano Zampini 36586947451fSStefano Zampini /*@C 36596947451fSStefano Zampini MatDenseRestoreColumnVecWrite - Returns access to a column of a dense matrix obtained from MatDenseGetColumnVecWrite(). 36606947451fSStefano Zampini 36616947451fSStefano Zampini Collective 36626947451fSStefano Zampini 36635ea7661aSPierre Jolivet Input Parameters: 36646947451fSStefano Zampini + mat - the Mat object 36656947451fSStefano Zampini . col - the column index 36666947451fSStefano Zampini - v - the Vec object 36676947451fSStefano Zampini 36686947451fSStefano Zampini Level: intermediate 36696947451fSStefano Zampini 36706947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecRead(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecRead() 36716947451fSStefano Zampini @*/ 36726947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVecWrite(Mat A,PetscInt col,Vec *v) 36736947451fSStefano Zampini { 36746947451fSStefano Zampini PetscErrorCode ierr; 36756947451fSStefano Zampini 36766947451fSStefano Zampini PetscFunctionBegin; 36776947451fSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 36786947451fSStefano Zampini PetscValidType(A,1); 36796947451fSStefano Zampini PetscValidLogicalCollectiveInt(A,col,2); 36806947451fSStefano Zampini PetscValidPointer(v,3); 36816947451fSStefano Zampini if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated"); 36826947451fSStefano Zampini if (col < 0 || col > A->cmap->N) SETERRQ2(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid col %D, should be in [0,%D)",col,A->cmap->N); 36836947451fSStefano Zampini ierr = PetscUseMethod(A,"MatDenseRestoreColumnVecWrite_C",(Mat,PetscInt,Vec*),(A,col,v));CHKERRQ(ierr); 36846947451fSStefano Zampini PetscFunctionReturn(0); 36856947451fSStefano Zampini } 36865ea7661aSPierre Jolivet 36875ea7661aSPierre Jolivet /*@C 36885ea7661aSPierre Jolivet MatDenseGetSubMatrix - Gives access to a block of columns of a dense matrix, represented as a Mat. 36895ea7661aSPierre Jolivet 36905ea7661aSPierre Jolivet Collective 36915ea7661aSPierre Jolivet 36925ea7661aSPierre Jolivet Input Parameters: 36935ea7661aSPierre Jolivet + mat - the Mat object 36945ea7661aSPierre Jolivet . cbegin - the first index in the block 36955ea7661aSPierre Jolivet - cend - the last index in the block 36965ea7661aSPierre Jolivet 36975ea7661aSPierre Jolivet Output Parameter: 36985ea7661aSPierre Jolivet . v - the matrix 36995ea7661aSPierre Jolivet 37005ea7661aSPierre Jolivet Notes: 37015ea7661aSPierre Jolivet The matrix is owned by PETSc. Users need to call MatDenseRestoreSubMatrix() when the matrix is no longer needed. 37025ea7661aSPierre Jolivet 37035ea7661aSPierre Jolivet Level: intermediate 37045ea7661aSPierre Jolivet 37055ea7661aSPierre Jolivet .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseRestoreColumnVec(), MatDenseRestoreSubMatrix() 37065ea7661aSPierre Jolivet @*/ 37075ea7661aSPierre Jolivet PetscErrorCode MatDenseGetSubMatrix(Mat A,PetscInt cbegin,PetscInt cend,Mat *v) 37085ea7661aSPierre Jolivet { 37095ea7661aSPierre Jolivet PetscErrorCode ierr; 37105ea7661aSPierre Jolivet 37115ea7661aSPierre Jolivet PetscFunctionBegin; 37125ea7661aSPierre Jolivet PetscValidHeaderSpecific(A,MAT_CLASSID,1); 37135ea7661aSPierre Jolivet PetscValidType(A,1); 37145ea7661aSPierre Jolivet PetscValidLogicalCollectiveInt(A,cbegin,2); 37155ea7661aSPierre Jolivet PetscValidLogicalCollectiveInt(A,cend,3); 37165ea7661aSPierre Jolivet PetscValidPointer(v,4); 37175ea7661aSPierre Jolivet if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated"); 37185ea7661aSPierre Jolivet if (cbegin < 0 || cbegin > A->cmap->N) SETERRQ2(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid cbegin %D, should be in [0,%D)",cbegin,A->cmap->N); 3719616b8fbbSStefano Zampini if (cend < cbegin || cend > A->cmap->N) SETERRQ3(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid cend %D, should be in [%D,%D)",cend,cbegin,A->cmap->N); 37205ea7661aSPierre Jolivet ierr = PetscUseMethod(A,"MatDenseGetSubMatrix_C",(Mat,PetscInt,PetscInt,Mat*),(A,cbegin,cend,v));CHKERRQ(ierr); 37215ea7661aSPierre Jolivet PetscFunctionReturn(0); 37225ea7661aSPierre Jolivet } 37235ea7661aSPierre Jolivet 37245ea7661aSPierre Jolivet /*@C 37255ea7661aSPierre Jolivet MatDenseRestoreSubMatrix - Returns access to a block of columns of a dense matrix obtained from MatDenseGetSubMatrix(). 37265ea7661aSPierre Jolivet 37275ea7661aSPierre Jolivet Collective 37285ea7661aSPierre Jolivet 37295ea7661aSPierre Jolivet Input Parameters: 37305ea7661aSPierre Jolivet + mat - the Mat object 37315ea7661aSPierre Jolivet - v - the Mat object 37325ea7661aSPierre Jolivet 37335ea7661aSPierre Jolivet Level: intermediate 37345ea7661aSPierre Jolivet 37355ea7661aSPierre Jolivet .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseRestoreColumnVec(), MatDenseGetSubMatrix() 37365ea7661aSPierre Jolivet @*/ 37375ea7661aSPierre Jolivet PetscErrorCode MatDenseRestoreSubMatrix(Mat A,Mat *v) 37385ea7661aSPierre Jolivet { 37395ea7661aSPierre Jolivet PetscErrorCode ierr; 37405ea7661aSPierre Jolivet 37415ea7661aSPierre Jolivet PetscFunctionBegin; 37425ea7661aSPierre Jolivet PetscValidHeaderSpecific(A,MAT_CLASSID,1); 37435ea7661aSPierre Jolivet PetscValidType(A,1); 37445ea7661aSPierre Jolivet PetscValidPointer(v,2); 37455ea7661aSPierre Jolivet ierr = PetscUseMethod(A,"MatDenseRestoreSubMatrix_C",(Mat,Mat*),(A,v));CHKERRQ(ierr); 37465ea7661aSPierre Jolivet PetscFunctionReturn(0); 37475ea7661aSPierre Jolivet } 3748