1be1d678aSKris Buschelman 267e560aaSBarry Smith /* 367e560aaSBarry Smith Defines the basic matrix operations for sequential dense. 467e560aaSBarry Smith */ 5289bc588SBarry Smith 6dec5eb66SMatthew G Knepley #include <../src/mat/impls/dense/seq/dense.h> /*I "petscmat.h" I*/ 7c6db04a5SJed Brown #include <petscblaslapack.h> 8289bc588SBarry Smith 96a63e612SBarry Smith #include <../src/mat/impls/aij/seq/aij.h> 10b2573a8aSBarry Smith 11ca15aa20SStefano Zampini PetscErrorCode MatSeqDenseSymmetrize_Private(Mat A, PetscBool hermitian) 128c178816SStefano Zampini { 138c178816SStefano Zampini Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 148c178816SStefano Zampini PetscInt j, k, n = A->rmap->n; 15ca15aa20SStefano Zampini PetscScalar *v; 168c178816SStefano Zampini 178c178816SStefano Zampini PetscFunctionBegin; 182c71b3e2SJacob Faibussowitsch PetscCheckFalse(A->rmap->n != A->cmap->n,PetscObjectComm((PetscObject)A),PETSC_ERR_SUP,"Cannot symmetrize a rectangular matrix"); 199566063dSJacob Faibussowitsch PetscCall(MatDenseGetArray(A,&v)); 208c178816SStefano Zampini if (!hermitian) { 218c178816SStefano Zampini for (k=0;k<n;k++) { 228c178816SStefano Zampini for (j=k;j<n;j++) { 23ca15aa20SStefano Zampini v[j*mat->lda + k] = v[k*mat->lda + j]; 248c178816SStefano Zampini } 258c178816SStefano Zampini } 268c178816SStefano Zampini } else { 278c178816SStefano Zampini for (k=0;k<n;k++) { 288c178816SStefano Zampini for (j=k;j<n;j++) { 29ca15aa20SStefano Zampini v[j*mat->lda + k] = PetscConj(v[k*mat->lda + j]); 308c178816SStefano Zampini } 318c178816SStefano Zampini } 328c178816SStefano Zampini } 339566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArray(A,&v)); 348c178816SStefano Zampini PetscFunctionReturn(0); 358c178816SStefano Zampini } 368c178816SStefano Zampini 3705709791SSatish Balay PETSC_EXTERN PetscErrorCode MatSeqDenseInvertFactors_Private(Mat A) 388c178816SStefano Zampini { 398c178816SStefano Zampini Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 408c178816SStefano Zampini PetscBLASInt info,n; 418c178816SStefano Zampini 428c178816SStefano Zampini PetscFunctionBegin; 438c178816SStefano Zampini if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 449566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(A->cmap->n,&n)); 458c178816SStefano Zampini if (A->factortype == MAT_FACTOR_LU) { 4628b400f6SJacob Faibussowitsch PetscCheck(mat->pivots,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Pivots not present"); 478c178816SStefano Zampini if (!mat->fwork) { 488c178816SStefano Zampini mat->lfwork = n; 499566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(mat->lfwork,&mat->fwork)); 509566063dSJacob Faibussowitsch PetscCall(PetscLogObjectMemory((PetscObject)A,mat->lfwork*sizeof(PetscBLASInt))); 518c178816SStefano Zampini } 529566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); 538c178816SStefano Zampini PetscStackCallBLAS("LAPACKgetri",LAPACKgetri_(&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&mat->lfwork,&info)); 549566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPop()); 559566063dSJacob Faibussowitsch PetscCall(PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0)); 568c178816SStefano Zampini } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 578c178816SStefano Zampini if (A->spd) { 589566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); 598c178816SStefano Zampini PetscStackCallBLAS("LAPACKpotri",LAPACKpotri_("L",&n,mat->v,&mat->lda,&info)); 609566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPop()); 619566063dSJacob Faibussowitsch PetscCall(MatSeqDenseSymmetrize_Private(A,PETSC_TRUE)); 628c178816SStefano Zampini #if defined(PETSC_USE_COMPLEX) 638c178816SStefano Zampini } else if (A->hermitian) { 6428b400f6SJacob Faibussowitsch PetscCheck(mat->pivots,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Pivots not present"); 6528b400f6SJacob Faibussowitsch PetscCheck(mat->fwork,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Fwork not present"); 669566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); 678c178816SStefano Zampini PetscStackCallBLAS("LAPACKhetri",LAPACKhetri_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&info)); 689566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPop()); 699566063dSJacob Faibussowitsch PetscCall(MatSeqDenseSymmetrize_Private(A,PETSC_TRUE)); 708c178816SStefano Zampini #endif 718c178816SStefano Zampini } else { /* symmetric case */ 7228b400f6SJacob Faibussowitsch PetscCheck(mat->pivots,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Pivots not present"); 7328b400f6SJacob Faibussowitsch PetscCheck(mat->fwork,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Fwork not present"); 749566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); 758c178816SStefano Zampini PetscStackCallBLAS("LAPACKsytri",LAPACKsytri_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&info)); 769566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPop()); 779566063dSJacob Faibussowitsch PetscCall(MatSeqDenseSymmetrize_Private(A,PETSC_FALSE)); 788c178816SStefano Zampini } 7928b400f6SJacob Faibussowitsch PetscCheck(!info,PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad Inversion: zero pivot in row %" PetscInt_FMT,(PetscInt)info-1); 809566063dSJacob Faibussowitsch PetscCall(PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0)); 818c178816SStefano Zampini } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 828c178816SStefano Zampini 838c178816SStefano Zampini A->ops->solve = NULL; 848c178816SStefano Zampini A->ops->matsolve = NULL; 858c178816SStefano Zampini A->ops->solvetranspose = NULL; 868c178816SStefano Zampini A->ops->matsolvetranspose = NULL; 878c178816SStefano Zampini A->ops->solveadd = NULL; 888c178816SStefano Zampini A->ops->solvetransposeadd = NULL; 898c178816SStefano Zampini A->factortype = MAT_FACTOR_NONE; 909566063dSJacob Faibussowitsch PetscCall(PetscFree(A->solvertype)); 918c178816SStefano Zampini PetscFunctionReturn(0); 928c178816SStefano Zampini } 938c178816SStefano Zampini 943f49a652SStefano Zampini PetscErrorCode MatZeroRowsColumns_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b) 953f49a652SStefano Zampini { 963f49a652SStefano Zampini Mat_SeqDense *l = (Mat_SeqDense*)A->data; 973f49a652SStefano Zampini PetscInt m = l->lda, n = A->cmap->n,r = A->rmap->n, i,j; 98ca15aa20SStefano Zampini PetscScalar *slot,*bb,*v; 993f49a652SStefano Zampini const PetscScalar *xx; 1003f49a652SStefano Zampini 1013f49a652SStefano Zampini PetscFunctionBegin; 10276bd3646SJed Brown if (PetscDefined(USE_DEBUG)) { 1033f49a652SStefano Zampini for (i=0; i<N; i++) { 1042c71b3e2SJacob Faibussowitsch PetscCheckFalse(rows[i] < 0,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed"); 1052c71b3e2SJacob Faibussowitsch PetscCheckFalse(rows[i] >= A->rmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row %" PetscInt_FMT " requested to be zeroed greater than or equal number of rows %" PetscInt_FMT,rows[i],A->rmap->n); 1062c71b3e2SJacob Faibussowitsch PetscCheckFalse(rows[i] >= A->cmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Col %" PetscInt_FMT " requested to be zeroed greater than or equal number of cols %" PetscInt_FMT,rows[i],A->cmap->n); 1073f49a652SStefano Zampini } 10876bd3646SJed Brown } 109ca15aa20SStefano Zampini if (!N) PetscFunctionReturn(0); 1103f49a652SStefano Zampini 1113f49a652SStefano Zampini /* fix right hand side if needed */ 1123f49a652SStefano Zampini if (x && b) { 1136c4d906cSStefano Zampini Vec xt; 1146c4d906cSStefano Zampini 1152c71b3e2SJacob Faibussowitsch PetscCheckFalse(A->rmap->n != A->cmap->n,PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 1169566063dSJacob Faibussowitsch PetscCall(VecDuplicate(x,&xt)); 1179566063dSJacob Faibussowitsch PetscCall(VecCopy(x,xt)); 1189566063dSJacob Faibussowitsch PetscCall(VecScale(xt,-1.0)); 1199566063dSJacob Faibussowitsch PetscCall(MatMultAdd(A,xt,b,b)); 1209566063dSJacob Faibussowitsch PetscCall(VecDestroy(&xt)); 1219566063dSJacob Faibussowitsch PetscCall(VecGetArrayRead(x,&xx)); 1229566063dSJacob Faibussowitsch PetscCall(VecGetArray(b,&bb)); 1233f49a652SStefano Zampini for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]]; 1249566063dSJacob Faibussowitsch PetscCall(VecRestoreArrayRead(x,&xx)); 1259566063dSJacob Faibussowitsch PetscCall(VecRestoreArray(b,&bb)); 1263f49a652SStefano Zampini } 1273f49a652SStefano Zampini 1289566063dSJacob Faibussowitsch PetscCall(MatDenseGetArray(A,&v)); 1293f49a652SStefano Zampini for (i=0; i<N; i++) { 130ca15aa20SStefano Zampini slot = v + rows[i]*m; 1319566063dSJacob Faibussowitsch PetscCall(PetscArrayzero(slot,r)); 1323f49a652SStefano Zampini } 1333f49a652SStefano Zampini for (i=0; i<N; i++) { 134ca15aa20SStefano Zampini slot = v + rows[i]; 1353f49a652SStefano Zampini for (j=0; j<n; j++) { *slot = 0.0; slot += m;} 1363f49a652SStefano Zampini } 1373f49a652SStefano Zampini if (diag != 0.0) { 1382c71b3e2SJacob Faibussowitsch PetscCheckFalse(A->rmap->n != A->cmap->n,PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 1393f49a652SStefano Zampini for (i=0; i<N; i++) { 140ca15aa20SStefano Zampini slot = v + (m+1)*rows[i]; 1413f49a652SStefano Zampini *slot = diag; 1423f49a652SStefano Zampini } 1433f49a652SStefano Zampini } 1449566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArray(A,&v)); 1453f49a652SStefano Zampini PetscFunctionReturn(0); 1463f49a652SStefano Zampini } 1473f49a652SStefano Zampini 148abc3b08eSStefano Zampini PetscErrorCode MatPtAPNumeric_SeqDense_SeqDense(Mat A,Mat P,Mat C) 149abc3b08eSStefano Zampini { 150abc3b08eSStefano Zampini Mat_SeqDense *c = (Mat_SeqDense*)(C->data); 151abc3b08eSStefano Zampini 152abc3b08eSStefano Zampini PetscFunctionBegin; 153ca15aa20SStefano Zampini if (c->ptapwork) { 1549566063dSJacob Faibussowitsch PetscCall((*C->ops->matmultnumeric)(A,P,c->ptapwork)); 1559566063dSJacob Faibussowitsch PetscCall((*C->ops->transposematmultnumeric)(P,c->ptapwork,C)); 1564222ddf1SHong Zhang } else SETERRQ(PetscObjectComm((PetscObject)C),PETSC_ERR_SUP,"Must call MatPtAPSymbolic_SeqDense_SeqDense() first"); 157abc3b08eSStefano Zampini PetscFunctionReturn(0); 158abc3b08eSStefano Zampini } 159abc3b08eSStefano Zampini 1604222ddf1SHong Zhang PetscErrorCode MatPtAPSymbolic_SeqDense_SeqDense(Mat A,Mat P,PetscReal fill,Mat C) 161abc3b08eSStefano Zampini { 162abc3b08eSStefano Zampini Mat_SeqDense *c; 1637a3c3d58SStefano Zampini PetscBool cisdense; 164abc3b08eSStefano Zampini 165abc3b08eSStefano Zampini PetscFunctionBegin; 1669566063dSJacob Faibussowitsch PetscCall(MatSetSizes(C,P->cmap->n,P->cmap->n,P->cmap->N,P->cmap->N)); 1679566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompareAny((PetscObject)C,&cisdense,MATSEQDENSE,MATSEQDENSECUDA,"")); 1687a3c3d58SStefano Zampini if (!cisdense) { 1697a3c3d58SStefano Zampini PetscBool flg; 1707a3c3d58SStefano Zampini 1719566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)P,((PetscObject)A)->type_name,&flg)); 1729566063dSJacob Faibussowitsch PetscCall(MatSetType(C,flg ? ((PetscObject)A)->type_name : MATDENSE)); 1737a3c3d58SStefano Zampini } 1749566063dSJacob Faibussowitsch PetscCall(MatSetUp(C)); 1754222ddf1SHong Zhang c = (Mat_SeqDense*)C->data; 1769566063dSJacob Faibussowitsch PetscCall(MatCreate(PetscObjectComm((PetscObject)A),&c->ptapwork)); 1779566063dSJacob Faibussowitsch PetscCall(MatSetSizes(c->ptapwork,A->rmap->n,P->cmap->n,A->rmap->N,P->cmap->N)); 1789566063dSJacob Faibussowitsch PetscCall(MatSetType(c->ptapwork,((PetscObject)C)->type_name)); 1799566063dSJacob Faibussowitsch PetscCall(MatSetUp(c->ptapwork)); 180abc3b08eSStefano Zampini PetscFunctionReturn(0); 181abc3b08eSStefano Zampini } 182abc3b08eSStefano Zampini 183cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqAIJ_SeqDense(Mat A,MatType newtype,MatReuse reuse,Mat *newmat) 184b49cda9fSStefano Zampini { 185a13144ffSStefano Zampini Mat B = NULL; 186b49cda9fSStefano Zampini Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 187b49cda9fSStefano Zampini Mat_SeqDense *b; 188b49cda9fSStefano Zampini PetscInt *ai=a->i,*aj=a->j,m=A->rmap->N,n=A->cmap->N,i; 1892e5835c6SStefano Zampini const MatScalar *av; 190a13144ffSStefano Zampini PetscBool isseqdense; 191b49cda9fSStefano Zampini 192b49cda9fSStefano Zampini PetscFunctionBegin; 193a13144ffSStefano Zampini if (reuse == MAT_REUSE_MATRIX) { 1949566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)*newmat,MATSEQDENSE,&isseqdense)); 19528b400f6SJacob Faibussowitsch PetscCheck(isseqdense,PetscObjectComm((PetscObject)*newmat),PETSC_ERR_USER,"Cannot reuse matrix of type %s",((PetscObject)(*newmat))->type_name); 196a13144ffSStefano Zampini } 197a13144ffSStefano Zampini if (reuse != MAT_REUSE_MATRIX) { 1989566063dSJacob Faibussowitsch PetscCall(MatCreate(PetscObjectComm((PetscObject)A),&B)); 1999566063dSJacob Faibussowitsch PetscCall(MatSetSizes(B,m,n,m,n)); 2009566063dSJacob Faibussowitsch PetscCall(MatSetType(B,MATSEQDENSE)); 2019566063dSJacob Faibussowitsch PetscCall(MatSeqDenseSetPreallocation(B,NULL)); 202b49cda9fSStefano Zampini b = (Mat_SeqDense*)(B->data); 203a13144ffSStefano Zampini } else { 204a13144ffSStefano Zampini b = (Mat_SeqDense*)((*newmat)->data); 2059566063dSJacob Faibussowitsch PetscCall(PetscArrayzero(b->v,m*n)); 206a13144ffSStefano Zampini } 2079566063dSJacob Faibussowitsch PetscCall(MatSeqAIJGetArrayRead(A,&av)); 208b49cda9fSStefano Zampini for (i=0; i<m; i++) { 209b49cda9fSStefano Zampini PetscInt j; 210b49cda9fSStefano Zampini for (j=0;j<ai[1]-ai[0];j++) { 211b49cda9fSStefano Zampini b->v[*aj*m+i] = *av; 212b49cda9fSStefano Zampini aj++; 213b49cda9fSStefano Zampini av++; 214b49cda9fSStefano Zampini } 215b49cda9fSStefano Zampini ai++; 216b49cda9fSStefano Zampini } 2179566063dSJacob Faibussowitsch PetscCall(MatSeqAIJRestoreArrayRead(A,&av)); 218b49cda9fSStefano Zampini 219511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 2209566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY)); 2219566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY)); 2229566063dSJacob Faibussowitsch PetscCall(MatHeaderReplace(A,&B)); 223b49cda9fSStefano Zampini } else { 224a13144ffSStefano Zampini if (B) *newmat = B; 2259566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(*newmat,MAT_FINAL_ASSEMBLY)); 2269566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(*newmat,MAT_FINAL_ASSEMBLY)); 227b49cda9fSStefano Zampini } 228b49cda9fSStefano Zampini PetscFunctionReturn(0); 229b49cda9fSStefano Zampini } 230b49cda9fSStefano Zampini 231cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqDense_SeqAIJ(Mat A, MatType newtype,MatReuse reuse,Mat *newmat) 2326a63e612SBarry Smith { 2336d4ec7b0SPierre Jolivet Mat B = NULL; 2346a63e612SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2359399e1b8SMatthew G. Knepley PetscInt i, j; 2369399e1b8SMatthew G. Knepley PetscInt *rows, *nnz; 2379399e1b8SMatthew G. Knepley MatScalar *aa = a->v, *vals; 2386a63e612SBarry Smith 2396a63e612SBarry Smith PetscFunctionBegin; 2409566063dSJacob Faibussowitsch PetscCall(PetscCalloc3(A->rmap->n,&rows,A->rmap->n,&nnz,A->rmap->n,&vals)); 2416d4ec7b0SPierre Jolivet if (reuse != MAT_REUSE_MATRIX) { 2429566063dSJacob Faibussowitsch PetscCall(MatCreate(PetscObjectComm((PetscObject)A),&B)); 2439566063dSJacob Faibussowitsch PetscCall(MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N)); 2449566063dSJacob Faibussowitsch PetscCall(MatSetType(B,MATSEQAIJ)); 2459399e1b8SMatthew G. Knepley for (j=0; j<A->cmap->n; j++) { 2466d4ec7b0SPierre Jolivet for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || (i == j && A->cmap->n == A->rmap->n)) ++nnz[i]; 2476a63e612SBarry Smith aa += a->lda; 2486a63e612SBarry Smith } 2499566063dSJacob Faibussowitsch PetscCall(MatSeqAIJSetPreallocation(B,PETSC_DETERMINE,nnz)); 2506d4ec7b0SPierre Jolivet } else B = *newmat; 2519399e1b8SMatthew G. Knepley aa = a->v; 2529399e1b8SMatthew G. Knepley for (j=0; j<A->cmap->n; j++) { 2539399e1b8SMatthew G. Knepley PetscInt numRows = 0; 2546d4ec7b0SPierre Jolivet for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || (i == j && A->cmap->n == A->rmap->n)) {rows[numRows] = i; vals[numRows++] = aa[i];} 2559566063dSJacob Faibussowitsch PetscCall(MatSetValues(B,numRows,rows,1,&j,vals,INSERT_VALUES)); 2569399e1b8SMatthew G. Knepley aa += a->lda; 2579399e1b8SMatthew G. Knepley } 2589566063dSJacob Faibussowitsch PetscCall(PetscFree3(rows,nnz,vals)); 2599566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY)); 2609566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY)); 2616a63e612SBarry Smith 262511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 2639566063dSJacob Faibussowitsch PetscCall(MatHeaderReplace(A,&B)); 2646d4ec7b0SPierre Jolivet } else if (reuse != MAT_REUSE_MATRIX) *newmat = B; 2656a63e612SBarry Smith PetscFunctionReturn(0); 2666a63e612SBarry Smith } 2676a63e612SBarry Smith 268ca15aa20SStefano Zampini PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str) 2691987afe7SBarry Smith { 2701987afe7SBarry Smith Mat_SeqDense *x = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data; 271ca15aa20SStefano Zampini const PetscScalar *xv; 272ca15aa20SStefano Zampini PetscScalar *yv; 27323fff9afSBarry Smith PetscBLASInt N,m,ldax = 0,lday = 0,one = 1; 2743a40ed3dSBarry Smith 2753a40ed3dSBarry Smith PetscFunctionBegin; 2769566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(X,&xv)); 2779566063dSJacob Faibussowitsch PetscCall(MatDenseGetArray(Y,&yv)); 2789566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(X->rmap->n*X->cmap->n,&N)); 2799566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(X->rmap->n,&m)); 2809566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(x->lda,&ldax)); 2819566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(y->lda,&lday)); 282a5ce6ee0Svictorle if (ldax>m || lday>m) { 283ca15aa20SStefano Zampini PetscInt j; 284ca15aa20SStefano Zampini 285d0f46423SBarry Smith for (j=0; j<X->cmap->n; j++) { 286ca15aa20SStefano Zampini PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&m,&alpha,xv+j*ldax,&one,yv+j*lday,&one)); 287a5ce6ee0Svictorle } 288a5ce6ee0Svictorle } else { 289ca15aa20SStefano Zampini PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&N,&alpha,xv,&one,yv,&one)); 290a5ce6ee0Svictorle } 2919566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(X,&xv)); 2929566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArray(Y,&yv)); 2939566063dSJacob Faibussowitsch PetscCall(PetscLogFlops(PetscMax(2.0*N-1,0))); 2943a40ed3dSBarry Smith PetscFunctionReturn(0); 2951987afe7SBarry Smith } 2961987afe7SBarry Smith 297e0877f53SBarry Smith static PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info) 298289bc588SBarry Smith { 299ca15aa20SStefano Zampini PetscLogDouble N = A->rmap->n*A->cmap->n; 3003a40ed3dSBarry Smith 3013a40ed3dSBarry Smith PetscFunctionBegin; 3024e220ebcSLois Curfman McInnes info->block_size = 1.0; 303ca15aa20SStefano Zampini info->nz_allocated = N; 304ca15aa20SStefano Zampini info->nz_used = N; 305ca15aa20SStefano Zampini info->nz_unneeded = 0; 306ca15aa20SStefano Zampini info->assemblies = A->num_ass; 3074e220ebcSLois Curfman McInnes info->mallocs = 0; 3087adad957SLisandro Dalcin info->memory = ((PetscObject)A)->mem; 3094e220ebcSLois Curfman McInnes info->fill_ratio_given = 0; 3104e220ebcSLois Curfman McInnes info->fill_ratio_needed = 0; 3114e220ebcSLois Curfman McInnes info->factor_mallocs = 0; 3123a40ed3dSBarry Smith PetscFunctionReturn(0); 313289bc588SBarry Smith } 314289bc588SBarry Smith 315637a0070SStefano Zampini PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha) 31680cd9d93SLois Curfman McInnes { 317273d9f13SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 318ca15aa20SStefano Zampini PetscScalar *v; 31923fff9afSBarry Smith PetscBLASInt one = 1,j,nz,lda = 0; 32080cd9d93SLois Curfman McInnes 3213a40ed3dSBarry Smith PetscFunctionBegin; 3229566063dSJacob Faibussowitsch PetscCall(MatDenseGetArray(A,&v)); 3239566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(a->lda,&lda)); 324d0f46423SBarry Smith if (lda>A->rmap->n) { 3259566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(A->rmap->n,&nz)); 326d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 327ca15aa20SStefano Zampini PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&alpha,v+j*lda,&one)); 328a5ce6ee0Svictorle } 329a5ce6ee0Svictorle } else { 3309566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(A->rmap->n*A->cmap->n,&nz)); 331ca15aa20SStefano Zampini PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&alpha,v,&one)); 332a5ce6ee0Svictorle } 3339566063dSJacob Faibussowitsch PetscCall(PetscLogFlops(nz)); 3349566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArray(A,&v)); 3353a40ed3dSBarry Smith PetscFunctionReturn(0); 33680cd9d93SLois Curfman McInnes } 33780cd9d93SLois Curfman McInnes 338e0877f53SBarry Smith static PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscBool *fl) 3391cbb95d3SBarry Smith { 3401cbb95d3SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 341ca15aa20SStefano Zampini PetscInt i,j,m = A->rmap->n,N = a->lda; 342ca15aa20SStefano Zampini const PetscScalar *v; 3431cbb95d3SBarry Smith 3441cbb95d3SBarry Smith PetscFunctionBegin; 3451cbb95d3SBarry Smith *fl = PETSC_FALSE; 346d0f46423SBarry Smith if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0); 3479566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(A,&v)); 3481cbb95d3SBarry Smith for (i=0; i<m; i++) { 349ca15aa20SStefano Zampini for (j=i; j<m; j++) { 350637a0070SStefano Zampini if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) { 351637a0070SStefano Zampini goto restore; 3521cbb95d3SBarry Smith } 3531cbb95d3SBarry Smith } 354637a0070SStefano Zampini } 3551cbb95d3SBarry Smith *fl = PETSC_TRUE; 356637a0070SStefano Zampini restore: 3579566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(A,&v)); 358637a0070SStefano Zampini PetscFunctionReturn(0); 359637a0070SStefano Zampini } 360637a0070SStefano Zampini 361637a0070SStefano Zampini static PetscErrorCode MatIsSymmetric_SeqDense(Mat A,PetscReal rtol,PetscBool *fl) 362637a0070SStefano Zampini { 363637a0070SStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 364637a0070SStefano Zampini PetscInt i,j,m = A->rmap->n,N = a->lda; 365637a0070SStefano Zampini const PetscScalar *v; 366637a0070SStefano Zampini 367637a0070SStefano Zampini PetscFunctionBegin; 368637a0070SStefano Zampini *fl = PETSC_FALSE; 369637a0070SStefano Zampini if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0); 3709566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(A,&v)); 371637a0070SStefano Zampini for (i=0; i<m; i++) { 372637a0070SStefano Zampini for (j=i; j<m; j++) { 373637a0070SStefano Zampini if (PetscAbsScalar(v[i+j*N] - v[j+i*N]) > rtol) { 374637a0070SStefano Zampini goto restore; 375637a0070SStefano Zampini } 376637a0070SStefano Zampini } 377637a0070SStefano Zampini } 378637a0070SStefano Zampini *fl = PETSC_TRUE; 379637a0070SStefano Zampini restore: 3809566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(A,&v)); 3811cbb95d3SBarry Smith PetscFunctionReturn(0); 3821cbb95d3SBarry Smith } 3831cbb95d3SBarry Smith 384ca15aa20SStefano Zampini PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat newi,Mat A,MatDuplicateOption cpvalues) 385b24902e0SBarry Smith { 386ca15aa20SStefano Zampini Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 38723fc5dcaSStefano Zampini PetscInt lda = (PetscInt)mat->lda,j,m,nlda = lda; 38875f6d85dSStefano Zampini PetscBool isdensecpu; 389b24902e0SBarry Smith 390b24902e0SBarry Smith PetscFunctionBegin; 3919566063dSJacob Faibussowitsch PetscCall(PetscLayoutReference(A->rmap,&newi->rmap)); 3929566063dSJacob Faibussowitsch PetscCall(PetscLayoutReference(A->cmap,&newi->cmap)); 39323fc5dcaSStefano Zampini if (cpvalues == MAT_SHARE_NONZERO_PATTERN) { /* propagate LDA */ 3949566063dSJacob Faibussowitsch PetscCall(MatDenseSetLDA(newi,lda)); 39523fc5dcaSStefano Zampini } 3969566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)newi,MATSEQDENSE,&isdensecpu)); 3979566063dSJacob Faibussowitsch if (isdensecpu) PetscCall(MatSeqDenseSetPreallocation(newi,NULL)); 398b24902e0SBarry Smith if (cpvalues == MAT_COPY_VALUES) { 399ca15aa20SStefano Zampini const PetscScalar *av; 400ca15aa20SStefano Zampini PetscScalar *v; 401ca15aa20SStefano Zampini 4029566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(A,&av)); 4039566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayWrite(newi,&v)); 4049566063dSJacob Faibussowitsch PetscCall(MatDenseGetLDA(newi,&nlda)); 405d0f46423SBarry Smith m = A->rmap->n; 40623fc5dcaSStefano Zampini if (lda>m || nlda>m) { 407d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 4089566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(v+j*nlda,av+j*lda,m)); 409b24902e0SBarry Smith } 410b24902e0SBarry Smith } else { 4119566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(v,av,A->rmap->n*A->cmap->n)); 412b24902e0SBarry Smith } 4139566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayWrite(newi,&v)); 4149566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(A,&av)); 415b24902e0SBarry Smith } 416b24902e0SBarry Smith PetscFunctionReturn(0); 417b24902e0SBarry Smith } 418b24902e0SBarry Smith 419ca15aa20SStefano Zampini PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat) 42002cad45dSBarry Smith { 4213a40ed3dSBarry Smith PetscFunctionBegin; 4229566063dSJacob Faibussowitsch PetscCall(MatCreate(PetscObjectComm((PetscObject)A),newmat)); 4239566063dSJacob Faibussowitsch PetscCall(MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n)); 4249566063dSJacob Faibussowitsch PetscCall(MatSetType(*newmat,((PetscObject)A)->type_name)); 4259566063dSJacob Faibussowitsch PetscCall(MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues)); 426b24902e0SBarry Smith PetscFunctionReturn(0); 427b24902e0SBarry Smith } 428b24902e0SBarry Smith 429bf5a80bcSToby Isaac static PetscErrorCode MatSolve_SeqDense_Internal_LU(Mat A, PetscScalar *x, PetscBLASInt ldx, PetscBLASInt m, PetscBLASInt nrhs, PetscBLASInt k, PetscBool T) 430289bc588SBarry Smith { 431c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 4324396437dSToby Isaac PetscBLASInt info; 43367e560aaSBarry Smith 4343a40ed3dSBarry Smith PetscFunctionBegin; 4359566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); 4364396437dSToby Isaac PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_(T ? "T" : "N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info)); 4379566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPop()); 43828b400f6SJacob Faibussowitsch PetscCheck(!info,PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 4399566063dSJacob Faibussowitsch PetscCall(PetscLogFlops(nrhs*(2.0*m*m - m))); 4404396437dSToby Isaac PetscFunctionReturn(0); 4414396437dSToby Isaac } 4424396437dSToby Isaac 4434396437dSToby Isaac static PetscErrorCode MatConjugate_SeqDense(Mat); 4444396437dSToby Isaac 445bf5a80bcSToby Isaac static PetscErrorCode MatSolve_SeqDense_Internal_Cholesky(Mat A, PetscScalar *x, PetscBLASInt ldx, PetscBLASInt m, PetscBLASInt nrhs, PetscBLASInt k, PetscBool T) 4464396437dSToby Isaac { 4474396437dSToby Isaac Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 4484396437dSToby Isaac PetscBLASInt info; 4494396437dSToby Isaac 4504396437dSToby Isaac PetscFunctionBegin; 451a49dc2a2SStefano Zampini if (A->spd) { 4529566063dSJacob Faibussowitsch if (PetscDefined(USE_COMPLEX) && T) PetscCall(MatConjugate_SeqDense(A)); 4539566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); 4548b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info)); 4559566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPop()); 45628b400f6SJacob Faibussowitsch PetscCheck(!info,PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 4579566063dSJacob Faibussowitsch if (PetscDefined(USE_COMPLEX) && T) PetscCall(MatConjugate_SeqDense(A)); 458a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX) 459a49dc2a2SStefano Zampini } else if (A->hermitian) { 4609566063dSJacob Faibussowitsch if (T) PetscCall(MatConjugate_SeqDense(A)); 4619566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); 462a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKhetrs",LAPACKhetrs_("L",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info)); 4639566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPop()); 46428b400f6SJacob Faibussowitsch PetscCheck(!info,PETSC_COMM_SELF,PETSC_ERR_LIB,"HETRS Bad solve"); 4659566063dSJacob Faibussowitsch if (T) PetscCall(MatConjugate_SeqDense(A)); 466a49dc2a2SStefano Zampini #endif 467a49dc2a2SStefano Zampini } else { /* symmetric case */ 4689566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); 469a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrs",LAPACKsytrs_("L",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info)); 4709566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPop()); 47128b400f6SJacob Faibussowitsch PetscCheck(!info,PETSC_COMM_SELF,PETSC_ERR_LIB,"SYTRS Bad solve"); 472a49dc2a2SStefano Zampini } 4739566063dSJacob Faibussowitsch PetscCall(PetscLogFlops(nrhs*(2.0*m*m - m))); 4744396437dSToby Isaac PetscFunctionReturn(0); 4754396437dSToby Isaac } 47685e2c93fSHong Zhang 477bf5a80bcSToby Isaac static PetscErrorCode MatSolve_SeqDense_Internal_QR(Mat A, PetscScalar *x, PetscBLASInt ldx, PetscBLASInt m, PetscBLASInt nrhs, PetscBLASInt k) 4784396437dSToby Isaac { 4794396437dSToby Isaac Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 4804396437dSToby Isaac PetscBLASInt info; 4814396437dSToby Isaac char trans; 4824396437dSToby Isaac 4834396437dSToby Isaac PetscFunctionBegin; 4844905a7bcSToby Isaac if (PetscDefined(USE_COMPLEX)) { 4854905a7bcSToby Isaac trans = 'C'; 4864905a7bcSToby Isaac } else { 4874905a7bcSToby Isaac trans = 'T'; 4884905a7bcSToby Isaac } 4899566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); 490bf5a80bcSToby Isaac PetscStackCallBLAS("LAPACKormqr",LAPACKormqr_("L", &trans, &m,&nrhs,&mat->rank,mat->v,&mat->lda,mat->tau,x,&ldx,mat->fwork,&mat->lfwork,&info)); 4919566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPop()); 49228b400f6SJacob Faibussowitsch PetscCheck(!info,PETSC_COMM_SELF,PETSC_ERR_LIB,"ORMQR - Bad orthogonal transform"); 4939566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); 494bf5a80bcSToby Isaac PetscStackCallBLAS("LAPACKtrtrs",LAPACKtrtrs_("U", "N", "N", &mat->rank,&nrhs,mat->v,&mat->lda,x,&ldx,&info)); 4959566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPop()); 49628b400f6SJacob Faibussowitsch PetscCheck(!info,PETSC_COMM_SELF,PETSC_ERR_LIB,"TRTRS - Bad triangular solve"); 4974905a7bcSToby Isaac for (PetscInt j = 0; j < nrhs; j++) { 4984905a7bcSToby Isaac for (PetscInt i = mat->rank; i < k; i++) { 499bf5a80bcSToby Isaac x[j*ldx + i] = 0.; 5004905a7bcSToby Isaac } 5014905a7bcSToby Isaac } 5029566063dSJacob Faibussowitsch PetscCall(PetscLogFlops(nrhs*(4.0*m*mat->rank - PetscSqr(mat->rank)))); 5034905a7bcSToby Isaac PetscFunctionReturn(0); 5044905a7bcSToby Isaac } 5054905a7bcSToby Isaac 506bf5a80bcSToby Isaac static PetscErrorCode MatSolveTranspose_SeqDense_Internal_QR(Mat A, PetscScalar *x, PetscBLASInt ldx, PetscBLASInt m, PetscBLASInt nrhs, PetscBLASInt k) 5074905a7bcSToby Isaac { 5084396437dSToby Isaac Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 5094396437dSToby Isaac PetscBLASInt info; 5104396437dSToby Isaac 5114396437dSToby Isaac PetscFunctionBegin; 5124396437dSToby Isaac if (A->rmap->n == A->cmap->n && mat->rank == A->rmap->n) { 5139566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); 514bf5a80bcSToby Isaac PetscStackCallBLAS("LAPACKtrtrs",LAPACKtrtrs_("U", "T", "N", &m,&nrhs,mat->v,&mat->lda,x,&ldx,&info)); 5159566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPop()); 51628b400f6SJacob Faibussowitsch PetscCheck(!info,PETSC_COMM_SELF,PETSC_ERR_LIB,"TRTRS - Bad triangular solve"); 5179566063dSJacob Faibussowitsch if (PetscDefined(USE_COMPLEX)) PetscCall(MatConjugate_SeqDense(A)); 5189566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); 519bf5a80bcSToby Isaac PetscStackCallBLAS("LAPACKormqr",LAPACKormqr_("L", "N", &m,&nrhs,&mat->rank,mat->v,&mat->lda,mat->tau,x,&ldx,mat->fwork,&mat->lfwork,&info)); 5209566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPop()); 52128b400f6SJacob Faibussowitsch PetscCheck(!info,PETSC_COMM_SELF,PETSC_ERR_LIB,"ORMQR - Bad orthogonal transform"); 5229566063dSJacob Faibussowitsch if (PetscDefined(USE_COMPLEX)) PetscCall(MatConjugate_SeqDense(A)); 5234396437dSToby Isaac } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"QR factored matrix cannot be used for transpose solve"); 5249566063dSJacob Faibussowitsch PetscCall(PetscLogFlops(nrhs*(4.0*m*mat->rank - PetscSqr(mat->rank)))); 5254396437dSToby Isaac PetscFunctionReturn(0); 5264396437dSToby Isaac } 5274396437dSToby Isaac 5284396437dSToby Isaac static PetscErrorCode MatSolve_SeqDense_SetUp(Mat A, Vec xx, Vec yy, PetscScalar **_y, PetscBLASInt *_m, PetscBLASInt *_k) 5294396437dSToby Isaac { 5304396437dSToby Isaac Mat_SeqDense *mat = (Mat_SeqDense *) A->data; 5314905a7bcSToby Isaac PetscScalar *y; 5324905a7bcSToby Isaac PetscBLASInt m=0, k=0; 5334905a7bcSToby Isaac 5344905a7bcSToby Isaac PetscFunctionBegin; 5359566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(A->rmap->n,&m)); 5369566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(A->cmap->n,&k)); 5374905a7bcSToby Isaac if (k < m) { 5389566063dSJacob Faibussowitsch PetscCall(VecCopy(xx, mat->qrrhs)); 5399566063dSJacob Faibussowitsch PetscCall(VecGetArray(mat->qrrhs,&y)); 5404905a7bcSToby Isaac } else { 5419566063dSJacob Faibussowitsch PetscCall(VecCopy(xx, yy)); 5429566063dSJacob Faibussowitsch PetscCall(VecGetArray(yy,&y)); 5434905a7bcSToby Isaac } 5444396437dSToby Isaac *_y = y; 5454396437dSToby Isaac *_k = k; 5464396437dSToby Isaac *_m = m; 5474396437dSToby Isaac PetscFunctionReturn(0); 5484396437dSToby Isaac } 5494396437dSToby Isaac 5504396437dSToby Isaac static PetscErrorCode MatSolve_SeqDense_TearDown(Mat A, Vec xx, Vec yy, PetscScalar **_y, PetscBLASInt *_m, PetscBLASInt *_k) 5514396437dSToby Isaac { 5524396437dSToby Isaac Mat_SeqDense *mat = (Mat_SeqDense *) A->data; 55342e9364cSSatish Balay PetscScalar *y = NULL; 5544396437dSToby Isaac PetscBLASInt m, k; 5554396437dSToby Isaac 5564396437dSToby Isaac PetscFunctionBegin; 5574396437dSToby Isaac y = *_y; 5584396437dSToby Isaac *_y = NULL; 5594396437dSToby Isaac k = *_k; 5604396437dSToby Isaac m = *_m; 5614905a7bcSToby Isaac if (k < m) { 5624905a7bcSToby Isaac PetscScalar *yv; 5639566063dSJacob Faibussowitsch PetscCall(VecGetArray(yy,&yv)); 5649566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(yv, y, k)); 5659566063dSJacob Faibussowitsch PetscCall(VecRestoreArray(yy,&yv)); 5669566063dSJacob Faibussowitsch PetscCall(VecRestoreArray(mat->qrrhs, &y)); 5674905a7bcSToby Isaac } else { 5689566063dSJacob Faibussowitsch PetscCall(VecRestoreArray(yy,&y)); 5694905a7bcSToby Isaac } 5704905a7bcSToby Isaac PetscFunctionReturn(0); 5714905a7bcSToby Isaac } 5724905a7bcSToby Isaac 5734396437dSToby Isaac static PetscErrorCode MatSolve_SeqDense_LU(Mat A, Vec xx, Vec yy) 5744396437dSToby Isaac { 57542e9364cSSatish Balay PetscScalar *y = NULL; 57642e9364cSSatish Balay PetscBLASInt m = 0, k = 0; 5774396437dSToby Isaac 5784396437dSToby Isaac PetscFunctionBegin; 5799566063dSJacob Faibussowitsch PetscCall(MatSolve_SeqDense_SetUp(A, xx, yy, &y, &m, &k)); 5809566063dSJacob Faibussowitsch PetscCall(MatSolve_SeqDense_Internal_LU(A, y, m, m, 1, k, PETSC_FALSE)); 5819566063dSJacob Faibussowitsch PetscCall(MatSolve_SeqDense_TearDown(A, xx, yy, &y, &m, &k)); 5824396437dSToby Isaac PetscFunctionReturn(0); 5834396437dSToby Isaac } 5844396437dSToby Isaac 5854396437dSToby Isaac static PetscErrorCode MatSolveTranspose_SeqDense_LU(Mat A, Vec xx, Vec yy) 5864396437dSToby Isaac { 58742e9364cSSatish Balay PetscScalar *y = NULL; 58842e9364cSSatish Balay PetscBLASInt m = 0, k = 0; 5894396437dSToby Isaac 5904396437dSToby Isaac PetscFunctionBegin; 5919566063dSJacob Faibussowitsch PetscCall(MatSolve_SeqDense_SetUp(A, xx, yy, &y, &m, &k)); 5929566063dSJacob Faibussowitsch PetscCall(MatSolve_SeqDense_Internal_LU(A, y, m, m, 1, k, PETSC_TRUE)); 5939566063dSJacob Faibussowitsch PetscCall(MatSolve_SeqDense_TearDown(A, xx, yy, &y, &m, &k)); 5944396437dSToby Isaac PetscFunctionReturn(0); 5954396437dSToby Isaac } 5964396437dSToby Isaac 5974396437dSToby Isaac static PetscErrorCode MatSolve_SeqDense_Cholesky(Mat A, Vec xx, Vec yy) 5984396437dSToby Isaac { 599e54beecaSStefano Zampini PetscScalar *y = NULL; 600e54beecaSStefano Zampini PetscBLASInt m = 0, k = 0; 6014396437dSToby Isaac 6024396437dSToby Isaac PetscFunctionBegin; 6039566063dSJacob Faibussowitsch PetscCall(MatSolve_SeqDense_SetUp(A, xx, yy, &y, &m, &k)); 6049566063dSJacob Faibussowitsch PetscCall(MatSolve_SeqDense_Internal_Cholesky(A, y, m, m, 1, k, PETSC_FALSE)); 6059566063dSJacob Faibussowitsch PetscCall(MatSolve_SeqDense_TearDown(A, xx, yy, &y, &m, &k)); 6064396437dSToby Isaac PetscFunctionReturn(0); 6074396437dSToby Isaac } 6084396437dSToby Isaac 6094396437dSToby Isaac static PetscErrorCode MatSolveTranspose_SeqDense_Cholesky(Mat A, Vec xx, Vec yy) 6104396437dSToby Isaac { 611e54beecaSStefano Zampini PetscScalar *y = NULL; 612e54beecaSStefano Zampini PetscBLASInt m = 0, k = 0; 6134396437dSToby Isaac 6144396437dSToby Isaac PetscFunctionBegin; 6159566063dSJacob Faibussowitsch PetscCall(MatSolve_SeqDense_SetUp(A, xx, yy, &y, &m, &k)); 6169566063dSJacob Faibussowitsch PetscCall(MatSolve_SeqDense_Internal_Cholesky(A, y, m, m, 1, k, PETSC_TRUE)); 6179566063dSJacob Faibussowitsch PetscCall(MatSolve_SeqDense_TearDown(A, xx, yy, &y, &m, &k)); 6184396437dSToby Isaac PetscFunctionReturn(0); 6194396437dSToby Isaac } 6204396437dSToby Isaac 6214396437dSToby Isaac static PetscErrorCode MatSolve_SeqDense_QR(Mat A, Vec xx, Vec yy) 6224396437dSToby Isaac { 623e54beecaSStefano Zampini PetscScalar *y = NULL; 624e54beecaSStefano Zampini PetscBLASInt m = 0, k = 0; 6254396437dSToby Isaac 6264396437dSToby Isaac PetscFunctionBegin; 6279566063dSJacob Faibussowitsch PetscCall(MatSolve_SeqDense_SetUp(A, xx, yy, &y, &m, &k)); 6289566063dSJacob Faibussowitsch PetscCall(MatSolve_SeqDense_Internal_QR(A, y, PetscMax(m,k), m, 1, k)); 6299566063dSJacob Faibussowitsch PetscCall(MatSolve_SeqDense_TearDown(A, xx, yy, &y, &m, &k)); 6304396437dSToby Isaac PetscFunctionReturn(0); 6314396437dSToby Isaac } 6324396437dSToby Isaac 6334396437dSToby Isaac static PetscErrorCode MatSolveTranspose_SeqDense_QR(Mat A, Vec xx, Vec yy) 6344396437dSToby Isaac { 63542e9364cSSatish Balay PetscScalar *y = NULL; 63642e9364cSSatish Balay PetscBLASInt m = 0, k = 0; 6374396437dSToby Isaac 6384396437dSToby Isaac PetscFunctionBegin; 6399566063dSJacob Faibussowitsch PetscCall(MatSolve_SeqDense_SetUp(A, xx, yy, &y, &m, &k)); 6409566063dSJacob Faibussowitsch PetscCall(MatSolveTranspose_SeqDense_Internal_QR(A, y, PetscMax(m,k), m, 1, k)); 6419566063dSJacob Faibussowitsch PetscCall(MatSolve_SeqDense_TearDown(A, xx, yy, &y, &m, &k)); 6424396437dSToby Isaac PetscFunctionReturn(0); 6434396437dSToby Isaac } 6444396437dSToby Isaac 645bf5a80bcSToby Isaac static PetscErrorCode MatMatSolve_SeqDense_SetUp(Mat A, Mat B, Mat X, PetscScalar **_y, PetscBLASInt *_ldy, PetscBLASInt *_m, PetscBLASInt *_nrhs, PetscBLASInt *_k) 6464905a7bcSToby Isaac { 6474905a7bcSToby Isaac const PetscScalar *b; 6484396437dSToby Isaac PetscScalar *y; 649bf5a80bcSToby Isaac PetscInt n, _ldb, _ldx; 650bf5a80bcSToby Isaac PetscBLASInt nrhs=0,m=0,k=0,ldb=0,ldx=0,ldy=0; 6514905a7bcSToby Isaac 6524905a7bcSToby Isaac PetscFunctionBegin; 6536280eecaSJose E. Roman *_ldy=0; *_m=0; *_nrhs=0; *_k=0; *_y = NULL; 6549566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(A->rmap->n,&m)); 6559566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(A->cmap->n,&k)); 6569566063dSJacob Faibussowitsch PetscCall(MatGetSize(B,NULL,&n)); 6579566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(n,&nrhs)); 6589566063dSJacob Faibussowitsch PetscCall(MatDenseGetLDA(B,&_ldb)); 6599566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(_ldb, &ldb)); 6609566063dSJacob Faibussowitsch PetscCall(MatDenseGetLDA(X,&_ldx)); 6619566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(_ldx, &ldx)); 662bf5a80bcSToby Isaac if (ldx < m) { 6639566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(B,&b)); 6649566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(nrhs * m, &y)); 665bf5a80bcSToby Isaac if (ldb == m) { 6669566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(y,b,ldb*nrhs)); 6674905a7bcSToby Isaac } else { 6684905a7bcSToby Isaac for (PetscInt j = 0; j < nrhs; j++) { 6699566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(&y[j*m],&b[j*ldb],m)); 6704905a7bcSToby Isaac } 6714905a7bcSToby Isaac } 672bf5a80bcSToby Isaac ldy = m; 6739566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(B,&b)); 6744905a7bcSToby Isaac } else { 675bf5a80bcSToby Isaac if (ldb == ldx) { 6769566063dSJacob Faibussowitsch PetscCall(MatCopy(B, X, SAME_NONZERO_PATTERN)); 6779566063dSJacob Faibussowitsch PetscCall(MatDenseGetArray(X,&y)); 6784905a7bcSToby Isaac } else { 6799566063dSJacob Faibussowitsch PetscCall(MatDenseGetArray(X,&y)); 6809566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(B,&b)); 6814905a7bcSToby Isaac for (PetscInt j = 0; j < nrhs; j++) { 6829566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(&y[j*ldx],&b[j*ldb],m)); 6834905a7bcSToby Isaac } 6849566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(B,&b)); 6854905a7bcSToby Isaac } 686bf5a80bcSToby Isaac ldy = ldx; 6874905a7bcSToby Isaac } 6884396437dSToby Isaac *_y = y; 689bf5a80bcSToby Isaac *_ldy = ldy; 6904396437dSToby Isaac *_k = k; 6914396437dSToby Isaac *_m = m; 6924396437dSToby Isaac *_nrhs = nrhs; 6934396437dSToby Isaac PetscFunctionReturn(0); 6944396437dSToby Isaac } 6954396437dSToby Isaac 696bf5a80bcSToby Isaac static PetscErrorCode MatMatSolve_SeqDense_TearDown(Mat A, Mat B, Mat X, PetscScalar **_y, PetscBLASInt *_ldy, PetscBLASInt *_m, PetscBLASInt *_nrhs, PetscBLASInt *_k) 6974396437dSToby Isaac { 6984396437dSToby Isaac PetscScalar *y; 699bf5a80bcSToby Isaac PetscInt _ldx; 700bf5a80bcSToby Isaac PetscBLASInt k,ldy,nrhs,ldx=0; 7014396437dSToby Isaac 7024396437dSToby Isaac PetscFunctionBegin; 7034396437dSToby Isaac y = *_y; 7044396437dSToby Isaac *_y = NULL; 7054396437dSToby Isaac k = *_k; 706bf5a80bcSToby Isaac ldy = *_ldy; 7074396437dSToby Isaac nrhs = *_nrhs; 7089566063dSJacob Faibussowitsch PetscCall(MatDenseGetLDA(X,&_ldx)); 7099566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(_ldx, &ldx)); 710bf5a80bcSToby Isaac if (ldx != ldy) { 7114905a7bcSToby Isaac PetscScalar *xv; 7129566063dSJacob Faibussowitsch PetscCall(MatDenseGetArray(X,&xv)); 7134905a7bcSToby Isaac for (PetscInt j = 0; j < nrhs; j++) { 7149566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(&xv[j*ldx],&y[j*ldy],k)); 7154905a7bcSToby Isaac } 7169566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArray(X,&xv)); 7179566063dSJacob Faibussowitsch PetscCall(PetscFree(y)); 7184905a7bcSToby Isaac } else { 7199566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArray(X,&y)); 7204905a7bcSToby Isaac } 72185e2c93fSHong Zhang PetscFunctionReturn(0); 72285e2c93fSHong Zhang } 72385e2c93fSHong Zhang 7244396437dSToby Isaac static PetscErrorCode MatMatSolve_SeqDense_LU(Mat A, Mat B, Mat X) 7254396437dSToby Isaac { 7264396437dSToby Isaac PetscScalar *y; 727bf5a80bcSToby Isaac PetscBLASInt m, k, ldy, nrhs; 7284396437dSToby Isaac 7294396437dSToby Isaac PetscFunctionBegin; 7309566063dSJacob Faibussowitsch PetscCall(MatMatSolve_SeqDense_SetUp(A, B, X, &y, &ldy, &m, &nrhs, &k)); 7319566063dSJacob Faibussowitsch PetscCall(MatSolve_SeqDense_Internal_LU(A, y, ldy, m, nrhs, k, PETSC_FALSE)); 7329566063dSJacob Faibussowitsch PetscCall(MatMatSolve_SeqDense_TearDown(A, B, X, &y, &ldy, &m, &nrhs, &k)); 7334396437dSToby Isaac PetscFunctionReturn(0); 7344396437dSToby Isaac } 7354396437dSToby Isaac 7364396437dSToby Isaac static PetscErrorCode MatMatSolveTranspose_SeqDense_LU(Mat A, Mat B, Mat X) 7374396437dSToby Isaac { 7384396437dSToby Isaac PetscScalar *y; 739bf5a80bcSToby Isaac PetscBLASInt m, k, ldy, nrhs; 7404396437dSToby Isaac 7414396437dSToby Isaac PetscFunctionBegin; 7429566063dSJacob Faibussowitsch PetscCall(MatMatSolve_SeqDense_SetUp(A, B, X, &y, &ldy, &m, &nrhs, &k)); 7439566063dSJacob Faibussowitsch PetscCall(MatSolve_SeqDense_Internal_LU(A, y, ldy, m, nrhs, k, PETSC_TRUE)); 7449566063dSJacob Faibussowitsch PetscCall(MatMatSolve_SeqDense_TearDown(A, B, X, &y, &ldy, &m, &nrhs, &k)); 7454396437dSToby Isaac PetscFunctionReturn(0); 7464396437dSToby Isaac } 7474396437dSToby Isaac 7484396437dSToby Isaac static PetscErrorCode MatMatSolve_SeqDense_Cholesky(Mat A, Mat B, Mat X) 7494396437dSToby Isaac { 7504396437dSToby Isaac PetscScalar *y; 751bf5a80bcSToby Isaac PetscBLASInt m, k, ldy, nrhs; 7524396437dSToby Isaac 7534396437dSToby Isaac PetscFunctionBegin; 7549566063dSJacob Faibussowitsch PetscCall(MatMatSolve_SeqDense_SetUp(A, B, X, &y, &ldy, &m, &nrhs, &k)); 7559566063dSJacob Faibussowitsch PetscCall(MatSolve_SeqDense_Internal_Cholesky(A, y, ldy, m, nrhs, k, PETSC_FALSE)); 7569566063dSJacob Faibussowitsch PetscCall(MatMatSolve_SeqDense_TearDown(A, B, X, &y, &ldy, &m, &nrhs, &k)); 7574396437dSToby Isaac PetscFunctionReturn(0); 7584396437dSToby Isaac } 7594396437dSToby Isaac 7604396437dSToby Isaac static PetscErrorCode MatMatSolveTranspose_SeqDense_Cholesky(Mat A, Mat B, Mat X) 7614396437dSToby Isaac { 7624396437dSToby Isaac PetscScalar *y; 763bf5a80bcSToby Isaac PetscBLASInt m, k, ldy, nrhs; 7644396437dSToby Isaac 7654396437dSToby Isaac PetscFunctionBegin; 7669566063dSJacob Faibussowitsch PetscCall(MatMatSolve_SeqDense_SetUp(A, B, X, &y, &ldy, &m, &nrhs, &k)); 7679566063dSJacob Faibussowitsch PetscCall(MatSolve_SeqDense_Internal_Cholesky(A, y, ldy, m, nrhs, k, PETSC_TRUE)); 7689566063dSJacob Faibussowitsch PetscCall(MatMatSolve_SeqDense_TearDown(A, B, X, &y, &ldy, &m, &nrhs, &k)); 7694396437dSToby Isaac PetscFunctionReturn(0); 7704396437dSToby Isaac } 7714396437dSToby Isaac 7724396437dSToby Isaac static PetscErrorCode MatMatSolve_SeqDense_QR(Mat A, Mat B, Mat X) 7734396437dSToby Isaac { 7744396437dSToby Isaac PetscScalar *y; 775bf5a80bcSToby Isaac PetscBLASInt m, k, ldy, nrhs; 7764396437dSToby Isaac 7774396437dSToby Isaac PetscFunctionBegin; 7789566063dSJacob Faibussowitsch PetscCall(MatMatSolve_SeqDense_SetUp(A, B, X, &y, &ldy, &m, &nrhs, &k)); 7799566063dSJacob Faibussowitsch PetscCall(MatSolve_SeqDense_Internal_QR(A, y, ldy, m, nrhs, k)); 7809566063dSJacob Faibussowitsch PetscCall(MatMatSolve_SeqDense_TearDown(A, B, X, &y, &ldy, &m, &nrhs, &k)); 7814396437dSToby Isaac PetscFunctionReturn(0); 7824396437dSToby Isaac } 7834396437dSToby Isaac 7844396437dSToby Isaac static PetscErrorCode MatMatSolveTranspose_SeqDense_QR(Mat A, Mat B, Mat X) 7854396437dSToby Isaac { 7864396437dSToby Isaac PetscScalar *y; 787bf5a80bcSToby Isaac PetscBLASInt m, k, ldy, nrhs; 7884396437dSToby Isaac 7894396437dSToby Isaac PetscFunctionBegin; 7909566063dSJacob Faibussowitsch PetscCall(MatMatSolve_SeqDense_SetUp(A, B, X, &y, &ldy, &m, &nrhs, &k)); 7919566063dSJacob Faibussowitsch PetscCall(MatSolveTranspose_SeqDense_Internal_QR(A, y, ldy, m, nrhs, k)); 7929566063dSJacob Faibussowitsch PetscCall(MatMatSolve_SeqDense_TearDown(A, B, X, &y, &ldy, &m, &nrhs, &k)); 7934396437dSToby Isaac PetscFunctionReturn(0); 7944396437dSToby Isaac } 7954396437dSToby Isaac 796db4efbfdSBarry Smith /* ---------------------------------------------------------------*/ 797db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots, 798db4efbfdSBarry Smith rather than put it in the Mat->row slot.*/ 799ca15aa20SStefano Zampini PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo) 800db4efbfdSBarry Smith { 801db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 802db4efbfdSBarry Smith PetscBLASInt n,m,info; 803db4efbfdSBarry Smith 804db4efbfdSBarry Smith PetscFunctionBegin; 8059566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(A->cmap->n,&n)); 8069566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(A->rmap->n,&m)); 807db4efbfdSBarry Smith if (!mat->pivots) { 8089566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(A->rmap->n,&mat->pivots)); 8099566063dSJacob Faibussowitsch PetscCall(PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt))); 810db4efbfdSBarry Smith } 811db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 8129566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); 8138b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrf",LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info)); 8149566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPop()); 8158e57ea43SSatish Balay 8162c71b3e2SJacob Faibussowitsch PetscCheckFalse(info<0,PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization"); 8172c71b3e2SJacob Faibussowitsch PetscCheckFalse(info>0,PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization"); 8188208b9aeSStefano Zampini 8194396437dSToby Isaac A->ops->solve = MatSolve_SeqDense_LU; 8204396437dSToby Isaac A->ops->matsolve = MatMatSolve_SeqDense_LU; 8214396437dSToby Isaac A->ops->solvetranspose = MatSolveTranspose_SeqDense_LU; 8224396437dSToby Isaac A->ops->matsolvetranspose = MatMatSolveTranspose_SeqDense_LU; 823d5f3da31SBarry Smith A->factortype = MAT_FACTOR_LU; 824db4efbfdSBarry Smith 8259566063dSJacob Faibussowitsch PetscCall(PetscFree(A->solvertype)); 8269566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(MATSOLVERPETSC,&A->solvertype)); 827f6224b95SHong Zhang 8289566063dSJacob Faibussowitsch PetscCall(PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3)); 829db4efbfdSBarry Smith PetscFunctionReturn(0); 830db4efbfdSBarry Smith } 831db4efbfdSBarry Smith 8324396437dSToby Isaac static PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 8334396437dSToby Isaac { 8344396437dSToby Isaac MatFactorInfo info; 8354396437dSToby Isaac 8364396437dSToby Isaac PetscFunctionBegin; 8379566063dSJacob Faibussowitsch PetscCall(MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES)); 8389566063dSJacob Faibussowitsch PetscCall((*fact->ops->lufactor)(fact,NULL,NULL,&info)); 8394396437dSToby Isaac PetscFunctionReturn(0); 8404396437dSToby Isaac } 8414396437dSToby Isaac 8424396437dSToby Isaac PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info) 8434396437dSToby Isaac { 8444396437dSToby Isaac PetscFunctionBegin; 8454396437dSToby Isaac fact->preallocated = PETSC_TRUE; 8464396437dSToby Isaac fact->assembled = PETSC_TRUE; 8474396437dSToby Isaac fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense; 8484396437dSToby Isaac PetscFunctionReturn(0); 8494396437dSToby Isaac } 8504396437dSToby Isaac 851a49dc2a2SStefano Zampini /* Cholesky as L*L^T or L*D*L^T and the symmetric/hermitian complex variants */ 852ca15aa20SStefano Zampini PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo) 853db4efbfdSBarry Smith { 854db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 855c5df96a5SBarry Smith PetscBLASInt info,n; 856db4efbfdSBarry Smith 857db4efbfdSBarry Smith PetscFunctionBegin; 8589566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(A->cmap->n,&n)); 859db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 860a49dc2a2SStefano Zampini if (A->spd) { 8619566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); 8628b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrf",LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info)); 8639566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPop()); 864a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX) 865a49dc2a2SStefano Zampini } else if (A->hermitian) { 866a49dc2a2SStefano Zampini if (!mat->pivots) { 8679566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(A->rmap->n,&mat->pivots)); 8689566063dSJacob Faibussowitsch PetscCall(PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt))); 869a49dc2a2SStefano Zampini } 870a49dc2a2SStefano Zampini if (!mat->fwork) { 871a49dc2a2SStefano Zampini PetscScalar dummy; 872a49dc2a2SStefano Zampini 873a49dc2a2SStefano Zampini mat->lfwork = -1; 8749566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); 875a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKhetrf",LAPACKhetrf_("L",&n,mat->v,&mat->lda,mat->pivots,&dummy,&mat->lfwork,&info)); 8769566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPop()); 877a49dc2a2SStefano Zampini mat->lfwork = (PetscInt)PetscRealPart(dummy); 8789566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(mat->lfwork,&mat->fwork)); 8799566063dSJacob Faibussowitsch PetscCall(PetscLogObjectMemory((PetscObject)A,mat->lfwork*sizeof(PetscBLASInt))); 880a49dc2a2SStefano Zampini } 8819566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); 882a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKhetrf",LAPACKhetrf_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&mat->lfwork,&info)); 8839566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPop()); 884a49dc2a2SStefano Zampini #endif 885a49dc2a2SStefano Zampini } else { /* symmetric case */ 886a49dc2a2SStefano Zampini if (!mat->pivots) { 8879566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(A->rmap->n,&mat->pivots)); 8889566063dSJacob Faibussowitsch PetscCall(PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt))); 889a49dc2a2SStefano Zampini } 890a49dc2a2SStefano Zampini if (!mat->fwork) { 891a49dc2a2SStefano Zampini PetscScalar dummy; 892a49dc2a2SStefano Zampini 893a49dc2a2SStefano Zampini mat->lfwork = -1; 8949566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); 895a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrf",LAPACKsytrf_("L",&n,mat->v,&mat->lda,mat->pivots,&dummy,&mat->lfwork,&info)); 8969566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPop()); 897a49dc2a2SStefano Zampini mat->lfwork = (PetscInt)PetscRealPart(dummy); 8989566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(mat->lfwork,&mat->fwork)); 8999566063dSJacob Faibussowitsch PetscCall(PetscLogObjectMemory((PetscObject)A,mat->lfwork*sizeof(PetscBLASInt))); 900a49dc2a2SStefano Zampini } 9019566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); 902a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrf",LAPACKsytrf_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&mat->lfwork,&info)); 9039566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPop()); 904a49dc2a2SStefano Zampini } 90528b400f6SJacob Faibussowitsch PetscCheck(!info,PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %" PetscInt_FMT,(PetscInt)info-1); 9068208b9aeSStefano Zampini 9074396437dSToby Isaac A->ops->solve = MatSolve_SeqDense_Cholesky; 9084396437dSToby Isaac A->ops->matsolve = MatMatSolve_SeqDense_Cholesky; 9094396437dSToby Isaac A->ops->solvetranspose = MatSolveTranspose_SeqDense_Cholesky; 9104396437dSToby Isaac A->ops->matsolvetranspose = MatMatSolveTranspose_SeqDense_Cholesky; 911d5f3da31SBarry Smith A->factortype = MAT_FACTOR_CHOLESKY; 9122205254eSKarl Rupp 9139566063dSJacob Faibussowitsch PetscCall(PetscFree(A->solvertype)); 9149566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(MATSOLVERPETSC,&A->solvertype)); 915f6224b95SHong Zhang 9169566063dSJacob Faibussowitsch PetscCall(PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0)); 917db4efbfdSBarry Smith PetscFunctionReturn(0); 918db4efbfdSBarry Smith } 919db4efbfdSBarry Smith 9204396437dSToby Isaac static PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 921db4efbfdSBarry Smith { 922db4efbfdSBarry Smith MatFactorInfo info; 923db4efbfdSBarry Smith 924db4efbfdSBarry Smith PetscFunctionBegin; 925db4efbfdSBarry Smith info.fill = 1.0; 9262205254eSKarl Rupp 9279566063dSJacob Faibussowitsch PetscCall(MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES)); 9289566063dSJacob Faibussowitsch PetscCall((*fact->ops->choleskyfactor)(fact,NULL,&info)); 929db4efbfdSBarry Smith PetscFunctionReturn(0); 930db4efbfdSBarry Smith } 931db4efbfdSBarry Smith 932ca15aa20SStefano Zampini PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info) 933db4efbfdSBarry Smith { 934db4efbfdSBarry Smith PetscFunctionBegin; 935c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 9361bbcc794SSatish Balay fact->preallocated = PETSC_TRUE; 937719d5645SBarry Smith fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense; 938db4efbfdSBarry Smith PetscFunctionReturn(0); 939db4efbfdSBarry Smith } 940db4efbfdSBarry Smith 941bf5a80bcSToby Isaac PetscErrorCode MatQRFactor_SeqDense(Mat A,IS col,const MatFactorInfo *minfo) 9424905a7bcSToby Isaac { 9434905a7bcSToby Isaac Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 9444905a7bcSToby Isaac PetscBLASInt n,m,info, min, max; 9454905a7bcSToby Isaac 9464905a7bcSToby Isaac PetscFunctionBegin; 9479566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(A->cmap->n,&n)); 9489566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(A->rmap->n,&m)); 9494396437dSToby Isaac max = PetscMax(m, n); 9504396437dSToby Isaac min = PetscMin(m, n); 9514905a7bcSToby Isaac if (!mat->tau) { 9529566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(min,&mat->tau)); 9539566063dSJacob Faibussowitsch PetscCall(PetscLogObjectMemory((PetscObject)A,min*sizeof(PetscScalar))); 9544396437dSToby Isaac } 9554396437dSToby Isaac if (!mat->pivots) { 9569566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(n,&mat->pivots)); 9579566063dSJacob Faibussowitsch PetscCall(PetscLogObjectMemory((PetscObject)A,n*sizeof(PetscScalar))); 9584396437dSToby Isaac } 9594396437dSToby Isaac if (!mat->qrrhs) { 9609566063dSJacob Faibussowitsch PetscCall(MatCreateVecs(A, NULL, &(mat->qrrhs))); 9614905a7bcSToby Isaac } 9624905a7bcSToby Isaac if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 9634905a7bcSToby Isaac if (!mat->fwork) { 9644905a7bcSToby Isaac PetscScalar dummy; 9654905a7bcSToby Isaac 9664905a7bcSToby Isaac mat->lfwork = -1; 9679566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); 9684905a7bcSToby Isaac PetscStackCallBLAS("LAPACKgeqrf",LAPACKgeqrf_(&m,&n,mat->v,&mat->lda,mat->tau,&dummy,&mat->lfwork,&info)); 9699566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPop()); 9704905a7bcSToby Isaac mat->lfwork = (PetscInt)PetscRealPart(dummy); 9719566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(mat->lfwork,&mat->fwork)); 9729566063dSJacob Faibussowitsch PetscCall(PetscLogObjectMemory((PetscObject)A,mat->lfwork*sizeof(PetscBLASInt))); 9734905a7bcSToby Isaac } 9749566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); 9754905a7bcSToby Isaac PetscStackCallBLAS("LAPACKgeqrf",LAPACKgeqrf_(&m,&n,mat->v,&mat->lda,mat->tau,mat->fwork,&mat->lfwork,&info)); 9769566063dSJacob Faibussowitsch PetscCall(PetscFPTrapPop()); 97728b400f6SJacob Faibussowitsch PetscCheck(!info,PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to QR factorization"); 9784905a7bcSToby 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 9794905a7bcSToby Isaac mat->rank = min; 9804905a7bcSToby Isaac 9814396437dSToby Isaac A->ops->solve = MatSolve_SeqDense_QR; 9824396437dSToby Isaac A->ops->matsolve = MatMatSolve_SeqDense_QR; 9834905a7bcSToby Isaac A->factortype = MAT_FACTOR_QR; 9844905a7bcSToby Isaac if (m == n) { 9854396437dSToby Isaac A->ops->solvetranspose = MatSolveTranspose_SeqDense_QR; 9864396437dSToby Isaac A->ops->matsolvetranspose = MatMatSolveTranspose_SeqDense_QR; 9874905a7bcSToby Isaac } 9884905a7bcSToby Isaac 9899566063dSJacob Faibussowitsch PetscCall(PetscFree(A->solvertype)); 9909566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(MATSOLVERPETSC,&A->solvertype)); 9914905a7bcSToby Isaac 9929566063dSJacob Faibussowitsch PetscCall(PetscLogFlops(2.0*min*min*(max-min/3.0))); 9934905a7bcSToby Isaac PetscFunctionReturn(0); 9944905a7bcSToby Isaac } 9954905a7bcSToby Isaac 9964905a7bcSToby Isaac static PetscErrorCode MatQRFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 9974905a7bcSToby Isaac { 9984905a7bcSToby Isaac MatFactorInfo info; 9994905a7bcSToby Isaac 10004905a7bcSToby Isaac PetscFunctionBegin; 10014905a7bcSToby Isaac info.fill = 1.0; 10024905a7bcSToby Isaac 10039566063dSJacob Faibussowitsch PetscCall(MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES)); 1004cac4c232SBarry Smith PetscUseMethod(fact,"MatQRFactor_C",(Mat,IS,const MatFactorInfo *),(fact,NULL,&info)); 10054905a7bcSToby Isaac PetscFunctionReturn(0); 10064905a7bcSToby Isaac } 10074905a7bcSToby Isaac 1008bf5a80bcSToby Isaac PetscErrorCode MatQRFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info) 10094905a7bcSToby Isaac { 10104905a7bcSToby Isaac PetscFunctionBegin; 10114905a7bcSToby Isaac fact->assembled = PETSC_TRUE; 10124905a7bcSToby Isaac fact->preallocated = PETSC_TRUE; 10139566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)fact,"MatQRFactorNumeric_C",MatQRFactorNumeric_SeqDense)); 10144905a7bcSToby Isaac PetscFunctionReturn(0); 10154905a7bcSToby Isaac } 10164905a7bcSToby Isaac 1017ca15aa20SStefano Zampini /* uses LAPACK */ 1018cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact) 1019db4efbfdSBarry Smith { 1020db4efbfdSBarry Smith PetscFunctionBegin; 10219566063dSJacob Faibussowitsch PetscCall(MatCreate(PetscObjectComm((PetscObject)A),fact)); 10229566063dSJacob Faibussowitsch PetscCall(MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n)); 10239566063dSJacob Faibussowitsch PetscCall(MatSetType(*fact,MATDENSE)); 102466e17bc3SBarry Smith (*fact)->trivialsymbolic = PETSC_TRUE; 10252a350339SBarry Smith if (ftype == MAT_FACTOR_LU || ftype == MAT_FACTOR_ILU) { 1026db4efbfdSBarry Smith (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense; 10272a350339SBarry Smith (*fact)->ops->ilufactorsymbolic = MatLUFactorSymbolic_SeqDense; 1028bf5a80bcSToby Isaac } else if (ftype == MAT_FACTOR_CHOLESKY || ftype == MAT_FACTOR_ICC) { 1029db4efbfdSBarry Smith (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense; 1030bf5a80bcSToby Isaac } else if (ftype == MAT_FACTOR_QR) { 10319566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)(*fact),"MatQRFactorSymbolic_C",MatQRFactorSymbolic_SeqDense)); 1032db4efbfdSBarry Smith } 1033d5f3da31SBarry Smith (*fact)->factortype = ftype; 103400c67f3bSHong Zhang 10359566063dSJacob Faibussowitsch PetscCall(PetscFree((*fact)->solvertype)); 10369566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(MATSOLVERPETSC,&(*fact)->solvertype)); 10379566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(MATORDERINGEXTERNAL,(char**)&(*fact)->preferredordering[MAT_FACTOR_LU])); 10389566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(MATORDERINGEXTERNAL,(char**)&(*fact)->preferredordering[MAT_FACTOR_ILU])); 10399566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(MATORDERINGEXTERNAL,(char**)&(*fact)->preferredordering[MAT_FACTOR_CHOLESKY])); 10409566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(MATORDERINGEXTERNAL,(char**)&(*fact)->preferredordering[MAT_FACTOR_ICC])); 1041db4efbfdSBarry Smith PetscFunctionReturn(0); 1042db4efbfdSBarry Smith } 1043db4efbfdSBarry Smith 1044289bc588SBarry Smith /* ------------------------------------------------------------------*/ 1045e0877f53SBarry Smith static PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx) 1046289bc588SBarry Smith { 1047c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1048d9ca1df4SBarry Smith PetscScalar *x,*v = mat->v,zero = 0.0,xt; 1049d9ca1df4SBarry Smith const PetscScalar *b; 1050d0f46423SBarry Smith PetscInt m = A->rmap->n,i; 105123fff9afSBarry Smith PetscBLASInt o = 1,bm = 0; 1052289bc588SBarry Smith 10533a40ed3dSBarry Smith PetscFunctionBegin; 1054ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA) 10552c71b3e2SJacob Faibussowitsch PetscCheckFalse(A->offloadmask == PETSC_OFFLOAD_GPU,PETSC_COMM_SELF,PETSC_ERR_SUP,"Not implemented"); 1056ca15aa20SStefano Zampini #endif 1057422a814eSBarry Smith if (shift == -1) shift = 0.0; /* negative shift indicates do not error on zero diagonal; this code never zeros on zero diagonal */ 10589566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(m,&bm)); 1059289bc588SBarry Smith if (flag & SOR_ZERO_INITIAL_GUESS) { 10603bffc371SBarry Smith /* this is a hack fix, should have another version without the second BLASdotu */ 10619566063dSJacob Faibussowitsch PetscCall(VecSet(xx,zero)); 1062289bc588SBarry Smith } 10639566063dSJacob Faibussowitsch PetscCall(VecGetArray(xx,&x)); 10649566063dSJacob Faibussowitsch PetscCall(VecGetArrayRead(bb,&b)); 1065b965ef7fSBarry Smith its = its*lits; 10662c71b3e2SJacob Faibussowitsch PetscCheckFalse(its <= 0,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Relaxation requires global its %" PetscInt_FMT " and local its %" PetscInt_FMT " both positive",its,lits); 1067289bc588SBarry Smith while (its--) { 1068fccaa45eSBarry Smith if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) { 1069289bc588SBarry Smith for (i=0; i<m; i++) { 10703bffc371SBarry Smith PetscStackCallBLAS("BLASdotu",xt = b[i] - BLASdotu_(&bm,v+i,&bm,x,&o)); 107155a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 1072289bc588SBarry Smith } 1073289bc588SBarry Smith } 1074fccaa45eSBarry Smith if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) { 1075289bc588SBarry Smith for (i=m-1; i>=0; i--) { 10763bffc371SBarry Smith PetscStackCallBLAS("BLASdotu",xt = b[i] - BLASdotu_(&bm,v+i,&bm,x,&o)); 107755a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 1078289bc588SBarry Smith } 1079289bc588SBarry Smith } 1080289bc588SBarry Smith } 10819566063dSJacob Faibussowitsch PetscCall(VecRestoreArrayRead(bb,&b)); 10829566063dSJacob Faibussowitsch PetscCall(VecRestoreArray(xx,&x)); 10833a40ed3dSBarry Smith PetscFunctionReturn(0); 1084289bc588SBarry Smith } 1085289bc588SBarry Smith 1086289bc588SBarry Smith /* -----------------------------------------------------------------*/ 1087ca15aa20SStefano Zampini PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy) 1088289bc588SBarry Smith { 1089c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1090d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 1091d9ca1df4SBarry Smith PetscScalar *y; 10920805154bSBarry Smith PetscBLASInt m, n,_One=1; 1093ea709b57SSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 10943a40ed3dSBarry Smith 10953a40ed3dSBarry Smith PetscFunctionBegin; 10969566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(A->rmap->n,&m)); 10979566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(A->cmap->n,&n)); 10989566063dSJacob Faibussowitsch PetscCall(VecGetArrayRead(xx,&x)); 10999566063dSJacob Faibussowitsch PetscCall(VecGetArrayWrite(yy,&y)); 11005ac36cfcSBarry Smith if (!A->rmap->n || !A->cmap->n) { 11015ac36cfcSBarry Smith PetscBLASInt i; 11025ac36cfcSBarry Smith for (i=0; i<n; i++) y[i] = 0.0; 11035ac36cfcSBarry Smith } else { 11048b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One)); 11059566063dSJacob Faibussowitsch PetscCall(PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n)); 11065ac36cfcSBarry Smith } 11079566063dSJacob Faibussowitsch PetscCall(VecRestoreArrayRead(xx,&x)); 11089566063dSJacob Faibussowitsch PetscCall(VecRestoreArrayWrite(yy,&y)); 11093a40ed3dSBarry Smith PetscFunctionReturn(0); 1110289bc588SBarry Smith } 1111800995b7SMatthew Knepley 1112ca15aa20SStefano Zampini PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy) 1113289bc588SBarry Smith { 1114c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1115d9ca1df4SBarry Smith PetscScalar *y,_DOne=1.0,_DZero=0.0; 11160805154bSBarry Smith PetscBLASInt m, n, _One=1; 1117d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 11183a40ed3dSBarry Smith 11193a40ed3dSBarry Smith PetscFunctionBegin; 11209566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(A->rmap->n,&m)); 11219566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(A->cmap->n,&n)); 11229566063dSJacob Faibussowitsch PetscCall(VecGetArrayRead(xx,&x)); 11239566063dSJacob Faibussowitsch PetscCall(VecGetArrayWrite(yy,&y)); 11245ac36cfcSBarry Smith if (!A->rmap->n || !A->cmap->n) { 11255ac36cfcSBarry Smith PetscBLASInt i; 11265ac36cfcSBarry Smith for (i=0; i<m; i++) y[i] = 0.0; 11275ac36cfcSBarry Smith } else { 11288b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One)); 11299566063dSJacob Faibussowitsch PetscCall(PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n)); 11305ac36cfcSBarry Smith } 11319566063dSJacob Faibussowitsch PetscCall(VecRestoreArrayRead(xx,&x)); 11329566063dSJacob Faibussowitsch PetscCall(VecRestoreArrayWrite(yy,&y)); 11333a40ed3dSBarry Smith PetscFunctionReturn(0); 1134289bc588SBarry Smith } 11356ee01492SSatish Balay 1136ca15aa20SStefano Zampini PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 1137289bc588SBarry Smith { 1138c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1139d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 1140d9ca1df4SBarry Smith PetscScalar *y,_DOne=1.0; 11410805154bSBarry Smith PetscBLASInt m, n, _One=1; 11423a40ed3dSBarry Smith 11433a40ed3dSBarry Smith PetscFunctionBegin; 11449566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(A->rmap->n,&m)); 11459566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(A->cmap->n,&n)); 11469566063dSJacob Faibussowitsch PetscCall(VecCopy(zz,yy)); 1147d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 11489566063dSJacob Faibussowitsch PetscCall(VecGetArrayRead(xx,&x)); 11499566063dSJacob Faibussowitsch PetscCall(VecGetArray(yy,&y)); 11508b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One)); 11519566063dSJacob Faibussowitsch PetscCall(VecRestoreArrayRead(xx,&x)); 11529566063dSJacob Faibussowitsch PetscCall(VecRestoreArray(yy,&y)); 11539566063dSJacob Faibussowitsch PetscCall(PetscLogFlops(2.0*A->rmap->n*A->cmap->n)); 11543a40ed3dSBarry Smith PetscFunctionReturn(0); 1155289bc588SBarry Smith } 11566ee01492SSatish Balay 1157ca15aa20SStefano Zampini PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 1158289bc588SBarry Smith { 1159c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1160d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 1161d9ca1df4SBarry Smith PetscScalar *y; 11620805154bSBarry Smith PetscBLASInt m, n, _One=1; 116387828ca2SBarry Smith PetscScalar _DOne=1.0; 11643a40ed3dSBarry Smith 11653a40ed3dSBarry Smith PetscFunctionBegin; 11669566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(A->rmap->n,&m)); 11679566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(A->cmap->n,&n)); 11689566063dSJacob Faibussowitsch PetscCall(VecCopy(zz,yy)); 1169d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 11709566063dSJacob Faibussowitsch PetscCall(VecGetArrayRead(xx,&x)); 11719566063dSJacob Faibussowitsch PetscCall(VecGetArray(yy,&y)); 11728b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One)); 11739566063dSJacob Faibussowitsch PetscCall(VecRestoreArrayRead(xx,&x)); 11749566063dSJacob Faibussowitsch PetscCall(VecRestoreArray(yy,&y)); 11759566063dSJacob Faibussowitsch PetscCall(PetscLogFlops(2.0*A->rmap->n*A->cmap->n)); 11763a40ed3dSBarry Smith PetscFunctionReturn(0); 1177289bc588SBarry Smith } 1178289bc588SBarry Smith 1179289bc588SBarry Smith /* -----------------------------------------------------------------*/ 1180e0877f53SBarry Smith static PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 1181289bc588SBarry Smith { 1182c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 118313f74950SBarry Smith PetscInt i; 118467e560aaSBarry Smith 11853a40ed3dSBarry Smith PetscFunctionBegin; 1186d0f46423SBarry Smith *ncols = A->cmap->n; 1187289bc588SBarry Smith if (cols) { 11889566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(A->cmap->n,cols)); 1189d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) (*cols)[i] = i; 1190289bc588SBarry Smith } 1191289bc588SBarry Smith if (vals) { 1192ca15aa20SStefano Zampini const PetscScalar *v; 1193ca15aa20SStefano Zampini 11949566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(A,&v)); 11959566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(A->cmap->n,vals)); 1196ca15aa20SStefano Zampini v += row; 1197d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;} 11989566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(A,&v)); 1199289bc588SBarry Smith } 12003a40ed3dSBarry Smith PetscFunctionReturn(0); 1201289bc588SBarry Smith } 12026ee01492SSatish Balay 1203e0877f53SBarry Smith static PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 1204289bc588SBarry Smith { 1205606d414cSSatish Balay PetscFunctionBegin; 1206cb4a9cd9SHong Zhang if (ncols) *ncols = 0; 12079566063dSJacob Faibussowitsch if (cols) PetscCall(PetscFree(*cols)); 12089566063dSJacob Faibussowitsch if (vals) PetscCall(PetscFree(*vals)); 12093a40ed3dSBarry Smith PetscFunctionReturn(0); 1210289bc588SBarry Smith } 1211289bc588SBarry Smith /* ----------------------------------------------------------------*/ 1212e0877f53SBarry Smith static PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv) 1213289bc588SBarry Smith { 1214c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1215ca15aa20SStefano Zampini PetscScalar *av; 121613f74950SBarry Smith PetscInt i,j,idx=0; 1217ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA) 1218c70f7ee4SJunchao Zhang PetscOffloadMask oldf; 1219ca15aa20SStefano Zampini #endif 1220d6dfbf8fSBarry Smith 12213a40ed3dSBarry Smith PetscFunctionBegin; 12229566063dSJacob Faibussowitsch PetscCall(MatDenseGetArray(A,&av)); 1223289bc588SBarry Smith if (!mat->roworiented) { 1224dbb450caSBarry Smith if (addv == INSERT_VALUES) { 1225289bc588SBarry Smith for (j=0; j<n; j++) { 1226cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 12276bdcaf15SBarry Smith PetscCheck(indexn[j] < A->cmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %" PetscInt_FMT " max %" PetscInt_FMT,indexn[j],A->cmap->n-1); 1228289bc588SBarry Smith for (i=0; i<m; i++) { 1229cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 12306bdcaf15SBarry Smith PetscCheck(indexm[i] < A->rmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %" PetscInt_FMT " max %" PetscInt_FMT,indexm[i],A->rmap->n-1); 1231ca15aa20SStefano Zampini av[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 1232289bc588SBarry Smith } 1233289bc588SBarry Smith } 12343a40ed3dSBarry Smith } else { 1235289bc588SBarry Smith for (j=0; j<n; j++) { 1236cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 12376bdcaf15SBarry Smith PetscCheck(indexn[j] < A->cmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %" PetscInt_FMT " max %" PetscInt_FMT,indexn[j],A->cmap->n-1); 1238289bc588SBarry Smith for (i=0; i<m; i++) { 1239cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 12406bdcaf15SBarry Smith PetscCheck(indexm[i] < A->rmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %" PetscInt_FMT " max %" PetscInt_FMT,indexm[i],A->rmap->n-1); 1241ca15aa20SStefano Zampini av[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 1242289bc588SBarry Smith } 1243289bc588SBarry Smith } 1244289bc588SBarry Smith } 12453a40ed3dSBarry Smith } else { 1246dbb450caSBarry Smith if (addv == INSERT_VALUES) { 1247e8d4e0b9SBarry Smith for (i=0; i<m; i++) { 1248cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 12496bdcaf15SBarry Smith PetscCheck(indexm[i] < A->rmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %" PetscInt_FMT " max %" PetscInt_FMT,indexm[i],A->rmap->n-1); 1250e8d4e0b9SBarry Smith for (j=0; j<n; j++) { 1251cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 12526bdcaf15SBarry Smith PetscCheck(indexn[j] < A->cmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %" PetscInt_FMT " max %" PetscInt_FMT,indexn[j],A->cmap->n-1); 1253ca15aa20SStefano Zampini av[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 1254e8d4e0b9SBarry Smith } 1255e8d4e0b9SBarry Smith } 12563a40ed3dSBarry Smith } else { 1257289bc588SBarry Smith for (i=0; i<m; i++) { 1258cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 12596bdcaf15SBarry Smith PetscCheck(indexm[i] < A->rmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %" PetscInt_FMT " max %" PetscInt_FMT,indexm[i],A->rmap->n-1); 1260289bc588SBarry Smith for (j=0; j<n; j++) { 1261cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 12626bdcaf15SBarry Smith PetscCheck(indexn[j] < A->cmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %" PetscInt_FMT " max %" PetscInt_FMT,indexn[j],A->cmap->n-1); 1263ca15aa20SStefano Zampini av[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 1264289bc588SBarry Smith } 1265289bc588SBarry Smith } 1266289bc588SBarry Smith } 1267e8d4e0b9SBarry Smith } 1268ca15aa20SStefano Zampini /* hack to prevent unneeded copy to the GPU while returning the array */ 1269ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA) 1270c70f7ee4SJunchao Zhang oldf = A->offloadmask; 1271c70f7ee4SJunchao Zhang A->offloadmask = PETSC_OFFLOAD_GPU; 1272ca15aa20SStefano Zampini #endif 12739566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArray(A,&av)); 1274ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA) 1275c70f7ee4SJunchao Zhang A->offloadmask = (oldf == PETSC_OFFLOAD_UNALLOCATED ? PETSC_OFFLOAD_UNALLOCATED : PETSC_OFFLOAD_CPU); 1276ca15aa20SStefano Zampini #endif 12773a40ed3dSBarry Smith PetscFunctionReturn(0); 1278289bc588SBarry Smith } 1279e8d4e0b9SBarry Smith 1280e0877f53SBarry Smith static PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[]) 1281ae80bb75SLois Curfman McInnes { 1282ae80bb75SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1283ca15aa20SStefano Zampini const PetscScalar *vv; 128413f74950SBarry Smith PetscInt i,j; 1285ae80bb75SLois Curfman McInnes 12863a40ed3dSBarry Smith PetscFunctionBegin; 12879566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(A,&vv)); 1288ae80bb75SLois Curfman McInnes /* row-oriented output */ 1289ae80bb75SLois Curfman McInnes for (i=0; i<m; i++) { 129097e567efSBarry Smith if (indexm[i] < 0) {v += n;continue;} 12912c71b3e2SJacob Faibussowitsch PetscCheckFalse(indexm[i] >= A->rmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row %" PetscInt_FMT " requested larger than number rows %" PetscInt_FMT,indexm[i],A->rmap->n); 1292ae80bb75SLois Curfman McInnes for (j=0; j<n; j++) { 12936f31f424SBarry Smith if (indexn[j] < 0) {v++; continue;} 12942c71b3e2SJacob Faibussowitsch PetscCheckFalse(indexn[j] >= A->cmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column %" PetscInt_FMT " requested larger than number columns %" PetscInt_FMT,indexn[j],A->cmap->n); 1295ca15aa20SStefano Zampini *v++ = vv[indexn[j]*mat->lda + indexm[i]]; 1296ae80bb75SLois Curfman McInnes } 1297ae80bb75SLois Curfman McInnes } 12989566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(A,&vv)); 12993a40ed3dSBarry Smith PetscFunctionReturn(0); 1300ae80bb75SLois Curfman McInnes } 1301ae80bb75SLois Curfman McInnes 1302289bc588SBarry Smith /* -----------------------------------------------------------------*/ 1303289bc588SBarry Smith 13048491ab44SLisandro Dalcin PetscErrorCode MatView_Dense_Binary(Mat mat,PetscViewer viewer) 1305aabbc4fbSShri Abhyankar { 13068491ab44SLisandro Dalcin PetscBool skipHeader; 13078491ab44SLisandro Dalcin PetscViewerFormat format; 13088491ab44SLisandro Dalcin PetscInt header[4],M,N,m,lda,i,j,k; 13098491ab44SLisandro Dalcin const PetscScalar *v; 13108491ab44SLisandro Dalcin PetscScalar *vwork; 1311aabbc4fbSShri Abhyankar 1312aabbc4fbSShri Abhyankar PetscFunctionBegin; 13139566063dSJacob Faibussowitsch PetscCall(PetscViewerSetUp(viewer)); 13149566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryGetSkipHeader(viewer,&skipHeader)); 13159566063dSJacob Faibussowitsch PetscCall(PetscViewerGetFormat(viewer,&format)); 13168491ab44SLisandro Dalcin if (skipHeader) format = PETSC_VIEWER_NATIVE; 1317aabbc4fbSShri Abhyankar 13189566063dSJacob Faibussowitsch PetscCall(MatGetSize(mat,&M,&N)); 13198491ab44SLisandro Dalcin 13208491ab44SLisandro Dalcin /* write matrix header */ 13218491ab44SLisandro Dalcin header[0] = MAT_FILE_CLASSID; header[1] = M; header[2] = N; 13228491ab44SLisandro Dalcin header[3] = (format == PETSC_VIEWER_NATIVE) ? MATRIX_BINARY_FORMAT_DENSE : M*N; 13239566063dSJacob Faibussowitsch if (!skipHeader) PetscCall(PetscViewerBinaryWrite(viewer,header,4,PETSC_INT)); 13248491ab44SLisandro Dalcin 13259566063dSJacob Faibussowitsch PetscCall(MatGetLocalSize(mat,&m,NULL)); 13268491ab44SLisandro Dalcin if (format != PETSC_VIEWER_NATIVE) { 13278491ab44SLisandro Dalcin PetscInt nnz = m*N, *iwork; 13288491ab44SLisandro Dalcin /* store row lengths for each row */ 13299566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(nnz,&iwork)); 13308491ab44SLisandro Dalcin for (i=0; i<m; i++) iwork[i] = N; 13319566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWriteAll(viewer,iwork,m,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_INT)); 13328491ab44SLisandro Dalcin /* store column indices (zero start index) */ 13338491ab44SLisandro Dalcin for (k=0, i=0; i<m; i++) 13348491ab44SLisandro Dalcin for (j=0; j<N; j++, k++) 13358491ab44SLisandro Dalcin iwork[k] = j; 13369566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWriteAll(viewer,iwork,nnz,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_INT)); 13379566063dSJacob Faibussowitsch PetscCall(PetscFree(iwork)); 13388491ab44SLisandro Dalcin } 13398491ab44SLisandro Dalcin /* store matrix values as a dense matrix in row major order */ 13409566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(m*N,&vwork)); 13419566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(mat,&v)); 13429566063dSJacob Faibussowitsch PetscCall(MatDenseGetLDA(mat,&lda)); 13438491ab44SLisandro Dalcin for (k=0, i=0; i<m; i++) 13448491ab44SLisandro Dalcin for (j=0; j<N; j++, k++) 13458491ab44SLisandro Dalcin vwork[k] = v[i+lda*j]; 13469566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(mat,&v)); 13479566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWriteAll(viewer,vwork,m*N,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_SCALAR)); 13489566063dSJacob Faibussowitsch PetscCall(PetscFree(vwork)); 13498491ab44SLisandro Dalcin PetscFunctionReturn(0); 13508491ab44SLisandro Dalcin } 13518491ab44SLisandro Dalcin 13528491ab44SLisandro Dalcin PetscErrorCode MatLoad_Dense_Binary(Mat mat,PetscViewer viewer) 13538491ab44SLisandro Dalcin { 13548491ab44SLisandro Dalcin PetscBool skipHeader; 13558491ab44SLisandro Dalcin PetscInt header[4],M,N,m,nz,lda,i,j,k; 13568491ab44SLisandro Dalcin PetscInt rows,cols; 13578491ab44SLisandro Dalcin PetscScalar *v,*vwork; 13588491ab44SLisandro Dalcin 13598491ab44SLisandro Dalcin PetscFunctionBegin; 13609566063dSJacob Faibussowitsch PetscCall(PetscViewerSetUp(viewer)); 13619566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryGetSkipHeader(viewer,&skipHeader)); 13628491ab44SLisandro Dalcin 13638491ab44SLisandro Dalcin if (!skipHeader) { 13649566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(viewer,header,4,NULL,PETSC_INT)); 13652c71b3e2SJacob Faibussowitsch PetscCheckFalse(header[0] != MAT_FILE_CLASSID,PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"Not a matrix object in file"); 13668491ab44SLisandro Dalcin M = header[1]; N = header[2]; 13672c71b3e2SJacob Faibussowitsch PetscCheckFalse(M < 0,PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"Matrix row size (%" PetscInt_FMT ") in file is negative",M); 13682c71b3e2SJacob Faibussowitsch PetscCheckFalse(N < 0,PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"Matrix column size (%" PetscInt_FMT ") in file is negative",N); 13698491ab44SLisandro Dalcin nz = header[3]; 13702c71b3e2SJacob Faibussowitsch PetscCheckFalse(nz != MATRIX_BINARY_FORMAT_DENSE && nz < 0,PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"Unknown matrix format %" PetscInt_FMT " in file",nz); 1371aabbc4fbSShri Abhyankar } else { 13729566063dSJacob Faibussowitsch PetscCall(MatGetSize(mat,&M,&N)); 13732c71b3e2SJacob Faibussowitsch PetscCheckFalse(M < 0 || N < 0,PETSC_COMM_SELF,PETSC_ERR_USER,"Matrix binary file header was skipped, thus the user must specify the global sizes of input matrix"); 13748491ab44SLisandro Dalcin nz = MATRIX_BINARY_FORMAT_DENSE; 1375e6324fbbSBarry Smith } 1376aabbc4fbSShri Abhyankar 13778491ab44SLisandro Dalcin /* setup global sizes if not set */ 13788491ab44SLisandro Dalcin if (mat->rmap->N < 0) mat->rmap->N = M; 13798491ab44SLisandro Dalcin if (mat->cmap->N < 0) mat->cmap->N = N; 13809566063dSJacob Faibussowitsch PetscCall(MatSetUp(mat)); 13818491ab44SLisandro Dalcin /* check if global sizes are correct */ 13829566063dSJacob Faibussowitsch PetscCall(MatGetSize(mat,&rows,&cols)); 13832c71b3e2SJacob Faibussowitsch PetscCheckFalse(M != rows || N != cols,PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED, "Matrix in file of different sizes (%" PetscInt_FMT ", %" PetscInt_FMT ") than the input matrix (%" PetscInt_FMT ", %" PetscInt_FMT ")",M,N,rows,cols); 1384aabbc4fbSShri Abhyankar 13859566063dSJacob Faibussowitsch PetscCall(MatGetSize(mat,NULL,&N)); 13869566063dSJacob Faibussowitsch PetscCall(MatGetLocalSize(mat,&m,NULL)); 13879566063dSJacob Faibussowitsch PetscCall(MatDenseGetArray(mat,&v)); 13889566063dSJacob Faibussowitsch PetscCall(MatDenseGetLDA(mat,&lda)); 13898491ab44SLisandro Dalcin if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense format */ 13908491ab44SLisandro Dalcin PetscInt nnz = m*N; 13918491ab44SLisandro Dalcin /* read in matrix values */ 13929566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(nnz,&vwork)); 13939566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryReadAll(viewer,vwork,nnz,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_SCALAR)); 13948491ab44SLisandro Dalcin /* store values in column major order */ 13958491ab44SLisandro Dalcin for (j=0; j<N; j++) 13968491ab44SLisandro Dalcin for (i=0; i<m; i++) 13978491ab44SLisandro Dalcin v[i+lda*j] = vwork[i*N+j]; 13989566063dSJacob Faibussowitsch PetscCall(PetscFree(vwork)); 13998491ab44SLisandro Dalcin } else { /* matrix in file is sparse format */ 14008491ab44SLisandro Dalcin PetscInt nnz = 0, *rlens, *icols; 14018491ab44SLisandro Dalcin /* read in row lengths */ 14029566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(m,&rlens)); 14039566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryReadAll(viewer,rlens,m,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_INT)); 14048491ab44SLisandro Dalcin for (i=0; i<m; i++) nnz += rlens[i]; 14058491ab44SLisandro Dalcin /* read in column indices and values */ 14069566063dSJacob Faibussowitsch PetscCall(PetscMalloc2(nnz,&icols,nnz,&vwork)); 14079566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryReadAll(viewer,icols,nnz,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_INT)); 14089566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryReadAll(viewer,vwork,nnz,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_SCALAR)); 14098491ab44SLisandro Dalcin /* store values in column major order */ 14108491ab44SLisandro Dalcin for (k=0, i=0; i<m; i++) 14118491ab44SLisandro Dalcin for (j=0; j<rlens[i]; j++, k++) 14128491ab44SLisandro Dalcin v[i+lda*icols[k]] = vwork[k]; 14139566063dSJacob Faibussowitsch PetscCall(PetscFree(rlens)); 14149566063dSJacob Faibussowitsch PetscCall(PetscFree2(icols,vwork)); 1415aabbc4fbSShri Abhyankar } 14169566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArray(mat,&v)); 14179566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(mat,MAT_FINAL_ASSEMBLY)); 14189566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(mat,MAT_FINAL_ASSEMBLY)); 1419aabbc4fbSShri Abhyankar PetscFunctionReturn(0); 1420aabbc4fbSShri Abhyankar } 1421aabbc4fbSShri Abhyankar 1422eb91f321SVaclav Hapla PetscErrorCode MatLoad_SeqDense(Mat newMat, PetscViewer viewer) 1423eb91f321SVaclav Hapla { 1424eb91f321SVaclav Hapla PetscBool isbinary, ishdf5; 1425eb91f321SVaclav Hapla 1426eb91f321SVaclav Hapla PetscFunctionBegin; 1427eb91f321SVaclav Hapla PetscValidHeaderSpecific(newMat,MAT_CLASSID,1); 1428eb91f321SVaclav Hapla PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 1429eb91f321SVaclav Hapla /* force binary viewer to load .info file if it has not yet done so */ 14309566063dSJacob Faibussowitsch PetscCall(PetscViewerSetUp(viewer)); 14319566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary)); 14329566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERHDF5, &ishdf5)); 1433eb91f321SVaclav Hapla if (isbinary) { 14349566063dSJacob Faibussowitsch PetscCall(MatLoad_Dense_Binary(newMat,viewer)); 1435eb91f321SVaclav Hapla } else if (ishdf5) { 1436eb91f321SVaclav Hapla #if defined(PETSC_HAVE_HDF5) 14379566063dSJacob Faibussowitsch PetscCall(MatLoad_Dense_HDF5(newMat,viewer)); 1438eb91f321SVaclav Hapla #else 1439eb91f321SVaclav Hapla SETERRQ(PetscObjectComm((PetscObject)newMat),PETSC_ERR_SUP,"HDF5 not supported in this build.\nPlease reconfigure using --download-hdf5"); 1440eb91f321SVaclav Hapla #endif 1441eb91f321SVaclav Hapla } else { 144298921bdaSJacob Faibussowitsch SETERRQ(PetscObjectComm((PetscObject)newMat),PETSC_ERR_SUP,"Viewer type %s not yet supported for reading %s matrices",((PetscObject)viewer)->type_name,((PetscObject)newMat)->type_name); 1443eb91f321SVaclav Hapla } 1444eb91f321SVaclav Hapla PetscFunctionReturn(0); 1445eb91f321SVaclav Hapla } 1446eb91f321SVaclav Hapla 14476849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer) 1448289bc588SBarry Smith { 1449932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 145013f74950SBarry Smith PetscInt i,j; 14512dcb1b2aSMatthew Knepley const char *name; 1452ca15aa20SStefano Zampini PetscScalar *v,*av; 1453f3ef73ceSBarry Smith PetscViewerFormat format; 14545f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX) 1455ace3abfcSBarry Smith PetscBool allreal = PETSC_TRUE; 14565f481a85SSatish Balay #endif 1457932b0c3eSLois Curfman McInnes 14583a40ed3dSBarry Smith PetscFunctionBegin; 14599566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(A,(const PetscScalar**)&av)); 14609566063dSJacob Faibussowitsch PetscCall(PetscViewerGetFormat(viewer,&format)); 1461456192e2SBarry Smith if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 14623a40ed3dSBarry Smith PetscFunctionReturn(0); /* do nothing for now */ 1463fb9695e5SSatish Balay } else if (format == PETSC_VIEWER_ASCII_COMMON) { 14649566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIUseTabs(viewer,PETSC_FALSE)); 1465d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 1466ca15aa20SStefano Zampini v = av + i; 14679566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer,"row %" PetscInt_FMT ":",i)); 1468d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1469aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 1470329f5518SBarry Smith if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) { 14719566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer," (%" PetscInt_FMT ", %g + %g i) ",j,(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v))); 1472329f5518SBarry Smith } else if (PetscRealPart(*v)) { 14739566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer," (%" PetscInt_FMT ", %g) ",j,(double)PetscRealPart(*v))); 14746831982aSBarry Smith } 147580cd9d93SLois Curfman McInnes #else 14766831982aSBarry Smith if (*v) { 14779566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer," (%" PetscInt_FMT ", %g) ",j,(double)*v)); 14786831982aSBarry Smith } 147980cd9d93SLois Curfman McInnes #endif 14801b807ce4Svictorle v += a->lda; 148180cd9d93SLois Curfman McInnes } 14829566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer,"\n")); 148380cd9d93SLois Curfman McInnes } 14849566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIUseTabs(viewer,PETSC_TRUE)); 14853a40ed3dSBarry Smith } else { 14869566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIUseTabs(viewer,PETSC_FALSE)); 1487aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 148847989497SBarry Smith /* determine if matrix has all real values */ 1489*bcd8d3a4SJose E. Roman for (j=0; j<A->cmap->n; j++) { 1490*bcd8d3a4SJose E. Roman v = av + j*a->lda; 1491*bcd8d3a4SJose E. Roman for (i=0; i<A->rmap->n; i++) { 1492ffac6cdbSBarry Smith if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break;} 149347989497SBarry Smith } 1494*bcd8d3a4SJose E. Roman } 149547989497SBarry Smith #endif 1496fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 14979566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName((PetscObject)A,&name)); 14989566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer,"%% Size = %" PetscInt_FMT " %" PetscInt_FMT " \n",A->rmap->n,A->cmap->n)); 14999566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer,"%s = zeros(%" PetscInt_FMT ",%" PetscInt_FMT ");\n",name,A->rmap->n,A->cmap->n)); 15009566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer,"%s = [\n",name)); 1501ffac6cdbSBarry Smith } 1502ffac6cdbSBarry Smith 1503d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 1504ca15aa20SStefano Zampini v = av + i; 1505d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1506aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 150747989497SBarry Smith if (allreal) { 15089566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v))); 150947989497SBarry Smith } else { 15109566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v))); 151147989497SBarry Smith } 1512289bc588SBarry Smith #else 15139566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v)); 1514289bc588SBarry Smith #endif 15151b807ce4Svictorle v += a->lda; 1516289bc588SBarry Smith } 15179566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer,"\n")); 1518289bc588SBarry Smith } 1519fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 15209566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer,"];\n")); 1521ffac6cdbSBarry Smith } 15229566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIUseTabs(viewer,PETSC_TRUE)); 1523da3a660dSBarry Smith } 15249566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(A,(const PetscScalar**)&av)); 15259566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(viewer)); 15263a40ed3dSBarry Smith PetscFunctionReturn(0); 1527289bc588SBarry Smith } 1528289bc588SBarry Smith 15299804daf3SBarry Smith #include <petscdraw.h> 1530e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa) 1531f1af5d2fSBarry Smith { 1532f1af5d2fSBarry Smith Mat A = (Mat) Aa; 1533383922c3SLisandro Dalcin PetscInt m = A->rmap->n,n = A->cmap->n,i,j; 1534383922c3SLisandro Dalcin int color = PETSC_DRAW_WHITE; 1535ca15aa20SStefano Zampini const PetscScalar *v; 1536b0a32e0cSBarry Smith PetscViewer viewer; 1537b05fc000SLisandro Dalcin PetscReal xl,yl,xr,yr,x_l,x_r,y_l,y_r; 1538f3ef73ceSBarry Smith PetscViewerFormat format; 15395f80ce2aSJacob Faibussowitsch PetscErrorCode ierr; 1540f1af5d2fSBarry Smith 1541f1af5d2fSBarry Smith PetscFunctionBegin; 15429566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer)); 15439566063dSJacob Faibussowitsch PetscCall(PetscViewerGetFormat(viewer,&format)); 15449566063dSJacob Faibussowitsch PetscCall(PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr)); 1545f1af5d2fSBarry Smith 1546f1af5d2fSBarry Smith /* Loop over matrix elements drawing boxes */ 15479566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(A,&v)); 1548fb9695e5SSatish Balay if (format != PETSC_VIEWER_DRAW_CONTOUR) { 15499566063dSJacob Faibussowitsch ierr = PetscDrawCollectiveBegin(draw);PetscCall(ierr); 1550f1af5d2fSBarry Smith /* Blue for negative and Red for positive */ 1551f1af5d2fSBarry Smith for (j = 0; j < n; j++) { 1552383922c3SLisandro Dalcin x_l = j; x_r = x_l + 1.0; 1553f1af5d2fSBarry Smith for (i = 0; i < m; i++) { 1554f1af5d2fSBarry Smith y_l = m - i - 1.0; 1555f1af5d2fSBarry Smith y_r = y_l + 1.0; 1556ca15aa20SStefano Zampini if (PetscRealPart(v[j*m+i]) > 0.) color = PETSC_DRAW_RED; 1557ca15aa20SStefano Zampini else if (PetscRealPart(v[j*m+i]) < 0.) color = PETSC_DRAW_BLUE; 1558ca15aa20SStefano Zampini else continue; 15599566063dSJacob Faibussowitsch PetscCall(PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color)); 1560f1af5d2fSBarry Smith } 1561f1af5d2fSBarry Smith } 15629566063dSJacob Faibussowitsch ierr = PetscDrawCollectiveEnd(draw);PetscCall(ierr); 1563f1af5d2fSBarry Smith } else { 1564f1af5d2fSBarry Smith /* use contour shading to indicate magnitude of values */ 1565f1af5d2fSBarry Smith /* first determine max of all nonzero values */ 1566b05fc000SLisandro Dalcin PetscReal minv = 0.0, maxv = 0.0; 1567b05fc000SLisandro Dalcin PetscDraw popup; 1568b05fc000SLisandro Dalcin 1569f1af5d2fSBarry Smith for (i=0; i < m*n; i++) { 1570f1af5d2fSBarry Smith if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]); 1571f1af5d2fSBarry Smith } 1572383922c3SLisandro Dalcin if (minv >= maxv) maxv = minv + PETSC_SMALL; 15739566063dSJacob Faibussowitsch PetscCall(PetscDrawGetPopup(draw,&popup)); 15749566063dSJacob Faibussowitsch PetscCall(PetscDrawScalePopup(popup,minv,maxv)); 1575383922c3SLisandro Dalcin 15769566063dSJacob Faibussowitsch ierr = PetscDrawCollectiveBegin(draw);PetscCall(ierr); 1577f1af5d2fSBarry Smith for (j=0; j<n; j++) { 1578f1af5d2fSBarry Smith x_l = j; 1579f1af5d2fSBarry Smith x_r = x_l + 1.0; 1580f1af5d2fSBarry Smith for (i=0; i<m; i++) { 1581f1af5d2fSBarry Smith y_l = m - i - 1.0; 1582f1af5d2fSBarry Smith y_r = y_l + 1.0; 1583b05fc000SLisandro Dalcin color = PetscDrawRealToColor(PetscAbsScalar(v[j*m+i]),minv,maxv); 15849566063dSJacob Faibussowitsch PetscCall(PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color)); 1585f1af5d2fSBarry Smith } 1586f1af5d2fSBarry Smith } 15879566063dSJacob Faibussowitsch ierr = PetscDrawCollectiveEnd(draw);PetscCall(ierr); 1588f1af5d2fSBarry Smith } 15899566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(A,&v)); 1590f1af5d2fSBarry Smith PetscFunctionReturn(0); 1591f1af5d2fSBarry Smith } 1592f1af5d2fSBarry Smith 1593e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer) 1594f1af5d2fSBarry Smith { 1595b0a32e0cSBarry Smith PetscDraw draw; 1596ace3abfcSBarry Smith PetscBool isnull; 1597329f5518SBarry Smith PetscReal xr,yr,xl,yl,h,w; 1598f1af5d2fSBarry Smith 1599f1af5d2fSBarry Smith PetscFunctionBegin; 16009566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawGetDraw(viewer,0,&draw)); 16019566063dSJacob Faibussowitsch PetscCall(PetscDrawIsNull(draw,&isnull)); 1602abc0a331SBarry Smith if (isnull) PetscFunctionReturn(0); 1603f1af5d2fSBarry Smith 1604d0f46423SBarry Smith xr = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0; 1605f1af5d2fSBarry Smith xr += w; yr += h; xl = -w; yl = -h; 16069566063dSJacob Faibussowitsch PetscCall(PetscDrawSetCoordinates(draw,xl,yl,xr,yr)); 16079566063dSJacob Faibussowitsch PetscCall(PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer)); 16089566063dSJacob Faibussowitsch PetscCall(PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A)); 16099566063dSJacob Faibussowitsch PetscCall(PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL)); 16109566063dSJacob Faibussowitsch PetscCall(PetscDrawSave(draw)); 1611f1af5d2fSBarry Smith PetscFunctionReturn(0); 1612f1af5d2fSBarry Smith } 1613f1af5d2fSBarry Smith 1614dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer) 1615932b0c3eSLois Curfman McInnes { 1616ace3abfcSBarry Smith PetscBool iascii,isbinary,isdraw; 1617932b0c3eSLois Curfman McInnes 16183a40ed3dSBarry Smith PetscFunctionBegin; 16199566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii)); 16209566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary)); 16219566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw)); 1622c45a1595SBarry Smith if (iascii) { 16239566063dSJacob Faibussowitsch PetscCall(MatView_SeqDense_ASCII(A,viewer)); 16240f5bd95cSBarry Smith } else if (isbinary) { 16259566063dSJacob Faibussowitsch PetscCall(MatView_Dense_Binary(A,viewer)); 1626f1af5d2fSBarry Smith } else if (isdraw) { 16279566063dSJacob Faibussowitsch PetscCall(MatView_SeqDense_Draw(A,viewer)); 1628932b0c3eSLois Curfman McInnes } 16293a40ed3dSBarry Smith PetscFunctionReturn(0); 1630932b0c3eSLois Curfman McInnes } 1631289bc588SBarry Smith 1632637a0070SStefano Zampini static PetscErrorCode MatDensePlaceArray_SeqDense(Mat A,const PetscScalar *array) 1633d3042a70SBarry Smith { 1634d3042a70SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1635d3042a70SBarry Smith 1636d3042a70SBarry Smith PetscFunctionBegin; 163728b400f6SJacob Faibussowitsch PetscCheck(!a->vecinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first"); 163828b400f6SJacob Faibussowitsch PetscCheck(!a->matinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first"); 163928b400f6SJacob Faibussowitsch PetscCheck(!a->unplacedarray,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreArray() first"); 1640d3042a70SBarry Smith a->unplacedarray = a->v; 1641d3042a70SBarry Smith a->unplaced_user_alloc = a->user_alloc; 1642d3042a70SBarry Smith a->v = (PetscScalar*) array; 1643637a0070SStefano Zampini a->user_alloc = PETSC_TRUE; 1644ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA) 1645c70f7ee4SJunchao Zhang A->offloadmask = PETSC_OFFLOAD_CPU; 1646ca15aa20SStefano Zampini #endif 1647d3042a70SBarry Smith PetscFunctionReturn(0); 1648d3042a70SBarry Smith } 1649d3042a70SBarry Smith 1650d3042a70SBarry Smith static PetscErrorCode MatDenseResetArray_SeqDense(Mat A) 1651d3042a70SBarry Smith { 1652d3042a70SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1653d3042a70SBarry Smith 1654d3042a70SBarry Smith PetscFunctionBegin; 165528b400f6SJacob Faibussowitsch PetscCheck(!a->vecinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first"); 165628b400f6SJacob Faibussowitsch PetscCheck(!a->matinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first"); 1657d3042a70SBarry Smith a->v = a->unplacedarray; 1658d3042a70SBarry Smith a->user_alloc = a->unplaced_user_alloc; 1659d3042a70SBarry Smith a->unplacedarray = NULL; 1660ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA) 1661c70f7ee4SJunchao Zhang A->offloadmask = PETSC_OFFLOAD_CPU; 1662ca15aa20SStefano Zampini #endif 1663d3042a70SBarry Smith PetscFunctionReturn(0); 1664d3042a70SBarry Smith } 1665d3042a70SBarry Smith 1666d5ea218eSStefano Zampini static PetscErrorCode MatDenseReplaceArray_SeqDense(Mat A,const PetscScalar *array) 1667d5ea218eSStefano Zampini { 1668d5ea218eSStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1669d5ea218eSStefano Zampini 1670d5ea218eSStefano Zampini PetscFunctionBegin; 167128b400f6SJacob Faibussowitsch PetscCheck(!a->vecinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first"); 167228b400f6SJacob Faibussowitsch PetscCheck(!a->matinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first"); 16739566063dSJacob Faibussowitsch if (!a->user_alloc) PetscCall(PetscFree(a->v)); 1674d5ea218eSStefano Zampini a->v = (PetscScalar*) array; 1675d5ea218eSStefano Zampini a->user_alloc = PETSC_FALSE; 1676d5ea218eSStefano Zampini #if defined(PETSC_HAVE_CUDA) 1677d5ea218eSStefano Zampini A->offloadmask = PETSC_OFFLOAD_CPU; 1678d5ea218eSStefano Zampini #endif 1679d5ea218eSStefano Zampini PetscFunctionReturn(0); 1680d5ea218eSStefano Zampini } 1681d5ea218eSStefano Zampini 1682ca15aa20SStefano Zampini PetscErrorCode MatDestroy_SeqDense(Mat mat) 1683289bc588SBarry Smith { 1684ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)mat->data; 168590f02eecSBarry Smith 16863a40ed3dSBarry Smith PetscFunctionBegin; 1687aa482453SBarry Smith #if defined(PETSC_USE_LOG) 1688c0aa6a63SJacob Faibussowitsch PetscLogObjectState((PetscObject)mat,"Rows %" PetscInt_FMT " Cols %" PetscInt_FMT,mat->rmap->n,mat->cmap->n); 1689a5a9c739SBarry Smith #endif 16909566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(l->qrrhs))); 16919566063dSJacob Faibussowitsch PetscCall(PetscFree(l->tau)); 16929566063dSJacob Faibussowitsch PetscCall(PetscFree(l->pivots)); 16939566063dSJacob Faibussowitsch PetscCall(PetscFree(l->fwork)); 16949566063dSJacob Faibussowitsch PetscCall(MatDestroy(&l->ptapwork)); 16959566063dSJacob Faibussowitsch if (!l->user_alloc) PetscCall(PetscFree(l->v)); 16969566063dSJacob Faibussowitsch if (!l->unplaced_user_alloc) PetscCall(PetscFree(l->unplacedarray)); 169728b400f6SJacob Faibussowitsch PetscCheck(!l->vecinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first"); 169828b400f6SJacob Faibussowitsch PetscCheck(!l->matinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first"); 16999566063dSJacob Faibussowitsch PetscCall(VecDestroy(&l->cvec)); 17009566063dSJacob Faibussowitsch PetscCall(MatDestroy(&l->cmat)); 17019566063dSJacob Faibussowitsch PetscCall(PetscFree(mat->data)); 1702dbd8c25aSHong Zhang 17039566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)mat,NULL)); 17049566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatQRFactor_C",NULL)); 17059566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetLDA_C",NULL)); 17069566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatDenseSetLDA_C",NULL)); 17079566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL)); 17089566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL)); 17099566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatDensePlaceArray_C",NULL)); 17109566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatDenseResetArray_C",NULL)); 17119566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatDenseReplaceArray_C",NULL)); 17129566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArrayRead_C",NULL)); 17139566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArrayRead_C",NULL)); 17149566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArrayWrite_C",NULL)); 17159566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArrayWrite_C",NULL)); 17169566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL)); 17178baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 17189566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL)); 17198baccfbdSHong Zhang #endif 1720d24d4204SJose E. Roman #if defined(PETSC_HAVE_SCALAPACK) 17219566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_scalapack_C",NULL)); 1722d24d4204SJose E. Roman #endif 17232bf066beSStefano Zampini #if defined(PETSC_HAVE_CUDA) 17249566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqdensecuda_C",NULL)); 17259566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqdensecuda_seqdensecuda_C",NULL)); 17269566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqdensecuda_seqdense_C",NULL)); 17272bf066beSStefano Zampini #endif 17289566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL)); 17299566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqaij_seqdense_C",NULL)); 17309566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqdense_seqdense_C",NULL)); 17319566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqbaij_seqdense_C",NULL)); 17329566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqsbaij_seqdense_C",NULL)); 173352c5f739Sprj- 17349566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumn_C",NULL)); 17359566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumn_C",NULL)); 17369566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumnVec_C",NULL)); 17379566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumnVec_C",NULL)); 17389566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumnVecRead_C",NULL)); 17399566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumnVecRead_C",NULL)); 17409566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumnVecWrite_C",NULL)); 17419566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumnVecWrite_C",NULL)); 17429566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetSubMatrix_C",NULL)); 17439566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreSubMatrix_C",NULL)); 17443a40ed3dSBarry Smith PetscFunctionReturn(0); 1745289bc588SBarry Smith } 1746289bc588SBarry Smith 1747e0877f53SBarry Smith static PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout) 1748289bc588SBarry Smith { 1749c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 17506536e3caSStefano Zampini PetscInt k,j,m = A->rmap->n, M = mat->lda, n = A->cmap->n; 175187828ca2SBarry Smith PetscScalar *v,tmp; 175248b35521SBarry Smith 17533a40ed3dSBarry Smith PetscFunctionBegin; 17546536e3caSStefano Zampini if (reuse == MAT_INPLACE_MATRIX) { 17556536e3caSStefano Zampini if (m == n) { /* in place transpose */ 17569566063dSJacob Faibussowitsch PetscCall(MatDenseGetArray(A,&v)); 1757d3e5ee88SLois Curfman McInnes for (j=0; j<m; j++) { 1758289bc588SBarry Smith for (k=0; k<j; k++) { 17591b807ce4Svictorle tmp = v[j + k*M]; 17601b807ce4Svictorle v[j + k*M] = v[k + j*M]; 17611b807ce4Svictorle v[k + j*M] = tmp; 1762289bc588SBarry Smith } 1763289bc588SBarry Smith } 17649566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArray(A,&v)); 17656536e3caSStefano Zampini } else { /* reuse memory, temporary allocates new memory */ 17666536e3caSStefano Zampini PetscScalar *v2; 17676536e3caSStefano Zampini PetscLayout tmplayout; 17686536e3caSStefano Zampini 17699566063dSJacob Faibussowitsch PetscCall(PetscMalloc1((size_t)m*n,&v2)); 17709566063dSJacob Faibussowitsch PetscCall(MatDenseGetArray(A,&v)); 17716536e3caSStefano Zampini for (j=0; j<n; j++) { 17726536e3caSStefano Zampini for (k=0; k<m; k++) v2[j + (size_t)k*n] = v[k + (size_t)j*M]; 17736536e3caSStefano Zampini } 17749566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(v,v2,(size_t)m*n)); 17759566063dSJacob Faibussowitsch PetscCall(PetscFree(v2)); 17769566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArray(A,&v)); 17776536e3caSStefano Zampini /* cleanup size dependent quantities */ 17789566063dSJacob Faibussowitsch PetscCall(VecDestroy(&mat->cvec)); 17799566063dSJacob Faibussowitsch PetscCall(MatDestroy(&mat->cmat)); 17809566063dSJacob Faibussowitsch PetscCall(PetscFree(mat->pivots)); 17819566063dSJacob Faibussowitsch PetscCall(PetscFree(mat->fwork)); 17829566063dSJacob Faibussowitsch PetscCall(MatDestroy(&mat->ptapwork)); 17836536e3caSStefano Zampini /* swap row/col layouts */ 17846536e3caSStefano Zampini mat->lda = n; 17856536e3caSStefano Zampini tmplayout = A->rmap; 17866536e3caSStefano Zampini A->rmap = A->cmap; 17876536e3caSStefano Zampini A->cmap = tmplayout; 17886536e3caSStefano Zampini } 17893a40ed3dSBarry Smith } else { /* out-of-place transpose */ 1790d3e5ee88SLois Curfman McInnes Mat tmat; 1791ec8511deSBarry Smith Mat_SeqDense *tmatd; 179287828ca2SBarry Smith PetscScalar *v2; 1793af36a384SStefano Zampini PetscInt M2; 1794ea709b57SSatish Balay 17956536e3caSStefano Zampini if (reuse == MAT_INITIAL_MATRIX) { 17969566063dSJacob Faibussowitsch PetscCall(MatCreate(PetscObjectComm((PetscObject)A),&tmat)); 17979566063dSJacob Faibussowitsch PetscCall(MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n)); 17989566063dSJacob Faibussowitsch PetscCall(MatSetType(tmat,((PetscObject)A)->type_name)); 17999566063dSJacob Faibussowitsch PetscCall(MatSeqDenseSetPreallocation(tmat,NULL)); 1800ca15aa20SStefano Zampini } else tmat = *matout; 1801ca15aa20SStefano Zampini 18029566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(A,(const PetscScalar**)&v)); 18039566063dSJacob Faibussowitsch PetscCall(MatDenseGetArray(tmat,&v2)); 1804ec8511deSBarry Smith tmatd = (Mat_SeqDense*)tmat->data; 1805ca15aa20SStefano Zampini M2 = tmatd->lda; 1806d3e5ee88SLois Curfman McInnes for (j=0; j<n; j++) { 1807af36a384SStefano Zampini for (k=0; k<m; k++) v2[j + k*M2] = v[k + j*M]; 1808d3e5ee88SLois Curfman McInnes } 18099566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArray(tmat,&v2)); 18109566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(A,(const PetscScalar**)&v)); 18119566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY)); 18129566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY)); 18136536e3caSStefano Zampini *matout = tmat; 181448b35521SBarry Smith } 18153a40ed3dSBarry Smith PetscFunctionReturn(0); 1816289bc588SBarry Smith } 1817289bc588SBarry Smith 1818e0877f53SBarry Smith static PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool *flg) 1819289bc588SBarry Smith { 1820c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data; 1821c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data; 1822ca15aa20SStefano Zampini PetscInt i; 1823ca15aa20SStefano Zampini const PetscScalar *v1,*v2; 18249ea5d5aeSSatish Balay 18253a40ed3dSBarry Smith PetscFunctionBegin; 1826d0f46423SBarry Smith if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1827d0f46423SBarry Smith if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 18289566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(A1,&v1)); 18299566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(A2,&v2)); 1830ca15aa20SStefano Zampini for (i=0; i<A1->cmap->n; i++) { 18319566063dSJacob Faibussowitsch PetscCall(PetscArraycmp(v1,v2,A1->rmap->n,flg)); 1832ca15aa20SStefano Zampini if (*flg == PETSC_FALSE) PetscFunctionReturn(0); 1833ca15aa20SStefano Zampini v1 += mat1->lda; 1834ca15aa20SStefano Zampini v2 += mat2->lda; 18351b807ce4Svictorle } 18369566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(A1,&v1)); 18379566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(A2,&v2)); 183877c4ece6SBarry Smith *flg = PETSC_TRUE; 18393a40ed3dSBarry Smith PetscFunctionReturn(0); 1840289bc588SBarry Smith } 1841289bc588SBarry Smith 1842e0877f53SBarry Smith static PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v) 1843289bc588SBarry Smith { 1844c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 184513f74950SBarry Smith PetscInt i,n,len; 1846ca15aa20SStefano Zampini PetscScalar *x; 1847ca15aa20SStefano Zampini const PetscScalar *vv; 184844cd7ae7SLois Curfman McInnes 18493a40ed3dSBarry Smith PetscFunctionBegin; 18509566063dSJacob Faibussowitsch PetscCall(VecGetSize(v,&n)); 18519566063dSJacob Faibussowitsch PetscCall(VecGetArray(v,&x)); 1852d0f46423SBarry Smith len = PetscMin(A->rmap->n,A->cmap->n); 18539566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(A,&vv)); 18542c71b3e2SJacob Faibussowitsch PetscCheckFalse(n != A->rmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec"); 185544cd7ae7SLois Curfman McInnes for (i=0; i<len; i++) { 1856ca15aa20SStefano Zampini x[i] = vv[i*mat->lda + i]; 1857289bc588SBarry Smith } 18589566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(A,&vv)); 18599566063dSJacob Faibussowitsch PetscCall(VecRestoreArray(v,&x)); 18603a40ed3dSBarry Smith PetscFunctionReturn(0); 1861289bc588SBarry Smith } 1862289bc588SBarry Smith 1863e0877f53SBarry Smith static PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr) 1864289bc588SBarry Smith { 1865c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1866f1ceaac6SMatthew G. Knepley const PetscScalar *l,*r; 1867ca15aa20SStefano Zampini PetscScalar x,*v,*vv; 1868d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n; 186955659b69SBarry Smith 18703a40ed3dSBarry Smith PetscFunctionBegin; 18719566063dSJacob Faibussowitsch PetscCall(MatDenseGetArray(A,&vv)); 187228988994SBarry Smith if (ll) { 18739566063dSJacob Faibussowitsch PetscCall(VecGetSize(ll,&m)); 18749566063dSJacob Faibussowitsch PetscCall(VecGetArrayRead(ll,&l)); 18752c71b3e2SJacob Faibussowitsch PetscCheckFalse(m != A->rmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size"); 1876da3a660dSBarry Smith for (i=0; i<m; i++) { 1877da3a660dSBarry Smith x = l[i]; 1878ca15aa20SStefano Zampini v = vv + i; 1879b43bac26SStefano Zampini for (j=0; j<n; j++) { (*v) *= x; v+= mat->lda;} 1880da3a660dSBarry Smith } 18819566063dSJacob Faibussowitsch PetscCall(VecRestoreArrayRead(ll,&l)); 18829566063dSJacob Faibussowitsch PetscCall(PetscLogFlops(1.0*n*m)); 1883da3a660dSBarry Smith } 188428988994SBarry Smith if (rr) { 18859566063dSJacob Faibussowitsch PetscCall(VecGetSize(rr,&n)); 18869566063dSJacob Faibussowitsch PetscCall(VecGetArrayRead(rr,&r)); 18872c71b3e2SJacob Faibussowitsch PetscCheckFalse(n != A->cmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size"); 1888da3a660dSBarry Smith for (i=0; i<n; i++) { 1889da3a660dSBarry Smith x = r[i]; 1890ca15aa20SStefano Zampini v = vv + i*mat->lda; 18912205254eSKarl Rupp for (j=0; j<m; j++) (*v++) *= x; 1892da3a660dSBarry Smith } 18939566063dSJacob Faibussowitsch PetscCall(VecRestoreArrayRead(rr,&r)); 18949566063dSJacob Faibussowitsch PetscCall(PetscLogFlops(1.0*n*m)); 1895da3a660dSBarry Smith } 18969566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArray(A,&vv)); 18973a40ed3dSBarry Smith PetscFunctionReturn(0); 1898289bc588SBarry Smith } 1899289bc588SBarry Smith 1900ca15aa20SStefano Zampini PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm) 1901289bc588SBarry Smith { 1902c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1903ca15aa20SStefano Zampini PetscScalar *v,*vv; 1904329f5518SBarry Smith PetscReal sum = 0.0; 190575f6d85dSStefano Zampini PetscInt lda, m=A->rmap->n,i,j; 190655659b69SBarry Smith 19073a40ed3dSBarry Smith PetscFunctionBegin; 19089566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(A,(const PetscScalar**)&vv)); 19099566063dSJacob Faibussowitsch PetscCall(MatDenseGetLDA(A,&lda)); 1910ca15aa20SStefano Zampini v = vv; 1911289bc588SBarry Smith if (type == NORM_FROBENIUS) { 1912a5ce6ee0Svictorle if (lda>m) { 1913d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1914ca15aa20SStefano Zampini v = vv+j*lda; 1915a5ce6ee0Svictorle for (i=0; i<m; i++) { 1916a5ce6ee0Svictorle sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1917a5ce6ee0Svictorle } 1918a5ce6ee0Svictorle } 1919a5ce6ee0Svictorle } else { 1920570b7f6dSBarry Smith #if defined(PETSC_USE_REAL___FP16) 1921570b7f6dSBarry Smith PetscBLASInt one = 1,cnt = A->cmap->n*A->rmap->n; 192273cf7048SBarry Smith PetscStackCallBLAS("BLASnrm2",*nrm = BLASnrm2_(&cnt,v,&one)); 1923570b7f6dSBarry Smith } 1924570b7f6dSBarry Smith #else 1925d0f46423SBarry Smith for (i=0; i<A->cmap->n*A->rmap->n; i++) { 1926329f5518SBarry Smith sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1927289bc588SBarry Smith } 1928a5ce6ee0Svictorle } 19298f1a2a5eSBarry Smith *nrm = PetscSqrtReal(sum); 1930570b7f6dSBarry Smith #endif 19319566063dSJacob Faibussowitsch PetscCall(PetscLogFlops(2.0*A->cmap->n*A->rmap->n)); 19323a40ed3dSBarry Smith } else if (type == NORM_1) { 1933064f8208SBarry Smith *nrm = 0.0; 1934d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1935ca15aa20SStefano Zampini v = vv + j*mat->lda; 1936289bc588SBarry Smith sum = 0.0; 1937d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 193833a8263dSBarry Smith sum += PetscAbsScalar(*v); v++; 1939289bc588SBarry Smith } 1940064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1941289bc588SBarry Smith } 19429566063dSJacob Faibussowitsch PetscCall(PetscLogFlops(1.0*A->cmap->n*A->rmap->n)); 19433a40ed3dSBarry Smith } else if (type == NORM_INFINITY) { 1944064f8208SBarry Smith *nrm = 0.0; 1945d0f46423SBarry Smith for (j=0; j<A->rmap->n; j++) { 1946ca15aa20SStefano Zampini v = vv + j; 1947289bc588SBarry Smith sum = 0.0; 1948d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) { 19491b807ce4Svictorle sum += PetscAbsScalar(*v); v += mat->lda; 1950289bc588SBarry Smith } 1951064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1952289bc588SBarry Smith } 19539566063dSJacob Faibussowitsch PetscCall(PetscLogFlops(1.0*A->cmap->n*A->rmap->n)); 1954e7e72b3dSBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm"); 19559566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(A,(const PetscScalar**)&vv)); 19563a40ed3dSBarry Smith PetscFunctionReturn(0); 1957289bc588SBarry Smith } 1958289bc588SBarry Smith 1959e0877f53SBarry Smith static PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg) 1960289bc588SBarry Smith { 1961c0bbcb79SLois Curfman McInnes Mat_SeqDense *aij = (Mat_SeqDense*)A->data; 196267e560aaSBarry Smith 19633a40ed3dSBarry Smith PetscFunctionBegin; 1964b5a2b587SKris Buschelman switch (op) { 1965b5a2b587SKris Buschelman case MAT_ROW_ORIENTED: 19664e0d8c25SBarry Smith aij->roworiented = flg; 1967b5a2b587SKris Buschelman break; 1968512a5fc5SBarry Smith case MAT_NEW_NONZERO_LOCATIONS: 1969b5a2b587SKris Buschelman case MAT_NEW_NONZERO_LOCATION_ERR: 19703971808eSMatthew Knepley case MAT_NEW_NONZERO_ALLOCATION_ERR: 19718c78258cSHong Zhang case MAT_FORCE_DIAGONAL_ENTRIES: 197213fa8e87SLisandro Dalcin case MAT_KEEP_NONZERO_PATTERN: 1973b5a2b587SKris Buschelman case MAT_IGNORE_OFF_PROC_ENTRIES: 1974b5a2b587SKris Buschelman case MAT_USE_HASH_TABLE: 19750f8fb01aSBarry Smith case MAT_IGNORE_ZERO_ENTRIES: 19765021d80fSJed Brown case MAT_IGNORE_LOWER_TRIANGULAR: 1977071fcb05SBarry Smith case MAT_SORTED_FULL: 19789566063dSJacob Faibussowitsch PetscCall(PetscInfo(A,"Option %s ignored\n",MatOptions[op])); 19795021d80fSJed Brown break; 19805021d80fSJed Brown case MAT_SPD: 198177e54ba9SKris Buschelman case MAT_SYMMETRIC: 198277e54ba9SKris Buschelman case MAT_STRUCTURALLY_SYMMETRIC: 19839a4540c5SBarry Smith case MAT_HERMITIAN: 19849a4540c5SBarry Smith case MAT_SYMMETRY_ETERNAL: 19855021d80fSJed Brown /* These options are handled directly by MatSetOption() */ 198677e54ba9SKris Buschelman break; 1987b5a2b587SKris Buschelman default: 198898921bdaSJacob Faibussowitsch SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]); 19893a40ed3dSBarry Smith } 19903a40ed3dSBarry Smith PetscFunctionReturn(0); 1991289bc588SBarry Smith } 1992289bc588SBarry Smith 19933d8925e7SStefano Zampini PetscErrorCode MatZeroEntries_SeqDense(Mat A) 19946f0a148fSBarry Smith { 1995ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 19963d8925e7SStefano Zampini PetscInt lda=l->lda,m=A->rmap->n,n=A->cmap->n,j; 1997ca15aa20SStefano Zampini PetscScalar *v; 19983a40ed3dSBarry Smith 19993a40ed3dSBarry Smith PetscFunctionBegin; 20009566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayWrite(A,&v)); 2001a5ce6ee0Svictorle if (lda>m) { 20023d8925e7SStefano Zampini for (j=0; j<n; j++) { 20039566063dSJacob Faibussowitsch PetscCall(PetscArrayzero(v+j*lda,m)); 2004a5ce6ee0Svictorle } 2005a5ce6ee0Svictorle } else { 20069566063dSJacob Faibussowitsch PetscCall(PetscArrayzero(v,PetscInt64Mult(m,n))); 2007a5ce6ee0Svictorle } 20089566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayWrite(A,&v)); 20093a40ed3dSBarry Smith PetscFunctionReturn(0); 20106f0a148fSBarry Smith } 20116f0a148fSBarry Smith 2012e0877f53SBarry Smith static PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b) 20136f0a148fSBarry Smith { 2014ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 2015b9679d65SBarry Smith PetscInt m = l->lda, n = A->cmap->n, i,j; 2016ca15aa20SStefano Zampini PetscScalar *slot,*bb,*v; 201797b48c8fSBarry Smith const PetscScalar *xx; 201855659b69SBarry Smith 20193a40ed3dSBarry Smith PetscFunctionBegin; 202076bd3646SJed Brown if (PetscDefined(USE_DEBUG)) { 2021b9679d65SBarry Smith for (i=0; i<N; i++) { 20222c71b3e2SJacob Faibussowitsch PetscCheckFalse(rows[i] < 0,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed"); 20232c71b3e2SJacob Faibussowitsch PetscCheckFalse(rows[i] >= A->rmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row %" PetscInt_FMT " requested to be zeroed greater than or equal number of rows %" PetscInt_FMT,rows[i],A->rmap->n); 2024b9679d65SBarry Smith } 202576bd3646SJed Brown } 2026ca15aa20SStefano Zampini if (!N) PetscFunctionReturn(0); 2027b9679d65SBarry Smith 202897b48c8fSBarry Smith /* fix right hand side if needed */ 202997b48c8fSBarry Smith if (x && b) { 20309566063dSJacob Faibussowitsch PetscCall(VecGetArrayRead(x,&xx)); 20319566063dSJacob Faibussowitsch PetscCall(VecGetArray(b,&bb)); 20322205254eSKarl Rupp for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]]; 20339566063dSJacob Faibussowitsch PetscCall(VecRestoreArrayRead(x,&xx)); 20349566063dSJacob Faibussowitsch PetscCall(VecRestoreArray(b,&bb)); 203597b48c8fSBarry Smith } 203697b48c8fSBarry Smith 20379566063dSJacob Faibussowitsch PetscCall(MatDenseGetArray(A,&v)); 20386f0a148fSBarry Smith for (i=0; i<N; i++) { 2039ca15aa20SStefano Zampini slot = v + rows[i]; 2040b9679d65SBarry Smith for (j=0; j<n; j++) { *slot = 0.0; slot += m;} 20416f0a148fSBarry Smith } 2042f4df32b1SMatthew Knepley if (diag != 0.0) { 20432c71b3e2SJacob Faibussowitsch PetscCheckFalse(A->rmap->n != A->cmap->n,PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 20446f0a148fSBarry Smith for (i=0; i<N; i++) { 2045ca15aa20SStefano Zampini slot = v + (m+1)*rows[i]; 2046f4df32b1SMatthew Knepley *slot = diag; 20476f0a148fSBarry Smith } 20486f0a148fSBarry Smith } 20499566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArray(A,&v)); 20503a40ed3dSBarry Smith PetscFunctionReturn(0); 20516f0a148fSBarry Smith } 2052557bce09SLois Curfman McInnes 205349a6ff4bSBarry Smith static PetscErrorCode MatDenseGetLDA_SeqDense(Mat A,PetscInt *lda) 205449a6ff4bSBarry Smith { 205549a6ff4bSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 205649a6ff4bSBarry Smith 205749a6ff4bSBarry Smith PetscFunctionBegin; 205849a6ff4bSBarry Smith *lda = mat->lda; 205949a6ff4bSBarry Smith PetscFunctionReturn(0); 206049a6ff4bSBarry Smith } 206149a6ff4bSBarry Smith 2062637a0070SStefano Zampini PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar **array) 206364e87e97SBarry Smith { 2064c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 20653a40ed3dSBarry Smith 20663a40ed3dSBarry Smith PetscFunctionBegin; 206728b400f6SJacob Faibussowitsch PetscCheck(!mat->matinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first"); 206864e87e97SBarry Smith *array = mat->v; 20693a40ed3dSBarry Smith PetscFunctionReturn(0); 207064e87e97SBarry Smith } 20710754003eSLois Curfman McInnes 2072637a0070SStefano Zampini PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar **array) 2073ff14e315SSatish Balay { 20743a40ed3dSBarry Smith PetscFunctionBegin; 207575f6d85dSStefano Zampini if (array) *array = NULL; 20763a40ed3dSBarry Smith PetscFunctionReturn(0); 2077ff14e315SSatish Balay } 20780754003eSLois Curfman McInnes 20790f74d2c1SSatish Balay /*@ 208049a6ff4bSBarry Smith MatDenseGetLDA - gets the leading dimension of the array returned from MatDenseGetArray() 208149a6ff4bSBarry Smith 2082ad16ce7aSStefano Zampini Not collective 208349a6ff4bSBarry Smith 208449a6ff4bSBarry Smith Input Parameter: 208549a6ff4bSBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 208649a6ff4bSBarry Smith 208749a6ff4bSBarry Smith Output Parameter: 208849a6ff4bSBarry Smith . lda - the leading dimension 208949a6ff4bSBarry Smith 209049a6ff4bSBarry Smith Level: intermediate 209149a6ff4bSBarry Smith 2092ad16ce7aSStefano Zampini .seealso: MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead(), MatDenseSetLDA() 209349a6ff4bSBarry Smith @*/ 209449a6ff4bSBarry Smith PetscErrorCode MatDenseGetLDA(Mat A,PetscInt *lda) 209549a6ff4bSBarry Smith { 209649a6ff4bSBarry Smith PetscFunctionBegin; 2097d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 2098dadcf809SJacob Faibussowitsch PetscValidIntPointer(lda,2); 209975f6d85dSStefano Zampini MatCheckPreallocated(A,1); 2100cac4c232SBarry Smith PetscUseMethod(A,"MatDenseGetLDA_C",(Mat,PetscInt*),(A,lda)); 210149a6ff4bSBarry Smith PetscFunctionReturn(0); 210249a6ff4bSBarry Smith } 210349a6ff4bSBarry Smith 21040f74d2c1SSatish Balay /*@ 2105ad16ce7aSStefano Zampini MatDenseSetLDA - Sets the leading dimension of the array used by the dense matrix 2106ad16ce7aSStefano Zampini 2107ad16ce7aSStefano Zampini Not collective 2108ad16ce7aSStefano Zampini 2109d8d19677SJose E. Roman Input Parameters: 2110ad16ce7aSStefano Zampini + mat - a MATSEQDENSE or MATMPIDENSE matrix 2111ad16ce7aSStefano Zampini - lda - the leading dimension 2112ad16ce7aSStefano Zampini 2113ad16ce7aSStefano Zampini Level: intermediate 2114ad16ce7aSStefano Zampini 2115ad16ce7aSStefano Zampini .seealso: MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead(), MatDenseGetLDA() 2116ad16ce7aSStefano Zampini @*/ 2117ad16ce7aSStefano Zampini PetscErrorCode MatDenseSetLDA(Mat A,PetscInt lda) 2118ad16ce7aSStefano Zampini { 2119ad16ce7aSStefano Zampini PetscFunctionBegin; 2120ad16ce7aSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 2121cac4c232SBarry Smith PetscTryMethod(A,"MatDenseSetLDA_C",(Mat,PetscInt),(A,lda)); 2122ad16ce7aSStefano Zampini PetscFunctionReturn(0); 2123ad16ce7aSStefano Zampini } 2124ad16ce7aSStefano Zampini 2125ad16ce7aSStefano Zampini /*@C 21266947451fSStefano Zampini MatDenseGetArray - gives read-write access to the array where the data for a dense matrix is stored 212773a71a0fSBarry Smith 21288572280aSBarry Smith Logically Collective on Mat 212973a71a0fSBarry Smith 213073a71a0fSBarry Smith Input Parameter: 21316947451fSStefano Zampini . mat - a dense matrix 213273a71a0fSBarry Smith 213373a71a0fSBarry Smith Output Parameter: 213473a71a0fSBarry Smith . array - pointer to the data 213573a71a0fSBarry Smith 213673a71a0fSBarry Smith Level: intermediate 213773a71a0fSBarry Smith 21386947451fSStefano Zampini .seealso: MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead(), MatDenseGetArrayWrite(), MatDenseRestoreArrayWrite() 213973a71a0fSBarry Smith @*/ 21408c778c55SBarry Smith PetscErrorCode MatDenseGetArray(Mat A,PetscScalar **array) 214173a71a0fSBarry Smith { 214273a71a0fSBarry Smith PetscFunctionBegin; 2143d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 2144d5ea218eSStefano Zampini PetscValidPointer(array,2); 2145cac4c232SBarry Smith PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array)); 214673a71a0fSBarry Smith PetscFunctionReturn(0); 214773a71a0fSBarry Smith } 214873a71a0fSBarry Smith 2149dec5eb66SMatthew G Knepley /*@C 2150579dbff0SBarry Smith MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray() 215173a71a0fSBarry Smith 21528572280aSBarry Smith Logically Collective on Mat 21538572280aSBarry Smith 21548572280aSBarry Smith Input Parameters: 21556947451fSStefano Zampini + mat - a dense matrix 2156a2b725a8SWilliam Gropp - array - pointer to the data 21578572280aSBarry Smith 21588572280aSBarry Smith Level: intermediate 21598572280aSBarry Smith 21606947451fSStefano Zampini .seealso: MatDenseGetArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead(), MatDenseGetArrayWrite(), MatDenseRestoreArrayWrite() 21618572280aSBarry Smith @*/ 21628572280aSBarry Smith PetscErrorCode MatDenseRestoreArray(Mat A,PetscScalar **array) 21638572280aSBarry Smith { 21648572280aSBarry Smith PetscFunctionBegin; 2165d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 2166d5ea218eSStefano Zampini PetscValidPointer(array,2); 2167cac4c232SBarry Smith PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array)); 21689566063dSJacob Faibussowitsch PetscCall(PetscObjectStateIncrease((PetscObject)A)); 2169637a0070SStefano Zampini #if defined(PETSC_HAVE_CUDA) 2170637a0070SStefano Zampini A->offloadmask = PETSC_OFFLOAD_CPU; 2171637a0070SStefano Zampini #endif 21728572280aSBarry Smith PetscFunctionReturn(0); 21738572280aSBarry Smith } 21748572280aSBarry Smith 21758572280aSBarry Smith /*@C 21766947451fSStefano Zampini MatDenseGetArrayRead - gives read-only access to the array where the data for a dense matrix is stored 21778572280aSBarry Smith 21788572280aSBarry Smith Not Collective 21798572280aSBarry Smith 21808572280aSBarry Smith Input Parameter: 21816947451fSStefano Zampini . mat - a dense matrix 21828572280aSBarry Smith 21838572280aSBarry Smith Output Parameter: 21848572280aSBarry Smith . array - pointer to the data 21858572280aSBarry Smith 21868572280aSBarry Smith Level: intermediate 21878572280aSBarry Smith 21886947451fSStefano Zampini .seealso: MatDenseRestoreArrayRead(), MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayWrite(), MatDenseRestoreArrayWrite() 21898572280aSBarry Smith @*/ 21908572280aSBarry Smith PetscErrorCode MatDenseGetArrayRead(Mat A,const PetscScalar **array) 21918572280aSBarry Smith { 21928572280aSBarry Smith PetscFunctionBegin; 2193d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 2194d5ea218eSStefano Zampini PetscValidPointer(array,2); 2195cac4c232SBarry Smith PetscUseMethod(A,"MatDenseGetArrayRead_C",(Mat,const PetscScalar**),(A,array)); 21968572280aSBarry Smith PetscFunctionReturn(0); 21978572280aSBarry Smith } 21988572280aSBarry Smith 21998572280aSBarry Smith /*@C 22006947451fSStefano Zampini MatDenseRestoreArrayRead - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArrayRead() 22018572280aSBarry Smith 220273a71a0fSBarry Smith Not Collective 220373a71a0fSBarry Smith 220473a71a0fSBarry Smith Input Parameters: 22056947451fSStefano Zampini + mat - a dense matrix 2206a2b725a8SWilliam Gropp - array - pointer to the data 220773a71a0fSBarry Smith 220873a71a0fSBarry Smith Level: intermediate 220973a71a0fSBarry Smith 22106947451fSStefano Zampini .seealso: MatDenseGetArrayRead(), MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayWrite(), MatDenseRestoreArrayWrite() 221173a71a0fSBarry Smith @*/ 22128572280aSBarry Smith PetscErrorCode MatDenseRestoreArrayRead(Mat A,const PetscScalar **array) 221373a71a0fSBarry Smith { 221473a71a0fSBarry Smith PetscFunctionBegin; 2215d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 2216d5ea218eSStefano Zampini PetscValidPointer(array,2); 2217cac4c232SBarry Smith PetscUseMethod(A,"MatDenseRestoreArrayRead_C",(Mat,const PetscScalar**),(A,array)); 221873a71a0fSBarry Smith PetscFunctionReturn(0); 221973a71a0fSBarry Smith } 222073a71a0fSBarry Smith 22216947451fSStefano Zampini /*@C 22226947451fSStefano Zampini MatDenseGetArrayWrite - gives write-only access to the array where the data for a dense matrix is stored 22236947451fSStefano Zampini 22246947451fSStefano Zampini Not Collective 22256947451fSStefano Zampini 22266947451fSStefano Zampini Input Parameter: 22276947451fSStefano Zampini . mat - a dense matrix 22286947451fSStefano Zampini 22296947451fSStefano Zampini Output Parameter: 22306947451fSStefano Zampini . array - pointer to the data 22316947451fSStefano Zampini 22326947451fSStefano Zampini Level: intermediate 22336947451fSStefano Zampini 22346947451fSStefano Zampini .seealso: MatDenseRestoreArrayWrite(), MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead() 22356947451fSStefano Zampini @*/ 22366947451fSStefano Zampini PetscErrorCode MatDenseGetArrayWrite(Mat A,PetscScalar **array) 22376947451fSStefano Zampini { 22386947451fSStefano Zampini PetscFunctionBegin; 2239d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 2240d5ea218eSStefano Zampini PetscValidPointer(array,2); 2241cac4c232SBarry Smith PetscUseMethod(A,"MatDenseGetArrayWrite_C",(Mat,PetscScalar**),(A,array)); 22426947451fSStefano Zampini PetscFunctionReturn(0); 22436947451fSStefano Zampini } 22446947451fSStefano Zampini 22456947451fSStefano Zampini /*@C 22466947451fSStefano Zampini MatDenseRestoreArrayWrite - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArrayWrite() 22476947451fSStefano Zampini 22486947451fSStefano Zampini Not Collective 22496947451fSStefano Zampini 22506947451fSStefano Zampini Input Parameters: 22516947451fSStefano Zampini + mat - a dense matrix 22526947451fSStefano Zampini - array - pointer to the data 22536947451fSStefano Zampini 22546947451fSStefano Zampini Level: intermediate 22556947451fSStefano Zampini 22566947451fSStefano Zampini .seealso: MatDenseGetArrayWrite(), MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead() 22576947451fSStefano Zampini @*/ 22586947451fSStefano Zampini PetscErrorCode MatDenseRestoreArrayWrite(Mat A,PetscScalar **array) 22596947451fSStefano Zampini { 22606947451fSStefano Zampini PetscFunctionBegin; 2261d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 2262d5ea218eSStefano Zampini PetscValidPointer(array,2); 2263cac4c232SBarry Smith PetscUseMethod(A,"MatDenseRestoreArrayWrite_C",(Mat,PetscScalar**),(A,array)); 22649566063dSJacob Faibussowitsch PetscCall(PetscObjectStateIncrease((PetscObject)A)); 22656947451fSStefano Zampini #if defined(PETSC_HAVE_CUDA) 22666947451fSStefano Zampini A->offloadmask = PETSC_OFFLOAD_CPU; 22676947451fSStefano Zampini #endif 22686947451fSStefano Zampini PetscFunctionReturn(0); 22696947451fSStefano Zampini } 22706947451fSStefano Zampini 2271023c16fcSToby Isaac static PetscErrorCode MatCreateSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,MatReuse scall,Mat *B) 22720754003eSLois Curfman McInnes { 2273c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 2274bf5a80bcSToby Isaac PetscInt i,j,nrows,ncols,ldb; 22755d0c19d7SBarry Smith const PetscInt *irow,*icol; 227687828ca2SBarry Smith PetscScalar *av,*bv,*v = mat->v; 22770754003eSLois Curfman McInnes Mat newmat; 22780754003eSLois Curfman McInnes 22793a40ed3dSBarry Smith PetscFunctionBegin; 22809566063dSJacob Faibussowitsch PetscCall(ISGetIndices(isrow,&irow)); 22819566063dSJacob Faibussowitsch PetscCall(ISGetIndices(iscol,&icol)); 22829566063dSJacob Faibussowitsch PetscCall(ISGetLocalSize(isrow,&nrows)); 22839566063dSJacob Faibussowitsch PetscCall(ISGetLocalSize(iscol,&ncols)); 22840754003eSLois Curfman McInnes 2285182d2002SSatish Balay /* Check submatrixcall */ 2286182d2002SSatish Balay if (scall == MAT_REUSE_MATRIX) { 228713f74950SBarry Smith PetscInt n_cols,n_rows; 22889566063dSJacob Faibussowitsch PetscCall(MatGetSize(*B,&n_rows,&n_cols)); 228921a2c019SBarry Smith if (n_rows != nrows || n_cols != ncols) { 2290f746d493SDmitry Karpeev /* resize the result matrix to match number of requested rows/columns */ 22919566063dSJacob Faibussowitsch PetscCall(MatSetSizes(*B,nrows,ncols,nrows,ncols)); 229221a2c019SBarry Smith } 2293182d2002SSatish Balay newmat = *B; 2294182d2002SSatish Balay } else { 22950754003eSLois Curfman McInnes /* Create and fill new matrix */ 22969566063dSJacob Faibussowitsch PetscCall(MatCreate(PetscObjectComm((PetscObject)A),&newmat)); 22979566063dSJacob Faibussowitsch PetscCall(MatSetSizes(newmat,nrows,ncols,nrows,ncols)); 22989566063dSJacob Faibussowitsch PetscCall(MatSetType(newmat,((PetscObject)A)->type_name)); 22999566063dSJacob Faibussowitsch PetscCall(MatSeqDenseSetPreallocation(newmat,NULL)); 2300182d2002SSatish Balay } 2301182d2002SSatish Balay 2302182d2002SSatish Balay /* Now extract the data pointers and do the copy,column at a time */ 23039566063dSJacob Faibussowitsch PetscCall(MatDenseGetArray(newmat,&bv)); 23049566063dSJacob Faibussowitsch PetscCall(MatDenseGetLDA(newmat,&ldb)); 2305182d2002SSatish Balay for (i=0; i<ncols; i++) { 23066de62eeeSBarry Smith av = v + mat->lda*icol[i]; 2307ca15aa20SStefano Zampini for (j=0; j<nrows; j++) bv[j] = av[irow[j]]; 2308bf5a80bcSToby Isaac bv += ldb; 23090754003eSLois Curfman McInnes } 23109566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArray(newmat,&bv)); 2311182d2002SSatish Balay 2312182d2002SSatish Balay /* Assemble the matrices so that the correct flags are set */ 23139566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY)); 23149566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY)); 23150754003eSLois Curfman McInnes 23160754003eSLois Curfman McInnes /* Free work space */ 23179566063dSJacob Faibussowitsch PetscCall(ISRestoreIndices(isrow,&irow)); 23189566063dSJacob Faibussowitsch PetscCall(ISRestoreIndices(iscol,&icol)); 2319182d2002SSatish Balay *B = newmat; 23203a40ed3dSBarry Smith PetscFunctionReturn(0); 23210754003eSLois Curfman McInnes } 23220754003eSLois Curfman McInnes 23237dae84e0SHong Zhang static PetscErrorCode MatCreateSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[]) 2324905e6a2fSBarry Smith { 232513f74950SBarry Smith PetscInt i; 2326905e6a2fSBarry Smith 23273a40ed3dSBarry Smith PetscFunctionBegin; 2328905e6a2fSBarry Smith if (scall == MAT_INITIAL_MATRIX) { 23299566063dSJacob Faibussowitsch PetscCall(PetscCalloc1(n,B)); 2330905e6a2fSBarry Smith } 2331905e6a2fSBarry Smith 2332905e6a2fSBarry Smith for (i=0; i<n; i++) { 23339566063dSJacob Faibussowitsch PetscCall(MatCreateSubMatrix_SeqDense(A,irow[i],icol[i],scall,&(*B)[i])); 2334905e6a2fSBarry Smith } 23353a40ed3dSBarry Smith PetscFunctionReturn(0); 2336905e6a2fSBarry Smith } 2337905e6a2fSBarry Smith 2338e0877f53SBarry Smith static PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode) 2339c0aa2d19SHong Zhang { 2340c0aa2d19SHong Zhang PetscFunctionBegin; 2341c0aa2d19SHong Zhang PetscFunctionReturn(0); 2342c0aa2d19SHong Zhang } 2343c0aa2d19SHong Zhang 2344e0877f53SBarry Smith static PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode) 2345c0aa2d19SHong Zhang { 2346c0aa2d19SHong Zhang PetscFunctionBegin; 2347c0aa2d19SHong Zhang PetscFunctionReturn(0); 2348c0aa2d19SHong Zhang } 2349c0aa2d19SHong Zhang 2350a76f77c3SStefano Zampini PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str) 23514b0e389bSBarry Smith { 23524b0e389bSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data; 2353ca15aa20SStefano Zampini const PetscScalar *va; 2354ca15aa20SStefano Zampini PetscScalar *vb; 2355d0f46423SBarry Smith PetscInt lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j; 23563a40ed3dSBarry Smith 23573a40ed3dSBarry Smith PetscFunctionBegin; 235833f4a19fSKris Buschelman /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */ 235933f4a19fSKris Buschelman if (A->ops->copy != B->ops->copy) { 23609566063dSJacob Faibussowitsch PetscCall(MatCopy_Basic(A,B,str)); 23613a40ed3dSBarry Smith PetscFunctionReturn(0); 23623a40ed3dSBarry Smith } 23632c71b3e2SJacob Faibussowitsch PetscCheckFalse(m != B->rmap->n || n != B->cmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)"); 23649566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(A,&va)); 23659566063dSJacob Faibussowitsch PetscCall(MatDenseGetArray(B,&vb)); 2366a5ce6ee0Svictorle if (lda1>m || lda2>m) { 23670dbb7854Svictorle for (j=0; j<n; j++) { 23689566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(vb+j*lda2,va+j*lda1,m)); 2369a5ce6ee0Svictorle } 2370a5ce6ee0Svictorle } else { 23719566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(vb,va,A->rmap->n*A->cmap->n)); 2372a5ce6ee0Svictorle } 23739566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArray(B,&vb)); 23749566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(A,&va)); 23759566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY)); 23769566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY)); 2377273d9f13SBarry Smith PetscFunctionReturn(0); 2378273d9f13SBarry Smith } 2379273d9f13SBarry Smith 238075f6d85dSStefano Zampini PetscErrorCode MatSetUp_SeqDense(Mat A) 2381273d9f13SBarry Smith { 2382273d9f13SBarry Smith PetscFunctionBegin; 23839566063dSJacob Faibussowitsch PetscCall(PetscLayoutSetUp(A->rmap)); 23849566063dSJacob Faibussowitsch PetscCall(PetscLayoutSetUp(A->cmap)); 238518992e5dSStefano Zampini if (!A->preallocated) { 23869566063dSJacob Faibussowitsch PetscCall(MatSeqDenseSetPreallocation(A,NULL)); 238718992e5dSStefano Zampini } 23883a40ed3dSBarry Smith PetscFunctionReturn(0); 23894b0e389bSBarry Smith } 23904b0e389bSBarry Smith 2391ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A) 2392ba337c44SJed Brown { 23934396437dSToby Isaac Mat_SeqDense *mat = (Mat_SeqDense *) A->data; 239406c5243aSJose E. Roman PetscInt i,j; 23954396437dSToby Isaac PetscInt min = PetscMin(A->rmap->n,A->cmap->n); 2396ca15aa20SStefano Zampini PetscScalar *aa; 2397ba337c44SJed Brown 2398ba337c44SJed Brown PetscFunctionBegin; 23999566063dSJacob Faibussowitsch PetscCall(MatDenseGetArray(A,&aa)); 240006c5243aSJose E. Roman for (j=0; j<A->cmap->n; j++) { 240106c5243aSJose E. Roman for (i=0; i<A->rmap->n; i++) aa[i+j*mat->lda] = PetscConj(aa[i+j*mat->lda]); 240206c5243aSJose E. Roman } 24039566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArray(A,&aa)); 24044396437dSToby Isaac if (mat->tau) for (i = 0; i < min; i++) mat->tau[i] = PetscConj(mat->tau[i]); 2405ba337c44SJed Brown PetscFunctionReturn(0); 2406ba337c44SJed Brown } 2407ba337c44SJed Brown 2408ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A) 2409ba337c44SJed Brown { 241006c5243aSJose E. Roman Mat_SeqDense *mat = (Mat_SeqDense *) A->data; 241106c5243aSJose E. Roman PetscInt i,j; 2412ca15aa20SStefano Zampini PetscScalar *aa; 2413ba337c44SJed Brown 2414ba337c44SJed Brown PetscFunctionBegin; 24159566063dSJacob Faibussowitsch PetscCall(MatDenseGetArray(A,&aa)); 241606c5243aSJose E. Roman for (j=0; j<A->cmap->n; j++) { 241706c5243aSJose E. Roman for (i=0; i<A->rmap->n; i++) aa[i+j*mat->lda] = PetscRealPart(aa[i+j*mat->lda]); 241806c5243aSJose E. Roman } 24199566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArray(A,&aa)); 2420ba337c44SJed Brown PetscFunctionReturn(0); 2421ba337c44SJed Brown } 2422ba337c44SJed Brown 2423ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A) 2424ba337c44SJed Brown { 242506c5243aSJose E. Roman Mat_SeqDense *mat = (Mat_SeqDense *) A->data; 242606c5243aSJose E. Roman PetscInt i,j; 2427ca15aa20SStefano Zampini PetscScalar *aa; 2428ba337c44SJed Brown 2429ba337c44SJed Brown PetscFunctionBegin; 24309566063dSJacob Faibussowitsch PetscCall(MatDenseGetArray(A,&aa)); 243106c5243aSJose E. Roman for (j=0; j<A->cmap->n; j++) { 243206c5243aSJose E. Roman for (i=0; i<A->rmap->n; i++) aa[i+j*mat->lda] = PetscImaginaryPart(aa[i+j*mat->lda]); 243306c5243aSJose E. Roman } 24349566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArray(A,&aa)); 2435ba337c44SJed Brown PetscFunctionReturn(0); 2436ba337c44SJed Brown } 2437284134d9SBarry Smith 2438a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/ 24394222ddf1SHong Zhang PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat C) 2440a9fe9ddaSSatish Balay { 2441d0f46423SBarry Smith PetscInt m=A->rmap->n,n=B->cmap->n; 24427a3c3d58SStefano Zampini PetscBool cisdense; 2443a9fe9ddaSSatish Balay 2444ee16a9a1SHong Zhang PetscFunctionBegin; 24459566063dSJacob Faibussowitsch PetscCall(MatSetSizes(C,m,n,m,n)); 24469566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompareAny((PetscObject)C,&cisdense,MATSEQDENSE,MATSEQDENSECUDA,"")); 24477a3c3d58SStefano Zampini if (!cisdense) { 24487a3c3d58SStefano Zampini PetscBool flg; 24497a3c3d58SStefano Zampini 24509566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)B,((PetscObject)A)->type_name,&flg)); 24519566063dSJacob Faibussowitsch PetscCall(MatSetType(C,flg ? ((PetscObject)A)->type_name : MATDENSE)); 24527a3c3d58SStefano Zampini } 24539566063dSJacob Faibussowitsch PetscCall(MatSetUp(C)); 2454ee16a9a1SHong Zhang PetscFunctionReturn(0); 2455ee16a9a1SHong Zhang } 2456a9fe9ddaSSatish Balay 2457a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 2458a9fe9ddaSSatish Balay { 24596718818eSStefano Zampini Mat_SeqDense *a=(Mat_SeqDense*)A->data,*b=(Mat_SeqDense*)B->data,*c=(Mat_SeqDense*)C->data; 24600805154bSBarry Smith PetscBLASInt m,n,k; 2461ca15aa20SStefano Zampini const PetscScalar *av,*bv; 2462ca15aa20SStefano Zampini PetscScalar *cv; 2463a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 2464a9fe9ddaSSatish Balay 2465a9fe9ddaSSatish Balay PetscFunctionBegin; 24669566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(C->rmap->n,&m)); 24679566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(C->cmap->n,&n)); 24689566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(A->cmap->n,&k)); 246949d0e964SStefano Zampini if (!m || !n || !k) PetscFunctionReturn(0); 24709566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(A,&av)); 24719566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(B,&bv)); 24729566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayWrite(C,&cv)); 2473ca15aa20SStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("N","N",&m,&n,&k,&_DOne,av,&a->lda,bv,&b->lda,&_DZero,cv,&c->lda)); 24749566063dSJacob Faibussowitsch PetscCall(PetscLogFlops(1.0*m*n*k + 1.0*m*n*(k-1))); 24759566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(A,&av)); 24769566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(B,&bv)); 24779566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayWrite(C,&cv)); 2478a9fe9ddaSSatish Balay PetscFunctionReturn(0); 2479a9fe9ddaSSatish Balay } 2480a9fe9ddaSSatish Balay 24814222ddf1SHong Zhang PetscErrorCode MatMatTransposeMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat C) 248269f65d41SStefano Zampini { 248369f65d41SStefano Zampini PetscInt m=A->rmap->n,n=B->rmap->n; 24847a3c3d58SStefano Zampini PetscBool cisdense; 248569f65d41SStefano Zampini 248669f65d41SStefano Zampini PetscFunctionBegin; 24879566063dSJacob Faibussowitsch PetscCall(MatSetSizes(C,m,n,m,n)); 24889566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompareAny((PetscObject)C,&cisdense,MATSEQDENSE,MATSEQDENSECUDA,"")); 24897a3c3d58SStefano Zampini if (!cisdense) { 24907a3c3d58SStefano Zampini PetscBool flg; 24917a3c3d58SStefano Zampini 24929566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)B,((PetscObject)A)->type_name,&flg)); 24939566063dSJacob Faibussowitsch PetscCall(MatSetType(C,flg ? ((PetscObject)A)->type_name : MATDENSE)); 24947a3c3d58SStefano Zampini } 24959566063dSJacob Faibussowitsch PetscCall(MatSetUp(C)); 249669f65d41SStefano Zampini PetscFunctionReturn(0); 249769f65d41SStefano Zampini } 249869f65d41SStefano Zampini 249969f65d41SStefano Zampini PetscErrorCode MatMatTransposeMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 250069f65d41SStefano Zampini { 250169f65d41SStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 250269f65d41SStefano Zampini Mat_SeqDense *b = (Mat_SeqDense*)B->data; 250369f65d41SStefano Zampini Mat_SeqDense *c = (Mat_SeqDense*)C->data; 25046718818eSStefano Zampini const PetscScalar *av,*bv; 25056718818eSStefano Zampini PetscScalar *cv; 250669f65d41SStefano Zampini PetscBLASInt m,n,k; 250769f65d41SStefano Zampini PetscScalar _DOne=1.0,_DZero=0.0; 250869f65d41SStefano Zampini 250969f65d41SStefano Zampini PetscFunctionBegin; 25109566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(C->rmap->n,&m)); 25119566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(C->cmap->n,&n)); 25129566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(A->cmap->n,&k)); 251349d0e964SStefano Zampini if (!m || !n || !k) PetscFunctionReturn(0); 25149566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(A,&av)); 25159566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(B,&bv)); 25169566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayWrite(C,&cv)); 25176718818eSStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("N","T",&m,&n,&k,&_DOne,av,&a->lda,bv,&b->lda,&_DZero,cv,&c->lda)); 25189566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(A,&av)); 25199566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(B,&bv)); 25209566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayWrite(C,&cv)); 25219566063dSJacob Faibussowitsch PetscCall(PetscLogFlops(1.0*m*n*k + 1.0*m*n*(k-1))); 252269f65d41SStefano Zampini PetscFunctionReturn(0); 252369f65d41SStefano Zampini } 252469f65d41SStefano Zampini 25254222ddf1SHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat C) 2526a9fe9ddaSSatish Balay { 2527d0f46423SBarry Smith PetscInt m=A->cmap->n,n=B->cmap->n; 25287a3c3d58SStefano Zampini PetscBool cisdense; 2529a9fe9ddaSSatish Balay 2530ee16a9a1SHong Zhang PetscFunctionBegin; 25319566063dSJacob Faibussowitsch PetscCall(MatSetSizes(C,m,n,m,n)); 25329566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompareAny((PetscObject)C,&cisdense,MATSEQDENSE,MATSEQDENSECUDA,"")); 25337a3c3d58SStefano Zampini if (!cisdense) { 25347a3c3d58SStefano Zampini PetscBool flg; 25357a3c3d58SStefano Zampini 25369566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)B,((PetscObject)A)->type_name,&flg)); 25379566063dSJacob Faibussowitsch PetscCall(MatSetType(C,flg ? ((PetscObject)A)->type_name : MATDENSE)); 25387a3c3d58SStefano Zampini } 25399566063dSJacob Faibussowitsch PetscCall(MatSetUp(C)); 2540ee16a9a1SHong Zhang PetscFunctionReturn(0); 2541ee16a9a1SHong Zhang } 2542a9fe9ddaSSatish Balay 254375648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 2544a9fe9ddaSSatish Balay { 2545a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2546a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 2547a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 25486718818eSStefano Zampini const PetscScalar *av,*bv; 25496718818eSStefano Zampini PetscScalar *cv; 25500805154bSBarry Smith PetscBLASInt m,n,k; 2551a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 2552a9fe9ddaSSatish Balay 2553a9fe9ddaSSatish Balay PetscFunctionBegin; 25549566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(C->rmap->n,&m)); 25559566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(C->cmap->n,&n)); 25569566063dSJacob Faibussowitsch PetscCall(PetscBLASIntCast(A->rmap->n,&k)); 255749d0e964SStefano Zampini if (!m || !n || !k) PetscFunctionReturn(0); 25589566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(A,&av)); 25599566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(B,&bv)); 25609566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayWrite(C,&cv)); 25616718818eSStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("T","N",&m,&n,&k,&_DOne,av,&a->lda,bv,&b->lda,&_DZero,cv,&c->lda)); 25629566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(A,&av)); 25639566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(B,&bv)); 25649566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayWrite(C,&cv)); 25659566063dSJacob Faibussowitsch PetscCall(PetscLogFlops(1.0*m*n*k + 1.0*m*n*(k-1))); 2566a9fe9ddaSSatish Balay PetscFunctionReturn(0); 2567a9fe9ddaSSatish Balay } 2568985db425SBarry Smith 25694222ddf1SHong Zhang /* ----------------------------------------------- */ 25704222ddf1SHong Zhang static PetscErrorCode MatProductSetFromOptions_SeqDense_AB(Mat C) 25714222ddf1SHong Zhang { 25724222ddf1SHong Zhang PetscFunctionBegin; 25734222ddf1SHong Zhang C->ops->matmultsymbolic = MatMatMultSymbolic_SeqDense_SeqDense; 25744222ddf1SHong Zhang C->ops->productsymbolic = MatProductSymbolic_AB; 25754222ddf1SHong Zhang PetscFunctionReturn(0); 25764222ddf1SHong Zhang } 25774222ddf1SHong Zhang 25784222ddf1SHong Zhang static PetscErrorCode MatProductSetFromOptions_SeqDense_AtB(Mat C) 25794222ddf1SHong Zhang { 25804222ddf1SHong Zhang PetscFunctionBegin; 25814222ddf1SHong Zhang C->ops->transposematmultsymbolic = MatTransposeMatMultSymbolic_SeqDense_SeqDense; 25824222ddf1SHong Zhang C->ops->productsymbolic = MatProductSymbolic_AtB; 25834222ddf1SHong Zhang PetscFunctionReturn(0); 25844222ddf1SHong Zhang } 25854222ddf1SHong Zhang 25864222ddf1SHong Zhang static PetscErrorCode MatProductSetFromOptions_SeqDense_ABt(Mat C) 25874222ddf1SHong Zhang { 25884222ddf1SHong Zhang PetscFunctionBegin; 25894222ddf1SHong Zhang C->ops->mattransposemultsymbolic = MatMatTransposeMultSymbolic_SeqDense_SeqDense; 25904222ddf1SHong Zhang C->ops->productsymbolic = MatProductSymbolic_ABt; 25914222ddf1SHong Zhang PetscFunctionReturn(0); 25924222ddf1SHong Zhang } 25934222ddf1SHong Zhang 25944222ddf1SHong Zhang PETSC_INTERN PetscErrorCode MatProductSetFromOptions_SeqDense(Mat C) 25954222ddf1SHong Zhang { 25964222ddf1SHong Zhang Mat_Product *product = C->product; 25974222ddf1SHong Zhang 25984222ddf1SHong Zhang PetscFunctionBegin; 25994222ddf1SHong Zhang switch (product->type) { 26004222ddf1SHong Zhang case MATPRODUCT_AB: 26019566063dSJacob Faibussowitsch PetscCall(MatProductSetFromOptions_SeqDense_AB(C)); 26024222ddf1SHong Zhang break; 26034222ddf1SHong Zhang case MATPRODUCT_AtB: 26049566063dSJacob Faibussowitsch PetscCall(MatProductSetFromOptions_SeqDense_AtB(C)); 26054222ddf1SHong Zhang break; 26064222ddf1SHong Zhang case MATPRODUCT_ABt: 26079566063dSJacob Faibussowitsch PetscCall(MatProductSetFromOptions_SeqDense_ABt(C)); 26084222ddf1SHong Zhang break; 26096718818eSStefano Zampini default: 26104222ddf1SHong Zhang break; 26114222ddf1SHong Zhang } 26124222ddf1SHong Zhang PetscFunctionReturn(0); 26134222ddf1SHong Zhang } 26144222ddf1SHong Zhang /* ----------------------------------------------- */ 26154222ddf1SHong Zhang 2616e0877f53SBarry Smith static PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[]) 2617985db425SBarry Smith { 2618985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2619d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 2620985db425SBarry Smith PetscScalar *x; 2621ca15aa20SStefano Zampini const PetscScalar *aa; 2622985db425SBarry Smith 2623985db425SBarry Smith PetscFunctionBegin; 262428b400f6SJacob Faibussowitsch PetscCheck(!A->factortype,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 26259566063dSJacob Faibussowitsch PetscCall(VecGetArray(v,&x)); 26269566063dSJacob Faibussowitsch PetscCall(VecGetLocalSize(v,&p)); 26279566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(A,&aa)); 26282c71b3e2SJacob Faibussowitsch PetscCheckFalse(p != A->rmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2629985db425SBarry Smith for (i=0; i<m; i++) { 2630985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 2631985db425SBarry Smith for (j=1; j<n; j++) { 2632ca15aa20SStefano Zampini if (PetscRealPart(x[i]) < PetscRealPart(aa[i+a->lda*j])) {x[i] = aa[i + a->lda*j]; if (idx) idx[i] = j;} 2633985db425SBarry Smith } 2634985db425SBarry Smith } 26359566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(A,&aa)); 26369566063dSJacob Faibussowitsch PetscCall(VecRestoreArray(v,&x)); 2637985db425SBarry Smith PetscFunctionReturn(0); 2638985db425SBarry Smith } 2639985db425SBarry Smith 2640e0877f53SBarry Smith static PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[]) 2641985db425SBarry Smith { 2642985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2643d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 2644985db425SBarry Smith PetscScalar *x; 2645985db425SBarry Smith PetscReal atmp; 2646ca15aa20SStefano Zampini const PetscScalar *aa; 2647985db425SBarry Smith 2648985db425SBarry Smith PetscFunctionBegin; 264928b400f6SJacob Faibussowitsch PetscCheck(!A->factortype,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 26509566063dSJacob Faibussowitsch PetscCall(VecGetArray(v,&x)); 26519566063dSJacob Faibussowitsch PetscCall(VecGetLocalSize(v,&p)); 26529566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(A,&aa)); 26532c71b3e2SJacob Faibussowitsch PetscCheckFalse(p != A->rmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2654985db425SBarry Smith for (i=0; i<m; i++) { 26559189402eSHong Zhang x[i] = PetscAbsScalar(aa[i]); 2656985db425SBarry Smith for (j=1; j<n; j++) { 2657ca15aa20SStefano Zampini atmp = PetscAbsScalar(aa[i+a->lda*j]); 2658985db425SBarry Smith if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;} 2659985db425SBarry Smith } 2660985db425SBarry Smith } 26619566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(A,&aa)); 26629566063dSJacob Faibussowitsch PetscCall(VecRestoreArray(v,&x)); 2663985db425SBarry Smith PetscFunctionReturn(0); 2664985db425SBarry Smith } 2665985db425SBarry Smith 2666e0877f53SBarry Smith static PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[]) 2667985db425SBarry Smith { 2668985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2669d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 2670985db425SBarry Smith PetscScalar *x; 2671ca15aa20SStefano Zampini const PetscScalar *aa; 2672985db425SBarry Smith 2673985db425SBarry Smith PetscFunctionBegin; 267428b400f6SJacob Faibussowitsch PetscCheck(!A->factortype,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 26759566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(A,&aa)); 26769566063dSJacob Faibussowitsch PetscCall(VecGetArray(v,&x)); 26779566063dSJacob Faibussowitsch PetscCall(VecGetLocalSize(v,&p)); 26782c71b3e2SJacob Faibussowitsch PetscCheckFalse(p != A->rmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2679985db425SBarry Smith for (i=0; i<m; i++) { 2680985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 2681985db425SBarry Smith for (j=1; j<n; j++) { 2682ca15aa20SStefano Zampini if (PetscRealPart(x[i]) > PetscRealPart(aa[i+a->lda*j])) {x[i] = aa[i + a->lda*j]; if (idx) idx[i] = j;} 2683985db425SBarry Smith } 2684985db425SBarry Smith } 26859566063dSJacob Faibussowitsch PetscCall(VecRestoreArray(v,&x)); 26869566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(A,&aa)); 2687985db425SBarry Smith PetscFunctionReturn(0); 2688985db425SBarry Smith } 2689985db425SBarry Smith 2690637a0070SStefano Zampini PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col) 26918d0534beSBarry Smith { 26928d0534beSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 26938d0534beSBarry Smith PetscScalar *x; 2694ca15aa20SStefano Zampini const PetscScalar *aa; 26958d0534beSBarry Smith 26968d0534beSBarry Smith PetscFunctionBegin; 269728b400f6SJacob Faibussowitsch PetscCheck(!A->factortype,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 26989566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(A,&aa)); 26999566063dSJacob Faibussowitsch PetscCall(VecGetArray(v,&x)); 27009566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(x,aa+col*a->lda,A->rmap->n)); 27019566063dSJacob Faibussowitsch PetscCall(VecRestoreArray(v,&x)); 27029566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(A,&aa)); 27038d0534beSBarry Smith PetscFunctionReturn(0); 27048d0534beSBarry Smith } 27058d0534beSBarry Smith 2706857cbf51SRichard Tran Mills PETSC_INTERN PetscErrorCode MatGetColumnReductions_SeqDense(Mat A,PetscInt type,PetscReal *reductions) 27070716a85fSBarry Smith { 27080716a85fSBarry Smith PetscInt i,j,m,n; 27091683a169SBarry Smith const PetscScalar *a; 27100716a85fSBarry Smith 27110716a85fSBarry Smith PetscFunctionBegin; 27129566063dSJacob Faibussowitsch PetscCall(MatGetSize(A,&m,&n)); 27139566063dSJacob Faibussowitsch PetscCall(PetscArrayzero(reductions,n)); 27149566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(A,&a)); 2715857cbf51SRichard Tran Mills if (type == NORM_2) { 27160716a85fSBarry Smith for (i=0; i<n; i++) { 27170716a85fSBarry Smith for (j=0; j<m; j++) { 2718a873a8cdSSam Reynolds reductions[i] += PetscAbsScalar(a[j]*a[j]); 27190716a85fSBarry Smith } 27200716a85fSBarry Smith a += m; 27210716a85fSBarry Smith } 2722857cbf51SRichard Tran Mills } else if (type == NORM_1) { 27230716a85fSBarry Smith for (i=0; i<n; i++) { 27240716a85fSBarry Smith for (j=0; j<m; j++) { 2725a873a8cdSSam Reynolds reductions[i] += PetscAbsScalar(a[j]); 27260716a85fSBarry Smith } 27270716a85fSBarry Smith a += m; 27280716a85fSBarry Smith } 2729857cbf51SRichard Tran Mills } else if (type == NORM_INFINITY) { 27300716a85fSBarry Smith for (i=0; i<n; i++) { 27310716a85fSBarry Smith for (j=0; j<m; j++) { 2732a873a8cdSSam Reynolds reductions[i] = PetscMax(PetscAbsScalar(a[j]),reductions[i]); 27330716a85fSBarry Smith } 27340716a85fSBarry Smith a += m; 27350716a85fSBarry Smith } 2736857cbf51SRichard Tran Mills } else if (type == REDUCTION_SUM_REALPART || type == REDUCTION_MEAN_REALPART) { 2737a873a8cdSSam Reynolds for (i=0; i<n; i++) { 2738a873a8cdSSam Reynolds for (j=0; j<m; j++) { 2739857cbf51SRichard Tran Mills reductions[i] += PetscRealPart(a[j]); 2740a873a8cdSSam Reynolds } 2741a873a8cdSSam Reynolds a += m; 2742a873a8cdSSam Reynolds } 2743857cbf51SRichard Tran Mills } else if (type == REDUCTION_SUM_IMAGINARYPART || type == REDUCTION_MEAN_IMAGINARYPART) { 2744857cbf51SRichard Tran Mills for (i=0; i<n; i++) { 2745857cbf51SRichard Tran Mills for (j=0; j<m; j++) { 2746857cbf51SRichard Tran Mills reductions[i] += PetscImaginaryPart(a[j]); 2747857cbf51SRichard Tran Mills } 2748857cbf51SRichard Tran Mills a += m; 2749857cbf51SRichard Tran Mills } 2750857cbf51SRichard Tran Mills } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown reduction type"); 27519566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(A,&a)); 2752857cbf51SRichard Tran Mills if (type == NORM_2) { 2753a873a8cdSSam Reynolds for (i=0; i<n; i++) reductions[i] = PetscSqrtReal(reductions[i]); 2754857cbf51SRichard Tran Mills } else if (type == REDUCTION_MEAN_REALPART || type == REDUCTION_MEAN_IMAGINARYPART) { 2755a873a8cdSSam Reynolds for (i=0; i<n; i++) reductions[i] /= m; 27560716a85fSBarry Smith } 27570716a85fSBarry Smith PetscFunctionReturn(0); 27580716a85fSBarry Smith } 27590716a85fSBarry Smith 276073a71a0fSBarry Smith static PetscErrorCode MatSetRandom_SeqDense(Mat x,PetscRandom rctx) 276173a71a0fSBarry Smith { 276273a71a0fSBarry Smith PetscScalar *a; 2763637a0070SStefano Zampini PetscInt lda,m,n,i,j; 276473a71a0fSBarry Smith 276573a71a0fSBarry Smith PetscFunctionBegin; 27669566063dSJacob Faibussowitsch PetscCall(MatGetSize(x,&m,&n)); 27679566063dSJacob Faibussowitsch PetscCall(MatDenseGetLDA(x,&lda)); 27689566063dSJacob Faibussowitsch PetscCall(MatDenseGetArray(x,&a)); 2769637a0070SStefano Zampini for (j=0; j<n; j++) { 2770637a0070SStefano Zampini for (i=0; i<m; i++) { 27719566063dSJacob Faibussowitsch PetscCall(PetscRandomGetValue(rctx,a+j*lda+i)); 2772637a0070SStefano Zampini } 277373a71a0fSBarry Smith } 27749566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArray(x,&a)); 277573a71a0fSBarry Smith PetscFunctionReturn(0); 277673a71a0fSBarry Smith } 277773a71a0fSBarry Smith 27783b49f96aSBarry Smith static PetscErrorCode MatMissingDiagonal_SeqDense(Mat A,PetscBool *missing,PetscInt *d) 27793b49f96aSBarry Smith { 27803b49f96aSBarry Smith PetscFunctionBegin; 27813b49f96aSBarry Smith *missing = PETSC_FALSE; 27823b49f96aSBarry Smith PetscFunctionReturn(0); 27833b49f96aSBarry Smith } 278473a71a0fSBarry Smith 2785ca15aa20SStefano Zampini /* vals is not const */ 2786af53bab2SHong Zhang static PetscErrorCode MatDenseGetColumn_SeqDense(Mat A,PetscInt col,PetscScalar **vals) 278786aefd0dSHong Zhang { 278886aefd0dSHong Zhang Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2789ca15aa20SStefano Zampini PetscScalar *v; 279086aefd0dSHong Zhang 279186aefd0dSHong Zhang PetscFunctionBegin; 279228b400f6SJacob Faibussowitsch PetscCheck(!A->factortype,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 27939566063dSJacob Faibussowitsch PetscCall(MatDenseGetArray(A,&v)); 2794ca15aa20SStefano Zampini *vals = v+col*a->lda; 27959566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArray(A,&v)); 279686aefd0dSHong Zhang PetscFunctionReturn(0); 279786aefd0dSHong Zhang } 279886aefd0dSHong Zhang 2799af53bab2SHong Zhang static PetscErrorCode MatDenseRestoreColumn_SeqDense(Mat A,PetscScalar **vals) 280086aefd0dSHong Zhang { 280186aefd0dSHong Zhang PetscFunctionBegin; 2802a5b23f4aSJose E. Roman *vals = NULL; /* user cannot accidentally use the array later */ 280386aefd0dSHong Zhang PetscFunctionReturn(0); 280486aefd0dSHong Zhang } 2805abc3b08eSStefano Zampini 2806289bc588SBarry Smith /* -------------------------------------------------------------------*/ 2807a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense, 2808905e6a2fSBarry Smith MatGetRow_SeqDense, 2809905e6a2fSBarry Smith MatRestoreRow_SeqDense, 2810905e6a2fSBarry Smith MatMult_SeqDense, 281197304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense, 28127c922b88SBarry Smith MatMultTranspose_SeqDense, 28137c922b88SBarry Smith MatMultTransposeAdd_SeqDense, 2814f4259b30SLisandro Dalcin NULL, 2815f4259b30SLisandro Dalcin NULL, 2816f4259b30SLisandro Dalcin NULL, 2817f4259b30SLisandro Dalcin /* 10*/ NULL, 2818905e6a2fSBarry Smith MatLUFactor_SeqDense, 2819905e6a2fSBarry Smith MatCholeskyFactor_SeqDense, 282041f059aeSBarry Smith MatSOR_SeqDense, 2821ec8511deSBarry Smith MatTranspose_SeqDense, 282297304618SKris Buschelman /* 15*/ MatGetInfo_SeqDense, 2823905e6a2fSBarry Smith MatEqual_SeqDense, 2824905e6a2fSBarry Smith MatGetDiagonal_SeqDense, 2825905e6a2fSBarry Smith MatDiagonalScale_SeqDense, 2826905e6a2fSBarry Smith MatNorm_SeqDense, 2827c0aa2d19SHong Zhang /* 20*/ MatAssemblyBegin_SeqDense, 2828c0aa2d19SHong Zhang MatAssemblyEnd_SeqDense, 2829905e6a2fSBarry Smith MatSetOption_SeqDense, 2830905e6a2fSBarry Smith MatZeroEntries_SeqDense, 2831d519adbfSMatthew Knepley /* 24*/ MatZeroRows_SeqDense, 2832f4259b30SLisandro Dalcin NULL, 2833f4259b30SLisandro Dalcin NULL, 2834f4259b30SLisandro Dalcin NULL, 2835f4259b30SLisandro Dalcin NULL, 28364994cf47SJed Brown /* 29*/ MatSetUp_SeqDense, 2837f4259b30SLisandro Dalcin NULL, 2838f4259b30SLisandro Dalcin NULL, 2839f4259b30SLisandro Dalcin NULL, 2840f4259b30SLisandro Dalcin NULL, 2841d519adbfSMatthew Knepley /* 34*/ MatDuplicate_SeqDense, 2842f4259b30SLisandro Dalcin NULL, 2843f4259b30SLisandro Dalcin NULL, 2844f4259b30SLisandro Dalcin NULL, 2845f4259b30SLisandro Dalcin NULL, 2846d519adbfSMatthew Knepley /* 39*/ MatAXPY_SeqDense, 28477dae84e0SHong Zhang MatCreateSubMatrices_SeqDense, 2848f4259b30SLisandro Dalcin NULL, 28494b0e389bSBarry Smith MatGetValues_SeqDense, 2850a5ae1ecdSBarry Smith MatCopy_SeqDense, 2851d519adbfSMatthew Knepley /* 44*/ MatGetRowMax_SeqDense, 2852a5ae1ecdSBarry Smith MatScale_SeqDense, 28537d68702bSBarry Smith MatShift_Basic, 2854f4259b30SLisandro Dalcin NULL, 28553f49a652SStefano Zampini MatZeroRowsColumns_SeqDense, 285673a71a0fSBarry Smith /* 49*/ MatSetRandom_SeqDense, 2857f4259b30SLisandro Dalcin NULL, 2858f4259b30SLisandro Dalcin NULL, 2859f4259b30SLisandro Dalcin NULL, 2860f4259b30SLisandro Dalcin NULL, 2861f4259b30SLisandro Dalcin /* 54*/ NULL, 2862f4259b30SLisandro Dalcin NULL, 2863f4259b30SLisandro Dalcin NULL, 2864f4259b30SLisandro Dalcin NULL, 2865f4259b30SLisandro Dalcin NULL, 2866023c16fcSToby Isaac /* 59*/ MatCreateSubMatrix_SeqDense, 2867e03a110bSBarry Smith MatDestroy_SeqDense, 2868e03a110bSBarry Smith MatView_SeqDense, 2869f4259b30SLisandro Dalcin NULL, 2870f4259b30SLisandro Dalcin NULL, 2871f4259b30SLisandro Dalcin /* 64*/ NULL, 2872f4259b30SLisandro Dalcin NULL, 2873f4259b30SLisandro Dalcin NULL, 2874f4259b30SLisandro Dalcin NULL, 2875f4259b30SLisandro Dalcin NULL, 2876d519adbfSMatthew Knepley /* 69*/ MatGetRowMaxAbs_SeqDense, 2877f4259b30SLisandro Dalcin NULL, 2878f4259b30SLisandro Dalcin NULL, 2879f4259b30SLisandro Dalcin NULL, 2880f4259b30SLisandro Dalcin NULL, 2881f4259b30SLisandro Dalcin /* 74*/ NULL, 2882f4259b30SLisandro Dalcin NULL, 2883f4259b30SLisandro Dalcin NULL, 2884f4259b30SLisandro Dalcin NULL, 2885f4259b30SLisandro Dalcin NULL, 2886f4259b30SLisandro Dalcin /* 79*/ NULL, 2887f4259b30SLisandro Dalcin NULL, 2888f4259b30SLisandro Dalcin NULL, 2889f4259b30SLisandro Dalcin NULL, 28905bba2384SShri Abhyankar /* 83*/ MatLoad_SeqDense, 2891637a0070SStefano Zampini MatIsSymmetric_SeqDense, 28921cbb95d3SBarry Smith MatIsHermitian_SeqDense, 2893f4259b30SLisandro Dalcin NULL, 2894f4259b30SLisandro Dalcin NULL, 2895f4259b30SLisandro Dalcin NULL, 2896f4259b30SLisandro Dalcin /* 89*/ NULL, 2897f4259b30SLisandro Dalcin NULL, 2898a9fe9ddaSSatish Balay MatMatMultNumeric_SeqDense_SeqDense, 2899f4259b30SLisandro Dalcin NULL, 2900f4259b30SLisandro Dalcin NULL, 2901f4259b30SLisandro Dalcin /* 94*/ NULL, 2902f4259b30SLisandro Dalcin NULL, 2903f4259b30SLisandro Dalcin NULL, 290469f65d41SStefano Zampini MatMatTransposeMultNumeric_SeqDense_SeqDense, 2905f4259b30SLisandro Dalcin NULL, 29064222ddf1SHong Zhang /* 99*/ MatProductSetFromOptions_SeqDense, 2907f4259b30SLisandro Dalcin NULL, 2908f4259b30SLisandro Dalcin NULL, 2909ba337c44SJed Brown MatConjugate_SeqDense, 2910f4259b30SLisandro Dalcin NULL, 2911f4259b30SLisandro Dalcin /*104*/ NULL, 2912ba337c44SJed Brown MatRealPart_SeqDense, 2913ba337c44SJed Brown MatImaginaryPart_SeqDense, 2914f4259b30SLisandro Dalcin NULL, 2915f4259b30SLisandro Dalcin NULL, 2916f4259b30SLisandro Dalcin /*109*/ NULL, 2917f4259b30SLisandro Dalcin NULL, 29188d0534beSBarry Smith MatGetRowMin_SeqDense, 2919aabbc4fbSShri Abhyankar MatGetColumnVector_SeqDense, 29203b49f96aSBarry Smith MatMissingDiagonal_SeqDense, 2921f4259b30SLisandro Dalcin /*114*/ NULL, 2922f4259b30SLisandro Dalcin NULL, 2923f4259b30SLisandro Dalcin NULL, 2924f4259b30SLisandro Dalcin NULL, 2925f4259b30SLisandro Dalcin NULL, 2926f4259b30SLisandro Dalcin /*119*/ NULL, 2927f4259b30SLisandro Dalcin NULL, 2928f4259b30SLisandro Dalcin NULL, 2929f4259b30SLisandro Dalcin NULL, 2930f4259b30SLisandro Dalcin NULL, 2931f4259b30SLisandro Dalcin /*124*/ NULL, 2932a873a8cdSSam Reynolds MatGetColumnReductions_SeqDense, 2933f4259b30SLisandro Dalcin NULL, 2934f4259b30SLisandro Dalcin NULL, 2935f4259b30SLisandro Dalcin NULL, 2936f4259b30SLisandro Dalcin /*129*/ NULL, 2937f4259b30SLisandro Dalcin NULL, 2938f4259b30SLisandro Dalcin NULL, 293975648e8dSHong Zhang MatTransposeMatMultNumeric_SeqDense_SeqDense, 2940f4259b30SLisandro Dalcin NULL, 2941f4259b30SLisandro Dalcin /*134*/ NULL, 2942f4259b30SLisandro Dalcin NULL, 2943f4259b30SLisandro Dalcin NULL, 2944f4259b30SLisandro Dalcin NULL, 2945f4259b30SLisandro Dalcin NULL, 2946f4259b30SLisandro Dalcin /*139*/ NULL, 2947f4259b30SLisandro Dalcin NULL, 2948f4259b30SLisandro Dalcin NULL, 2949f4259b30SLisandro Dalcin NULL, 2950f4259b30SLisandro Dalcin NULL, 29514222ddf1SHong Zhang MatCreateMPIMatConcatenateSeqMat_SeqDense, 2952f4259b30SLisandro Dalcin /*145*/ NULL, 2953f4259b30SLisandro Dalcin NULL, 2954f4259b30SLisandro Dalcin NULL 2955985db425SBarry Smith }; 295690ace30eSBarry Smith 29574b828684SBarry Smith /*@C 2958fafbff53SBarry Smith MatCreateSeqDense - Creates a sequential dense matrix that 2959d65003e9SLois Curfman McInnes is stored in column major order (the usual Fortran 77 manner). Many 2960d65003e9SLois Curfman McInnes of the matrix operations use the BLAS and LAPACK routines. 2961289bc588SBarry Smith 2962d083f849SBarry Smith Collective 2963db81eaa0SLois Curfman McInnes 296420563c6bSBarry Smith Input Parameters: 2965db81eaa0SLois Curfman McInnes + comm - MPI communicator, set to PETSC_COMM_SELF 29660c775827SLois Curfman McInnes . m - number of rows 296718f449edSLois Curfman McInnes . n - number of columns 29680298fd71SBarry Smith - data - optional location of matrix data in column major order. Set data=NULL for PETSc 2969dfc5480cSLois Curfman McInnes to control all matrix memory allocation. 297020563c6bSBarry Smith 297120563c6bSBarry Smith Output Parameter: 297244cd7ae7SLois Curfman McInnes . A - the matrix 297320563c6bSBarry Smith 2974b259b22eSLois Curfman McInnes Notes: 297518f449edSLois Curfman McInnes The data input variable is intended primarily for Fortran programmers 297618f449edSLois Curfman McInnes who wish to allocate their own matrix memory space. Most users should 29770298fd71SBarry Smith set data=NULL. 297818f449edSLois Curfman McInnes 2979027ccd11SLois Curfman McInnes Level: intermediate 2980027ccd11SLois Curfman McInnes 298169b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues() 298220563c6bSBarry Smith @*/ 29837087cfbeSBarry Smith PetscErrorCode MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A) 2984289bc588SBarry Smith { 29853a40ed3dSBarry Smith PetscFunctionBegin; 29869566063dSJacob Faibussowitsch PetscCall(MatCreate(comm,A)); 29879566063dSJacob Faibussowitsch PetscCall(MatSetSizes(*A,m,n,m,n)); 29889566063dSJacob Faibussowitsch PetscCall(MatSetType(*A,MATSEQDENSE)); 29899566063dSJacob Faibussowitsch PetscCall(MatSeqDenseSetPreallocation(*A,data)); 2990273d9f13SBarry Smith PetscFunctionReturn(0); 2991273d9f13SBarry Smith } 2992273d9f13SBarry Smith 2993273d9f13SBarry Smith /*@C 2994273d9f13SBarry Smith MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements 2995273d9f13SBarry Smith 2996d083f849SBarry Smith Collective 2997273d9f13SBarry Smith 2998273d9f13SBarry Smith Input Parameters: 29991c4f3114SJed Brown + B - the matrix 30000298fd71SBarry Smith - data - the array (or NULL) 3001273d9f13SBarry Smith 3002273d9f13SBarry Smith Notes: 3003273d9f13SBarry Smith The data input variable is intended primarily for Fortran programmers 3004273d9f13SBarry Smith who wish to allocate their own matrix memory space. Most users should 3005284134d9SBarry Smith need not call this routine. 3006273d9f13SBarry Smith 3007273d9f13SBarry Smith Level: intermediate 3008273d9f13SBarry Smith 3009ad16ce7aSStefano Zampini .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatDenseSetLDA() 3010867c911aSBarry Smith 3011273d9f13SBarry Smith @*/ 30127087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation(Mat B,PetscScalar data[]) 3013273d9f13SBarry Smith { 3014a23d5eceSKris Buschelman PetscFunctionBegin; 3015d5ea218eSStefano Zampini PetscValidHeaderSpecific(B,MAT_CLASSID,1); 3016cac4c232SBarry Smith PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data)); 3017a23d5eceSKris Buschelman PetscFunctionReturn(0); 3018a23d5eceSKris Buschelman } 3019a23d5eceSKris Buschelman 30207087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data) 3021a23d5eceSKris Buschelman { 3022ad16ce7aSStefano Zampini Mat_SeqDense *b = (Mat_SeqDense*)B->data; 3023273d9f13SBarry Smith 3024273d9f13SBarry Smith PetscFunctionBegin; 302528b400f6SJacob Faibussowitsch PetscCheck(!b->matinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first"); 3026273d9f13SBarry Smith B->preallocated = PETSC_TRUE; 3027a868139aSShri Abhyankar 30289566063dSJacob Faibussowitsch PetscCall(PetscLayoutSetUp(B->rmap)); 30299566063dSJacob Faibussowitsch PetscCall(PetscLayoutSetUp(B->cmap)); 303034ef9618SShri Abhyankar 3031ad16ce7aSStefano Zampini if (b->lda <= 0) b->lda = B->rmap->n; 303286d161a7SShri Abhyankar 30339e8f95c4SLisandro Dalcin if (!data) { /* petsc-allocated storage */ 30349566063dSJacob Faibussowitsch if (!b->user_alloc) PetscCall(PetscFree(b->v)); 30359566063dSJacob Faibussowitsch PetscCall(PetscCalloc1((size_t)b->lda*B->cmap->n,&b->v)); 30369566063dSJacob Faibussowitsch PetscCall(PetscLogObjectMemory((PetscObject)B,b->lda*B->cmap->n*sizeof(PetscScalar))); 30372205254eSKarl Rupp 30389e8f95c4SLisandro Dalcin b->user_alloc = PETSC_FALSE; 3039273d9f13SBarry Smith } else { /* user-allocated storage */ 30409566063dSJacob Faibussowitsch if (!b->user_alloc) PetscCall(PetscFree(b->v)); 3041273d9f13SBarry Smith b->v = data; 3042273d9f13SBarry Smith b->user_alloc = PETSC_TRUE; 3043273d9f13SBarry Smith } 30440450473dSBarry Smith B->assembled = PETSC_TRUE; 3045273d9f13SBarry Smith PetscFunctionReturn(0); 3046273d9f13SBarry Smith } 3047273d9f13SBarry Smith 304865b80a83SHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 3049cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat) 30508baccfbdSHong Zhang { 3051d77f618aSHong Zhang Mat mat_elemental; 30521683a169SBarry Smith const PetscScalar *array; 30531683a169SBarry Smith PetscScalar *v_colwise; 3054d77f618aSHong Zhang PetscInt M=A->rmap->N,N=A->cmap->N,i,j,k,*rows,*cols; 3055d77f618aSHong Zhang 30568baccfbdSHong Zhang PetscFunctionBegin; 30579566063dSJacob Faibussowitsch PetscCall(PetscMalloc3(M*N,&v_colwise,M,&rows,N,&cols)); 30589566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(A,&array)); 3059d77f618aSHong Zhang /* convert column-wise array into row-wise v_colwise, see MatSetValues_Elemental() */ 3060d77f618aSHong Zhang k = 0; 3061d77f618aSHong Zhang for (j=0; j<N; j++) { 3062d77f618aSHong Zhang cols[j] = j; 3063d77f618aSHong Zhang for (i=0; i<M; i++) { 3064d77f618aSHong Zhang v_colwise[j*M+i] = array[k++]; 3065d77f618aSHong Zhang } 3066d77f618aSHong Zhang } 3067d77f618aSHong Zhang for (i=0; i<M; i++) { 3068d77f618aSHong Zhang rows[i] = i; 3069d77f618aSHong Zhang } 30709566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(A,&array)); 3071d77f618aSHong Zhang 30729566063dSJacob Faibussowitsch PetscCall(MatCreate(PetscObjectComm((PetscObject)A), &mat_elemental)); 30739566063dSJacob Faibussowitsch PetscCall(MatSetSizes(mat_elemental,PETSC_DECIDE,PETSC_DECIDE,M,N)); 30749566063dSJacob Faibussowitsch PetscCall(MatSetType(mat_elemental,MATELEMENTAL)); 30759566063dSJacob Faibussowitsch PetscCall(MatSetUp(mat_elemental)); 3076d77f618aSHong Zhang 3077d77f618aSHong Zhang /* PETSc-Elemental interaface uses axpy for setting off-processor entries, only ADD_VALUES is allowed */ 30789566063dSJacob Faibussowitsch PetscCall(MatSetValues(mat_elemental,M,rows,N,cols,v_colwise,ADD_VALUES)); 30799566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(mat_elemental, MAT_FINAL_ASSEMBLY)); 30809566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(mat_elemental, MAT_FINAL_ASSEMBLY)); 30819566063dSJacob Faibussowitsch PetscCall(PetscFree3(v_colwise,rows,cols)); 3082d77f618aSHong Zhang 3083511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 30849566063dSJacob Faibussowitsch PetscCall(MatHeaderReplace(A,&mat_elemental)); 3085d77f618aSHong Zhang } else { 3086d77f618aSHong Zhang *newmat = mat_elemental; 3087d77f618aSHong Zhang } 30888baccfbdSHong Zhang PetscFunctionReturn(0); 30898baccfbdSHong Zhang } 309065b80a83SHong Zhang #endif 30918baccfbdSHong Zhang 309217359960SJose E. Roman PetscErrorCode MatDenseSetLDA_SeqDense(Mat B,PetscInt lda) 30931b807ce4Svictorle { 30941b807ce4Svictorle Mat_SeqDense *b = (Mat_SeqDense*)B->data; 30957422da62SJose E. Roman PetscBool data; 309621a2c019SBarry Smith 30971b807ce4Svictorle PetscFunctionBegin; 30987422da62SJose E. Roman data = (PetscBool)((B->rmap->n > 0 && B->cmap->n > 0) ? (b->v ? PETSC_TRUE : PETSC_FALSE) : PETSC_FALSE); 30992c71b3e2SJacob Faibussowitsch PetscCheckFalse(!b->user_alloc && data && b->lda!=lda,PETSC_COMM_SELF,PETSC_ERR_ORDER,"LDA cannot be changed after allocation of internal storage"); 31002c71b3e2SJacob Faibussowitsch PetscCheckFalse(lda < B->rmap->n,PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"LDA %" PetscInt_FMT " must be at least matrix dimension %" PetscInt_FMT,lda,B->rmap->n); 31011b807ce4Svictorle b->lda = lda; 31021b807ce4Svictorle PetscFunctionReturn(0); 31031b807ce4Svictorle } 31041b807ce4Svictorle 3105d528f656SJakub Kruzik PetscErrorCode MatCreateMPIMatConcatenateSeqMat_SeqDense(MPI_Comm comm,Mat inmat,PetscInt n,MatReuse scall,Mat *outmat) 3106d528f656SJakub Kruzik { 3107d528f656SJakub Kruzik PetscMPIInt size; 3108d528f656SJakub Kruzik 3109d528f656SJakub Kruzik PetscFunctionBegin; 31109566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(comm,&size)); 3111d528f656SJakub Kruzik if (size == 1) { 3112d528f656SJakub Kruzik if (scall == MAT_INITIAL_MATRIX) { 31139566063dSJacob Faibussowitsch PetscCall(MatDuplicate(inmat,MAT_COPY_VALUES,outmat)); 3114d528f656SJakub Kruzik } else { 31159566063dSJacob Faibussowitsch PetscCall(MatCopy(inmat,*outmat,SAME_NONZERO_PATTERN)); 3116d528f656SJakub Kruzik } 3117d528f656SJakub Kruzik } else { 31189566063dSJacob Faibussowitsch PetscCall(MatCreateMPIMatConcatenateSeqMat_MPIDense(comm,inmat,n,scall,outmat)); 3119d528f656SJakub Kruzik } 3120d528f656SJakub Kruzik PetscFunctionReturn(0); 3121d528f656SJakub Kruzik } 3122d528f656SJakub Kruzik 31236947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVec_SeqDense(Mat A,PetscInt col,Vec *v) 31246947451fSStefano Zampini { 31256947451fSStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 31266947451fSStefano Zampini 31276947451fSStefano Zampini PetscFunctionBegin; 312828b400f6SJacob Faibussowitsch PetscCheck(!a->vecinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first"); 312928b400f6SJacob Faibussowitsch PetscCheck(!a->matinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first"); 31306947451fSStefano Zampini if (!a->cvec) { 31319566063dSJacob Faibussowitsch PetscCall(VecCreateSeqWithArray(PetscObjectComm((PetscObject)A),A->rmap->bs,A->rmap->n,NULL,&a->cvec)); 31329566063dSJacob Faibussowitsch PetscCall(PetscLogObjectParent((PetscObject)A,(PetscObject)a->cvec)); 31336947451fSStefano Zampini } 31346947451fSStefano Zampini a->vecinuse = col + 1; 31359566063dSJacob Faibussowitsch PetscCall(MatDenseGetArray(A,(PetscScalar**)&a->ptrinuse)); 31369566063dSJacob Faibussowitsch PetscCall(VecPlaceArray(a->cvec,a->ptrinuse + (size_t)col * (size_t)a->lda)); 31376947451fSStefano Zampini *v = a->cvec; 31386947451fSStefano Zampini PetscFunctionReturn(0); 31396947451fSStefano Zampini } 31406947451fSStefano Zampini 31416947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVec_SeqDense(Mat A,PetscInt col,Vec *v) 31426947451fSStefano Zampini { 31436947451fSStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 31446947451fSStefano Zampini 31456947451fSStefano Zampini PetscFunctionBegin; 314628b400f6SJacob Faibussowitsch PetscCheck(a->vecinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseGetColumnVec() first"); 314728b400f6SJacob Faibussowitsch PetscCheck(a->cvec,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing internal column vector"); 31486947451fSStefano Zampini a->vecinuse = 0; 31499566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArray(A,(PetscScalar**)&a->ptrinuse)); 31509566063dSJacob Faibussowitsch PetscCall(VecResetArray(a->cvec)); 315175f6d85dSStefano Zampini if (v) *v = NULL; 31526947451fSStefano Zampini PetscFunctionReturn(0); 31536947451fSStefano Zampini } 31546947451fSStefano Zampini 31556947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVecRead_SeqDense(Mat A,PetscInt col,Vec *v) 31566947451fSStefano Zampini { 31576947451fSStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 31586947451fSStefano Zampini 31596947451fSStefano Zampini PetscFunctionBegin; 316028b400f6SJacob Faibussowitsch PetscCheck(!a->vecinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first"); 316128b400f6SJacob Faibussowitsch PetscCheck(!a->matinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first"); 31626947451fSStefano Zampini if (!a->cvec) { 31639566063dSJacob Faibussowitsch PetscCall(VecCreateSeqWithArray(PetscObjectComm((PetscObject)A),A->rmap->bs,A->rmap->n,NULL,&a->cvec)); 31649566063dSJacob Faibussowitsch PetscCall(PetscLogObjectParent((PetscObject)A,(PetscObject)a->cvec)); 31656947451fSStefano Zampini } 31666947451fSStefano Zampini a->vecinuse = col + 1; 31679566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayRead(A,&a->ptrinuse)); 31689566063dSJacob Faibussowitsch PetscCall(VecPlaceArray(a->cvec,a->ptrinuse + (size_t)col * (size_t)a->lda)); 31699566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(a->cvec)); 31706947451fSStefano Zampini *v = a->cvec; 31716947451fSStefano Zampini PetscFunctionReturn(0); 31726947451fSStefano Zampini } 31736947451fSStefano Zampini 31746947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVecRead_SeqDense(Mat A,PetscInt col,Vec *v) 31756947451fSStefano Zampini { 31766947451fSStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 31776947451fSStefano Zampini 31786947451fSStefano Zampini PetscFunctionBegin; 317928b400f6SJacob Faibussowitsch PetscCheck(a->vecinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseGetColumnVec() first"); 318028b400f6SJacob Faibussowitsch PetscCheck(a->cvec,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing internal column vector"); 31816947451fSStefano Zampini a->vecinuse = 0; 31829566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayRead(A,&a->ptrinuse)); 31839566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(a->cvec)); 31849566063dSJacob Faibussowitsch PetscCall(VecResetArray(a->cvec)); 318575f6d85dSStefano Zampini if (v) *v = NULL; 31866947451fSStefano Zampini PetscFunctionReturn(0); 31876947451fSStefano Zampini } 31886947451fSStefano Zampini 31896947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVecWrite_SeqDense(Mat A,PetscInt col,Vec *v) 31906947451fSStefano Zampini { 31916947451fSStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 31926947451fSStefano Zampini 31936947451fSStefano Zampini PetscFunctionBegin; 319428b400f6SJacob Faibussowitsch PetscCheck(!a->vecinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first"); 319528b400f6SJacob Faibussowitsch PetscCheck(!a->matinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first"); 31966947451fSStefano Zampini if (!a->cvec) { 31979566063dSJacob Faibussowitsch PetscCall(VecCreateSeqWithArray(PetscObjectComm((PetscObject)A),A->rmap->bs,A->rmap->n,NULL,&a->cvec)); 31989566063dSJacob Faibussowitsch PetscCall(PetscLogObjectParent((PetscObject)A,(PetscObject)a->cvec)); 31996947451fSStefano Zampini } 32006947451fSStefano Zampini a->vecinuse = col + 1; 32019566063dSJacob Faibussowitsch PetscCall(MatDenseGetArrayWrite(A,(PetscScalar**)&a->ptrinuse)); 32029566063dSJacob Faibussowitsch PetscCall(VecPlaceArray(a->cvec,a->ptrinuse + (size_t)col * (size_t)a->lda)); 32036947451fSStefano Zampini *v = a->cvec; 32046947451fSStefano Zampini PetscFunctionReturn(0); 32056947451fSStefano Zampini } 32066947451fSStefano Zampini 32076947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVecWrite_SeqDense(Mat A,PetscInt col,Vec *v) 32086947451fSStefano Zampini { 32096947451fSStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 32106947451fSStefano Zampini 32116947451fSStefano Zampini PetscFunctionBegin; 321228b400f6SJacob Faibussowitsch PetscCheck(a->vecinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseGetColumnVec() first"); 321328b400f6SJacob Faibussowitsch PetscCheck(a->cvec,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing internal column vector"); 32146947451fSStefano Zampini a->vecinuse = 0; 32159566063dSJacob Faibussowitsch PetscCall(MatDenseRestoreArrayWrite(A,(PetscScalar**)&a->ptrinuse)); 32169566063dSJacob Faibussowitsch PetscCall(VecResetArray(a->cvec)); 321775f6d85dSStefano Zampini if (v) *v = NULL; 32186947451fSStefano Zampini PetscFunctionReturn(0); 32196947451fSStefano Zampini } 32206947451fSStefano Zampini 32215ea7661aSPierre Jolivet PetscErrorCode MatDenseGetSubMatrix_SeqDense(Mat A,PetscInt cbegin,PetscInt cend,Mat *v) 32225ea7661aSPierre Jolivet { 32235ea7661aSPierre Jolivet Mat_SeqDense *a = (Mat_SeqDense*)A->data; 32245ea7661aSPierre Jolivet 32255ea7661aSPierre Jolivet PetscFunctionBegin; 322628b400f6SJacob Faibussowitsch PetscCheck(!a->vecinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first"); 322728b400f6SJacob Faibussowitsch PetscCheck(!a->matinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first"); 32285ea7661aSPierre Jolivet if (a->cmat && cend-cbegin != a->cmat->cmap->N) { 32299566063dSJacob Faibussowitsch PetscCall(MatDestroy(&a->cmat)); 32305ea7661aSPierre Jolivet } 32315ea7661aSPierre Jolivet if (!a->cmat) { 32329566063dSJacob Faibussowitsch PetscCall(MatCreateDense(PetscObjectComm((PetscObject)A),A->rmap->n,PETSC_DECIDE,A->rmap->N,cend-cbegin,a->v+(size_t)cbegin*a->lda,&a->cmat)); 32339566063dSJacob Faibussowitsch PetscCall(PetscLogObjectParent((PetscObject)A,(PetscObject)a->cmat)); 32345ea7661aSPierre Jolivet } else { 32359566063dSJacob Faibussowitsch PetscCall(MatDensePlaceArray(a->cmat,a->v+(size_t)cbegin*a->lda)); 32365ea7661aSPierre Jolivet } 32379566063dSJacob Faibussowitsch PetscCall(MatDenseSetLDA(a->cmat,a->lda)); 32385ea7661aSPierre Jolivet a->matinuse = cbegin + 1; 32395ea7661aSPierre Jolivet *v = a->cmat; 324075f6d85dSStefano Zampini #if defined(PETSC_HAVE_CUDA) 324175f6d85dSStefano Zampini A->offloadmask = PETSC_OFFLOAD_CPU; 324275f6d85dSStefano Zampini #endif 32435ea7661aSPierre Jolivet PetscFunctionReturn(0); 32445ea7661aSPierre Jolivet } 32455ea7661aSPierre Jolivet 32465ea7661aSPierre Jolivet PetscErrorCode MatDenseRestoreSubMatrix_SeqDense(Mat A,Mat *v) 32475ea7661aSPierre Jolivet { 32485ea7661aSPierre Jolivet Mat_SeqDense *a = (Mat_SeqDense*)A->data; 32495ea7661aSPierre Jolivet 32505ea7661aSPierre Jolivet PetscFunctionBegin; 325128b400f6SJacob Faibussowitsch PetscCheck(a->matinuse,PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseGetSubMatrix() first"); 325228b400f6SJacob Faibussowitsch PetscCheck(a->cmat,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing internal column matrix"); 32532c71b3e2SJacob Faibussowitsch PetscCheckFalse(*v != a->cmat,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not the matrix obtained from MatDenseGetSubMatrix()"); 32545ea7661aSPierre Jolivet a->matinuse = 0; 32559566063dSJacob Faibussowitsch PetscCall(MatDenseResetArray(a->cmat)); 32565ea7661aSPierre Jolivet *v = NULL; 32575ea7661aSPierre Jolivet PetscFunctionReturn(0); 32585ea7661aSPierre Jolivet } 32595ea7661aSPierre Jolivet 32600bad9183SKris Buschelman /*MC 3261fafad747SKris Buschelman MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices. 32620bad9183SKris Buschelman 32630bad9183SKris Buschelman Options Database Keys: 32640bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions() 32650bad9183SKris Buschelman 32660bad9183SKris Buschelman Level: beginner 32670bad9183SKris Buschelman 326889665df3SBarry Smith .seealso: MatCreateSeqDense() 326989665df3SBarry Smith 32700bad9183SKris Buschelman M*/ 3271ca15aa20SStefano Zampini PetscErrorCode MatCreate_SeqDense(Mat B) 3272273d9f13SBarry Smith { 3273273d9f13SBarry Smith Mat_SeqDense *b; 32747c334f02SBarry Smith PetscMPIInt size; 3275273d9f13SBarry Smith 3276273d9f13SBarry Smith PetscFunctionBegin; 32779566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)B),&size)); 32782c71b3e2SJacob Faibussowitsch PetscCheckFalse(size > 1,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1"); 327955659b69SBarry Smith 32809566063dSJacob Faibussowitsch PetscCall(PetscNewLog(B,&b)); 32819566063dSJacob Faibussowitsch PetscCall(PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps))); 328244cd7ae7SLois Curfman McInnes B->data = (void*)b; 328318f449edSLois Curfman McInnes 3284273d9f13SBarry Smith b->roworiented = PETSC_TRUE; 32854e220ebcSLois Curfman McInnes 32869566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatQRFactor_C",MatQRFactor_SeqDense)); 32879566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatDenseGetLDA_C",MatDenseGetLDA_SeqDense)); 32889566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatDenseSetLDA_C",MatDenseSetLDA_SeqDense)); 32899566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense)); 32909566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense)); 32919566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatDensePlaceArray_C",MatDensePlaceArray_SeqDense)); 32929566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatDenseResetArray_C",MatDenseResetArray_SeqDense)); 32939566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatDenseReplaceArray_C",MatDenseReplaceArray_SeqDense)); 32949566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArrayRead_C",MatDenseGetArray_SeqDense)); 32959566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArrayRead_C",MatDenseRestoreArray_SeqDense)); 32969566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArrayWrite_C",MatDenseGetArray_SeqDense)); 32979566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArrayWrite_C",MatDenseRestoreArray_SeqDense)); 32989566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ)); 32998baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 33009566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental)); 33018baccfbdSHong Zhang #endif 3302d24d4204SJose E. Roman #if defined(PETSC_HAVE_SCALAPACK) 33039566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_scalapack_C",MatConvert_Dense_ScaLAPACK)); 3304d24d4204SJose E. Roman #endif 33052bf066beSStefano Zampini #if defined(PETSC_HAVE_CUDA) 33069566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqdensecuda_C",MatConvert_SeqDense_SeqDenseCUDA)); 33079566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqdensecuda_seqdensecuda_C",MatProductSetFromOptions_SeqDense)); 33089566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqdensecuda_seqdense_C",MatProductSetFromOptions_SeqDense)); 33099566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqdense_seqdensecuda_C",MatProductSetFromOptions_SeqDense)); 33102bf066beSStefano Zampini #endif 33119566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense)); 33129566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqaij_seqdense_C",MatProductSetFromOptions_SeqAIJ_SeqDense)); 33139566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqdense_seqdense_C",MatProductSetFromOptions_SeqDense)); 33149566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqbaij_seqdense_C",MatProductSetFromOptions_SeqXBAIJ_SeqDense)); 33159566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqsbaij_seqdense_C",MatProductSetFromOptions_SeqXBAIJ_SeqDense)); 331696e6d5c4SRichard Tran Mills 33179566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumn_C",MatDenseGetColumn_SeqDense)); 33189566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumn_C",MatDenseRestoreColumn_SeqDense)); 33199566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumnVec_C",MatDenseGetColumnVec_SeqDense)); 33209566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumnVec_C",MatDenseRestoreColumnVec_SeqDense)); 33219566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumnVecRead_C",MatDenseGetColumnVecRead_SeqDense)); 33229566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumnVecRead_C",MatDenseRestoreColumnVecRead_SeqDense)); 33239566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumnVecWrite_C",MatDenseGetColumnVecWrite_SeqDense)); 33249566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumnVecWrite_C",MatDenseRestoreColumnVecWrite_SeqDense)); 33259566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatDenseGetSubMatrix_C",MatDenseGetSubMatrix_SeqDense)); 33269566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreSubMatrix_C",MatDenseRestoreSubMatrix_SeqDense)); 33279566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE)); 33283a40ed3dSBarry Smith PetscFunctionReturn(0); 3329289bc588SBarry Smith } 333086aefd0dSHong Zhang 333186aefd0dSHong Zhang /*@C 3332af53bab2SHong 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. 333386aefd0dSHong Zhang 333486aefd0dSHong Zhang Not Collective 333586aefd0dSHong Zhang 33365ea7661aSPierre Jolivet Input Parameters: 333786aefd0dSHong Zhang + mat - a MATSEQDENSE or MATMPIDENSE matrix 333886aefd0dSHong Zhang - col - column index 333986aefd0dSHong Zhang 334086aefd0dSHong Zhang Output Parameter: 334186aefd0dSHong Zhang . vals - pointer to the data 334286aefd0dSHong Zhang 334386aefd0dSHong Zhang Level: intermediate 334486aefd0dSHong Zhang 334586aefd0dSHong Zhang .seealso: MatDenseRestoreColumn() 334686aefd0dSHong Zhang @*/ 334786aefd0dSHong Zhang PetscErrorCode MatDenseGetColumn(Mat A,PetscInt col,PetscScalar **vals) 334886aefd0dSHong Zhang { 334986aefd0dSHong Zhang PetscFunctionBegin; 3350d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 3351d5ea218eSStefano Zampini PetscValidLogicalCollectiveInt(A,col,2); 3352d5ea218eSStefano Zampini PetscValidPointer(vals,3); 3353cac4c232SBarry Smith PetscUseMethod(A,"MatDenseGetColumn_C",(Mat,PetscInt,PetscScalar**),(A,col,vals)); 335486aefd0dSHong Zhang PetscFunctionReturn(0); 335586aefd0dSHong Zhang } 335686aefd0dSHong Zhang 335786aefd0dSHong Zhang /*@C 335886aefd0dSHong Zhang MatDenseRestoreColumn - returns access to a column of a dense matrix which is returned by MatDenseGetColumn(). 335986aefd0dSHong Zhang 336086aefd0dSHong Zhang Not Collective 336186aefd0dSHong Zhang 336286aefd0dSHong Zhang Input Parameter: 336386aefd0dSHong Zhang . mat - a MATSEQDENSE or MATMPIDENSE matrix 336486aefd0dSHong Zhang 336586aefd0dSHong Zhang Output Parameter: 336686aefd0dSHong Zhang . vals - pointer to the data 336786aefd0dSHong Zhang 336886aefd0dSHong Zhang Level: intermediate 336986aefd0dSHong Zhang 337086aefd0dSHong Zhang .seealso: MatDenseGetColumn() 337186aefd0dSHong Zhang @*/ 337286aefd0dSHong Zhang PetscErrorCode MatDenseRestoreColumn(Mat A,PetscScalar **vals) 337386aefd0dSHong Zhang { 337486aefd0dSHong Zhang PetscFunctionBegin; 3375d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 3376d5ea218eSStefano Zampini PetscValidPointer(vals,2); 3377cac4c232SBarry Smith PetscUseMethod(A,"MatDenseRestoreColumn_C",(Mat,PetscScalar**),(A,vals)); 337886aefd0dSHong Zhang PetscFunctionReturn(0); 337986aefd0dSHong Zhang } 33806947451fSStefano Zampini 33810f74d2c1SSatish Balay /*@ 33826947451fSStefano Zampini MatDenseGetColumnVec - Gives read-write access to a column of a dense matrix, represented as a Vec. 33836947451fSStefano Zampini 33846947451fSStefano Zampini Collective 33856947451fSStefano Zampini 33865ea7661aSPierre Jolivet Input Parameters: 33876947451fSStefano Zampini + mat - the Mat object 33886947451fSStefano Zampini - col - the column index 33896947451fSStefano Zampini 33906947451fSStefano Zampini Output Parameter: 33916947451fSStefano Zampini . v - the vector 33926947451fSStefano Zampini 33936947451fSStefano Zampini Notes: 33946947451fSStefano Zampini The vector is owned by PETSc. Users need to call MatDenseRestoreColumnVec() when the vector is no longer needed. 33956947451fSStefano Zampini Use MatDenseGetColumnVecRead() to obtain read-only access or MatDenseGetColumnVecWrite() for write-only access. 33966947451fSStefano Zampini 33976947451fSStefano Zampini Level: intermediate 33986947451fSStefano Zampini 33996947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVecRead(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecRead(), MatDenseRestoreColumnVecWrite() 34006947451fSStefano Zampini @*/ 34016947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVec(Mat A,PetscInt col,Vec *v) 34026947451fSStefano Zampini { 34036947451fSStefano Zampini PetscFunctionBegin; 34046947451fSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 34056947451fSStefano Zampini PetscValidType(A,1); 34066947451fSStefano Zampini PetscValidLogicalCollectiveInt(A,col,2); 34076947451fSStefano Zampini PetscValidPointer(v,3); 340828b400f6SJacob Faibussowitsch PetscCheck(A->preallocated,PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated"); 34092c71b3e2SJacob Faibussowitsch PetscCheckFalse(col < 0 || col > A->cmap->N,PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid col %" PetscInt_FMT ", should be in [0,%" PetscInt_FMT ")",col,A->cmap->N); 3410cac4c232SBarry Smith PetscUseMethod(A,"MatDenseGetColumnVec_C",(Mat,PetscInt,Vec*),(A,col,v)); 34116947451fSStefano Zampini PetscFunctionReturn(0); 34126947451fSStefano Zampini } 34136947451fSStefano Zampini 34140f74d2c1SSatish Balay /*@ 34156947451fSStefano Zampini MatDenseRestoreColumnVec - Returns access to a column of a dense matrix obtained from MatDenseGetColumnVec(). 34166947451fSStefano Zampini 34176947451fSStefano Zampini Collective 34186947451fSStefano Zampini 34195ea7661aSPierre Jolivet Input Parameters: 34206947451fSStefano Zampini + mat - the Mat object 34216947451fSStefano Zampini . col - the column index 34226947451fSStefano Zampini - v - the Vec object 34236947451fSStefano Zampini 34246947451fSStefano Zampini Level: intermediate 34256947451fSStefano Zampini 34266947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecRead(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVecRead(), MatDenseRestoreColumnVecWrite() 34276947451fSStefano Zampini @*/ 34286947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVec(Mat A,PetscInt col,Vec *v) 34296947451fSStefano Zampini { 34306947451fSStefano Zampini PetscFunctionBegin; 34316947451fSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 34326947451fSStefano Zampini PetscValidType(A,1); 34336947451fSStefano Zampini PetscValidLogicalCollectiveInt(A,col,2); 34342c71b3e2SJacob Faibussowitsch PetscCheckFalse(!A->preallocated,PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated"); 34352c71b3e2SJacob Faibussowitsch PetscCheckFalse(col < 0 || col > A->cmap->N,PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid col %" PetscInt_FMT ", should be in [0,%" PetscInt_FMT ")",col,A->cmap->N); 3436cac4c232SBarry Smith PetscUseMethod(A,"MatDenseRestoreColumnVec_C",(Mat,PetscInt,Vec*),(A,col,v)); 34376947451fSStefano Zampini PetscFunctionReturn(0); 34386947451fSStefano Zampini } 34396947451fSStefano Zampini 34400f74d2c1SSatish Balay /*@ 34416947451fSStefano Zampini MatDenseGetColumnVecRead - Gives read-only access to a column of a dense matrix, represented as a Vec. 34426947451fSStefano Zampini 34436947451fSStefano Zampini Collective 34446947451fSStefano Zampini 34455ea7661aSPierre Jolivet Input Parameters: 34466947451fSStefano Zampini + mat - the Mat object 34476947451fSStefano Zampini - col - the column index 34486947451fSStefano Zampini 34496947451fSStefano Zampini Output Parameter: 34506947451fSStefano Zampini . v - the vector 34516947451fSStefano Zampini 34526947451fSStefano Zampini Notes: 34536947451fSStefano Zampini The vector is owned by PETSc and users cannot modify it. 34546947451fSStefano Zampini Users need to call MatDenseRestoreColumnVecRead() when the vector is no longer needed. 34556947451fSStefano Zampini Use MatDenseGetColumnVec() to obtain read-write access or MatDenseGetColumnVecWrite() for write-only access. 34566947451fSStefano Zampini 34576947451fSStefano Zampini Level: intermediate 34586947451fSStefano Zampini 34596947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecRead(), MatDenseRestoreColumnVecWrite() 34606947451fSStefano Zampini @*/ 34616947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVecRead(Mat A,PetscInt col,Vec *v) 34626947451fSStefano Zampini { 34636947451fSStefano Zampini PetscFunctionBegin; 34646947451fSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 34656947451fSStefano Zampini PetscValidType(A,1); 34666947451fSStefano Zampini PetscValidLogicalCollectiveInt(A,col,2); 34676947451fSStefano Zampini PetscValidPointer(v,3); 346828b400f6SJacob Faibussowitsch PetscCheck(A->preallocated,PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated"); 34692c71b3e2SJacob Faibussowitsch PetscCheckFalse(col < 0 || col > A->cmap->N,PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid col %" PetscInt_FMT ", should be in [0,%" PetscInt_FMT ")",col,A->cmap->N); 3470cac4c232SBarry Smith PetscUseMethod(A,"MatDenseGetColumnVecRead_C",(Mat,PetscInt,Vec*),(A,col,v)); 34716947451fSStefano Zampini PetscFunctionReturn(0); 34726947451fSStefano Zampini } 34736947451fSStefano Zampini 34740f74d2c1SSatish Balay /*@ 34756947451fSStefano Zampini MatDenseRestoreColumnVecRead - Returns access to a column of a dense matrix obtained from MatDenseGetColumnVecRead(). 34766947451fSStefano Zampini 34776947451fSStefano Zampini Collective 34786947451fSStefano Zampini 34795ea7661aSPierre Jolivet Input Parameters: 34806947451fSStefano Zampini + mat - the Mat object 34816947451fSStefano Zampini . col - the column index 34826947451fSStefano Zampini - v - the Vec object 34836947451fSStefano Zampini 34846947451fSStefano Zampini Level: intermediate 34856947451fSStefano Zampini 34866947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecRead(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecWrite() 34876947451fSStefano Zampini @*/ 34886947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVecRead(Mat A,PetscInt col,Vec *v) 34896947451fSStefano Zampini { 34906947451fSStefano Zampini PetscFunctionBegin; 34916947451fSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 34926947451fSStefano Zampini PetscValidType(A,1); 34936947451fSStefano Zampini PetscValidLogicalCollectiveInt(A,col,2); 34942c71b3e2SJacob Faibussowitsch PetscCheckFalse(!A->preallocated,PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated"); 34952c71b3e2SJacob Faibussowitsch PetscCheckFalse(col < 0 || col > A->cmap->N,PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid col %" PetscInt_FMT ", should be in [0,%" PetscInt_FMT ")",col,A->cmap->N); 3496cac4c232SBarry Smith PetscUseMethod(A,"MatDenseRestoreColumnVecRead_C",(Mat,PetscInt,Vec*),(A,col,v)); 34976947451fSStefano Zampini PetscFunctionReturn(0); 34986947451fSStefano Zampini } 34996947451fSStefano Zampini 35000f74d2c1SSatish Balay /*@ 35016947451fSStefano Zampini MatDenseGetColumnVecWrite - Gives write-only access to a column of a dense matrix, represented as a Vec. 35026947451fSStefano Zampini 35036947451fSStefano Zampini Collective 35046947451fSStefano Zampini 35055ea7661aSPierre Jolivet Input Parameters: 35066947451fSStefano Zampini + mat - the Mat object 35076947451fSStefano Zampini - col - the column index 35086947451fSStefano Zampini 35096947451fSStefano Zampini Output Parameter: 35106947451fSStefano Zampini . v - the vector 35116947451fSStefano Zampini 35126947451fSStefano Zampini Notes: 35136947451fSStefano Zampini The vector is owned by PETSc. Users need to call MatDenseRestoreColumnVecWrite() when the vector is no longer needed. 35146947451fSStefano Zampini Use MatDenseGetColumnVec() to obtain read-write access or MatDenseGetColumnVecRead() for read-only access. 35156947451fSStefano Zampini 35166947451fSStefano Zampini Level: intermediate 35176947451fSStefano Zampini 35186947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecRead(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecRead(), MatDenseRestoreColumnVecWrite() 35196947451fSStefano Zampini @*/ 35206947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVecWrite(Mat A,PetscInt col,Vec *v) 35216947451fSStefano Zampini { 35226947451fSStefano Zampini PetscFunctionBegin; 35236947451fSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 35246947451fSStefano Zampini PetscValidType(A,1); 35256947451fSStefano Zampini PetscValidLogicalCollectiveInt(A,col,2); 35266947451fSStefano Zampini PetscValidPointer(v,3); 352728b400f6SJacob Faibussowitsch PetscCheck(A->preallocated,PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated"); 35282c71b3e2SJacob Faibussowitsch PetscCheckFalse(col < 0 || col > A->cmap->N,PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid col %" PetscInt_FMT ", should be in [0,%" PetscInt_FMT ")",col,A->cmap->N); 3529cac4c232SBarry Smith PetscUseMethod(A,"MatDenseGetColumnVecWrite_C",(Mat,PetscInt,Vec*),(A,col,v)); 35306947451fSStefano Zampini PetscFunctionReturn(0); 35316947451fSStefano Zampini } 35326947451fSStefano Zampini 35330f74d2c1SSatish Balay /*@ 35346947451fSStefano Zampini MatDenseRestoreColumnVecWrite - Returns access to a column of a dense matrix obtained from MatDenseGetColumnVecWrite(). 35356947451fSStefano Zampini 35366947451fSStefano Zampini Collective 35376947451fSStefano Zampini 35385ea7661aSPierre Jolivet Input Parameters: 35396947451fSStefano Zampini + mat - the Mat object 35406947451fSStefano Zampini . col - the column index 35416947451fSStefano Zampini - v - the Vec object 35426947451fSStefano Zampini 35436947451fSStefano Zampini Level: intermediate 35446947451fSStefano Zampini 35456947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecRead(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecRead() 35466947451fSStefano Zampini @*/ 35476947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVecWrite(Mat A,PetscInt col,Vec *v) 35486947451fSStefano Zampini { 35496947451fSStefano Zampini PetscFunctionBegin; 35506947451fSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 35516947451fSStefano Zampini PetscValidType(A,1); 35526947451fSStefano Zampini PetscValidLogicalCollectiveInt(A,col,2); 35532c71b3e2SJacob Faibussowitsch PetscCheckFalse(!A->preallocated,PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated"); 35542c71b3e2SJacob Faibussowitsch PetscCheckFalse(col < 0 || col > A->cmap->N,PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid col %" PetscInt_FMT ", should be in [0,%" PetscInt_FMT ")",col,A->cmap->N); 3555cac4c232SBarry Smith PetscUseMethod(A,"MatDenseRestoreColumnVecWrite_C",(Mat,PetscInt,Vec*),(A,col,v)); 35566947451fSStefano Zampini PetscFunctionReturn(0); 35576947451fSStefano Zampini } 35585ea7661aSPierre Jolivet 35590f74d2c1SSatish Balay /*@ 35605ea7661aSPierre Jolivet MatDenseGetSubMatrix - Gives access to a block of columns of a dense matrix, represented as a Mat. 35615ea7661aSPierre Jolivet 35625ea7661aSPierre Jolivet Collective 35635ea7661aSPierre Jolivet 35645ea7661aSPierre Jolivet Input Parameters: 35655ea7661aSPierre Jolivet + mat - the Mat object 35665ea7661aSPierre Jolivet . cbegin - the first index in the block 35675ea7661aSPierre Jolivet - cend - the last index in the block 35685ea7661aSPierre Jolivet 35695ea7661aSPierre Jolivet Output Parameter: 35705ea7661aSPierre Jolivet . v - the matrix 35715ea7661aSPierre Jolivet 35725ea7661aSPierre Jolivet Notes: 35735ea7661aSPierre Jolivet The matrix is owned by PETSc. Users need to call MatDenseRestoreSubMatrix() when the matrix is no longer needed. 35745ea7661aSPierre Jolivet 35755ea7661aSPierre Jolivet Level: intermediate 35765ea7661aSPierre Jolivet 35775ea7661aSPierre Jolivet .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseRestoreColumnVec(), MatDenseRestoreSubMatrix() 35785ea7661aSPierre Jolivet @*/ 35795ea7661aSPierre Jolivet PetscErrorCode MatDenseGetSubMatrix(Mat A,PetscInt cbegin,PetscInt cend,Mat *v) 35805ea7661aSPierre Jolivet { 35815ea7661aSPierre Jolivet PetscFunctionBegin; 35825ea7661aSPierre Jolivet PetscValidHeaderSpecific(A,MAT_CLASSID,1); 35835ea7661aSPierre Jolivet PetscValidType(A,1); 35845ea7661aSPierre Jolivet PetscValidLogicalCollectiveInt(A,cbegin,2); 35855ea7661aSPierre Jolivet PetscValidLogicalCollectiveInt(A,cend,3); 35865ea7661aSPierre Jolivet PetscValidPointer(v,4); 358728b400f6SJacob Faibussowitsch PetscCheck(A->preallocated,PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated"); 35882c71b3e2SJacob Faibussowitsch PetscCheckFalse(cbegin < 0 || cbegin > A->cmap->N,PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid cbegin %" PetscInt_FMT ", should be in [0,%" PetscInt_FMT ")",cbegin,A->cmap->N); 35892c71b3e2SJacob Faibussowitsch PetscCheckFalse(cend < cbegin || cend > A->cmap->N,PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid cend %" PetscInt_FMT ", should be in [%" PetscInt_FMT ",%" PetscInt_FMT ")",cend,cbegin,A->cmap->N); 3590cac4c232SBarry Smith PetscUseMethod(A,"MatDenseGetSubMatrix_C",(Mat,PetscInt,PetscInt,Mat*),(A,cbegin,cend,v)); 35915ea7661aSPierre Jolivet PetscFunctionReturn(0); 35925ea7661aSPierre Jolivet } 35935ea7661aSPierre Jolivet 35940f74d2c1SSatish Balay /*@ 35955ea7661aSPierre Jolivet MatDenseRestoreSubMatrix - Returns access to a block of columns of a dense matrix obtained from MatDenseGetSubMatrix(). 35965ea7661aSPierre Jolivet 35975ea7661aSPierre Jolivet Collective 35985ea7661aSPierre Jolivet 35995ea7661aSPierre Jolivet Input Parameters: 36005ea7661aSPierre Jolivet + mat - the Mat object 36015ea7661aSPierre Jolivet - v - the Mat object 36025ea7661aSPierre Jolivet 36035ea7661aSPierre Jolivet Level: intermediate 36045ea7661aSPierre Jolivet 36055ea7661aSPierre Jolivet .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseRestoreColumnVec(), MatDenseGetSubMatrix() 36065ea7661aSPierre Jolivet @*/ 36075ea7661aSPierre Jolivet PetscErrorCode MatDenseRestoreSubMatrix(Mat A,Mat *v) 36085ea7661aSPierre Jolivet { 36095ea7661aSPierre Jolivet PetscFunctionBegin; 36105ea7661aSPierre Jolivet PetscValidHeaderSpecific(A,MAT_CLASSID,1); 36115ea7661aSPierre Jolivet PetscValidType(A,1); 36125ea7661aSPierre Jolivet PetscValidPointer(v,2); 3613cac4c232SBarry Smith PetscUseMethod(A,"MatDenseRestoreSubMatrix_C",(Mat,Mat*),(A,v)); 36145ea7661aSPierre Jolivet PetscFunctionReturn(0); 36155ea7661aSPierre Jolivet } 3616