1be1d678aSKris Buschelman 267e560aaSBarry Smith /* 367e560aaSBarry Smith Defines the basic matrix operations for sequential dense. 467e560aaSBarry Smith */ 5289bc588SBarry Smith 6dec5eb66SMatthew G Knepley #include <../src/mat/impls/dense/seq/dense.h> /*I "petscmat.h" I*/ 7c6db04a5SJed Brown #include <petscblaslapack.h> 8289bc588SBarry Smith 96a63e612SBarry Smith #include <../src/mat/impls/aij/seq/aij.h> 10b2573a8aSBarry Smith 11ca15aa20SStefano Zampini PetscErrorCode MatSeqDenseSymmetrize_Private(Mat A, PetscBool hermitian) 128c178816SStefano Zampini { 138c178816SStefano Zampini Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 148c178816SStefano Zampini PetscInt j, k, n = A->rmap->n; 15ca15aa20SStefano Zampini PetscScalar *v; 16ca15aa20SStefano Zampini PetscErrorCode ierr; 178c178816SStefano Zampini 188c178816SStefano Zampini PetscFunctionBegin; 198c178816SStefano Zampini if (A->rmap->n != A->cmap->n) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_SUP,"Cannot symmetrize a rectangular matrix"); 20ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr); 218c178816SStefano Zampini if (!hermitian) { 228c178816SStefano Zampini for (k=0;k<n;k++) { 238c178816SStefano Zampini for (j=k;j<n;j++) { 24ca15aa20SStefano Zampini v[j*mat->lda + k] = v[k*mat->lda + j]; 258c178816SStefano Zampini } 268c178816SStefano Zampini } 278c178816SStefano Zampini } else { 288c178816SStefano Zampini for (k=0;k<n;k++) { 298c178816SStefano Zampini for (j=k;j<n;j++) { 30ca15aa20SStefano Zampini v[j*mat->lda + k] = PetscConj(v[k*mat->lda + j]); 318c178816SStefano Zampini } 328c178816SStefano Zampini } 338c178816SStefano Zampini } 34ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr); 358c178816SStefano Zampini PetscFunctionReturn(0); 368c178816SStefano Zampini } 378c178816SStefano Zampini 3805709791SSatish Balay PETSC_EXTERN PetscErrorCode MatSeqDenseInvertFactors_Private(Mat A) 398c178816SStefano Zampini { 408c178816SStefano Zampini Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 418c178816SStefano Zampini PetscErrorCode ierr; 428c178816SStefano Zampini PetscBLASInt info,n; 438c178816SStefano Zampini 448c178816SStefano Zampini PetscFunctionBegin; 458c178816SStefano Zampini if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 468c178816SStefano Zampini ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 478c178816SStefano Zampini if (A->factortype == MAT_FACTOR_LU) { 488c178816SStefano Zampini if (!mat->pivots) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Pivots not present"); 498c178816SStefano Zampini if (!mat->fwork) { 508c178816SStefano Zampini mat->lfwork = n; 518c178816SStefano Zampini ierr = PetscMalloc1(mat->lfwork,&mat->fwork);CHKERRQ(ierr); 528c178816SStefano Zampini ierr = PetscLogObjectMemory((PetscObject)A,mat->lfwork*sizeof(PetscBLASInt));CHKERRQ(ierr); 538c178816SStefano Zampini } 5400121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 558c178816SStefano Zampini PetscStackCallBLAS("LAPACKgetri",LAPACKgetri_(&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&mat->lfwork,&info)); 5600121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 57ca15aa20SStefano Zampini ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr); 588c178816SStefano Zampini } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 598c178816SStefano Zampini if (A->spd) { 6000121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 618c178816SStefano Zampini PetscStackCallBLAS("LAPACKpotri",LAPACKpotri_("L",&n,mat->v,&mat->lda,&info)); 6200121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 638c178816SStefano Zampini ierr = MatSeqDenseSymmetrize_Private(A,PETSC_TRUE);CHKERRQ(ierr); 648c178816SStefano Zampini #if defined(PETSC_USE_COMPLEX) 658c178816SStefano Zampini } else if (A->hermitian) { 668c178816SStefano Zampini if (!mat->pivots) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Pivots not present"); 678c178816SStefano Zampini if (!mat->fwork) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Fwork not present"); 6800121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 698c178816SStefano Zampini PetscStackCallBLAS("LAPACKhetri",LAPACKhetri_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&info)); 7000121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 718c178816SStefano Zampini ierr = MatSeqDenseSymmetrize_Private(A,PETSC_TRUE);CHKERRQ(ierr); 728c178816SStefano Zampini #endif 738c178816SStefano Zampini } else { /* symmetric case */ 748c178816SStefano Zampini if (!mat->pivots) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Pivots not present"); 758c178816SStefano Zampini if (!mat->fwork) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Fwork not present"); 7600121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 778c178816SStefano Zampini PetscStackCallBLAS("LAPACKsytri",LAPACKsytri_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&info)); 7800121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 798c178816SStefano Zampini ierr = MatSeqDenseSymmetrize_Private(A,PETSC_FALSE);CHKERRQ(ierr); 808c178816SStefano Zampini } 818c178816SStefano Zampini if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad Inversion: zero pivot in row %D",(PetscInt)info-1); 82ca15aa20SStefano Zampini ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr); 838c178816SStefano Zampini } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 848c178816SStefano Zampini 858c178816SStefano Zampini A->ops->solve = NULL; 868c178816SStefano Zampini A->ops->matsolve = NULL; 878c178816SStefano Zampini A->ops->solvetranspose = NULL; 888c178816SStefano Zampini A->ops->matsolvetranspose = NULL; 898c178816SStefano Zampini A->ops->solveadd = NULL; 908c178816SStefano Zampini A->ops->solvetransposeadd = NULL; 918c178816SStefano Zampini A->factortype = MAT_FACTOR_NONE; 928c178816SStefano Zampini ierr = PetscFree(A->solvertype);CHKERRQ(ierr); 938c178816SStefano Zampini PetscFunctionReturn(0); 948c178816SStefano Zampini } 958c178816SStefano Zampini 963f49a652SStefano Zampini PetscErrorCode MatZeroRowsColumns_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b) 973f49a652SStefano Zampini { 983f49a652SStefano Zampini PetscErrorCode ierr; 993f49a652SStefano Zampini Mat_SeqDense *l = (Mat_SeqDense*)A->data; 1003f49a652SStefano Zampini PetscInt m = l->lda, n = A->cmap->n,r = A->rmap->n, i,j; 101ca15aa20SStefano Zampini PetscScalar *slot,*bb,*v; 1023f49a652SStefano Zampini const PetscScalar *xx; 1033f49a652SStefano Zampini 1043f49a652SStefano Zampini PetscFunctionBegin; 10576bd3646SJed Brown if (PetscDefined(USE_DEBUG)) { 1063f49a652SStefano Zampini for (i=0; i<N; i++) { 1073f49a652SStefano Zampini if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed"); 1083f49a652SStefano Zampini if (rows[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row %D requested to be zeroed greater than or equal number of rows %D",rows[i],A->rmap->n); 1093f49a652SStefano Zampini if (rows[i] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Col %D requested to be zeroed greater than or equal number of cols %D",rows[i],A->cmap->n); 1103f49a652SStefano Zampini } 11176bd3646SJed Brown } 112ca15aa20SStefano Zampini if (!N) PetscFunctionReturn(0); 1133f49a652SStefano Zampini 1143f49a652SStefano Zampini /* fix right hand side if needed */ 1153f49a652SStefano Zampini if (x && b) { 1166c4d906cSStefano Zampini Vec xt; 1176c4d906cSStefano Zampini 1186c4d906cSStefano Zampini if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 1196c4d906cSStefano Zampini ierr = VecDuplicate(x,&xt);CHKERRQ(ierr); 1206c4d906cSStefano Zampini ierr = VecCopy(x,xt);CHKERRQ(ierr); 1216c4d906cSStefano Zampini ierr = VecScale(xt,-1.0);CHKERRQ(ierr); 1226c4d906cSStefano Zampini ierr = MatMultAdd(A,xt,b,b);CHKERRQ(ierr); 1236c4d906cSStefano Zampini ierr = VecDestroy(&xt);CHKERRQ(ierr); 1243f49a652SStefano Zampini ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 1253f49a652SStefano Zampini ierr = VecGetArray(b,&bb);CHKERRQ(ierr); 1263f49a652SStefano Zampini for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]]; 1273f49a652SStefano Zampini ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 1283f49a652SStefano Zampini ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr); 1293f49a652SStefano Zampini } 1303f49a652SStefano Zampini 131ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr); 1323f49a652SStefano Zampini for (i=0; i<N; i++) { 133ca15aa20SStefano Zampini slot = v + rows[i]*m; 134580bdb30SBarry Smith ierr = PetscArrayzero(slot,r);CHKERRQ(ierr); 1353f49a652SStefano Zampini } 1363f49a652SStefano Zampini for (i=0; i<N; i++) { 137ca15aa20SStefano Zampini slot = v + rows[i]; 1383f49a652SStefano Zampini for (j=0; j<n; j++) { *slot = 0.0; slot += m;} 1393f49a652SStefano Zampini } 1403f49a652SStefano Zampini if (diag != 0.0) { 1413f49a652SStefano Zampini if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 1423f49a652SStefano Zampini for (i=0; i<N; i++) { 143ca15aa20SStefano Zampini slot = v + (m+1)*rows[i]; 1443f49a652SStefano Zampini *slot = diag; 1453f49a652SStefano Zampini } 1463f49a652SStefano Zampini } 147ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr); 1483f49a652SStefano Zampini PetscFunctionReturn(0); 1493f49a652SStefano Zampini } 1503f49a652SStefano Zampini 151abc3b08eSStefano Zampini PetscErrorCode MatPtAPNumeric_SeqDense_SeqDense(Mat A,Mat P,Mat C) 152abc3b08eSStefano Zampini { 153abc3b08eSStefano Zampini Mat_SeqDense *c = (Mat_SeqDense*)(C->data); 154abc3b08eSStefano Zampini PetscErrorCode ierr; 155abc3b08eSStefano Zampini 156abc3b08eSStefano Zampini PetscFunctionBegin; 157ca15aa20SStefano Zampini if (c->ptapwork) { 158ca15aa20SStefano Zampini ierr = (*C->ops->matmultnumeric)(A,P,c->ptapwork);CHKERRQ(ierr); 159ca15aa20SStefano Zampini ierr = (*C->ops->transposematmultnumeric)(P,c->ptapwork,C);CHKERRQ(ierr); 1604222ddf1SHong Zhang } else SETERRQ(PetscObjectComm((PetscObject)C),PETSC_ERR_SUP,"Must call MatPtAPSymbolic_SeqDense_SeqDense() first"); 161abc3b08eSStefano Zampini PetscFunctionReturn(0); 162abc3b08eSStefano Zampini } 163abc3b08eSStefano Zampini 1644222ddf1SHong Zhang PetscErrorCode MatPtAPSymbolic_SeqDense_SeqDense(Mat A,Mat P,PetscReal fill,Mat C) 165abc3b08eSStefano Zampini { 166abc3b08eSStefano Zampini Mat_SeqDense *c; 1677a3c3d58SStefano Zampini PetscBool cisdense; 168abc3b08eSStefano Zampini PetscErrorCode ierr; 169abc3b08eSStefano Zampini 170abc3b08eSStefano Zampini PetscFunctionBegin; 1714222ddf1SHong Zhang ierr = MatSetSizes(C,P->cmap->n,P->cmap->n,P->cmap->N,P->cmap->N);CHKERRQ(ierr); 1727a3c3d58SStefano Zampini ierr = PetscObjectTypeCompareAny((PetscObject)C,&cisdense,MATSEQDENSE,MATSEQDENSECUDA,"");CHKERRQ(ierr); 1737a3c3d58SStefano Zampini if (!cisdense) { 1747a3c3d58SStefano Zampini PetscBool flg; 1757a3c3d58SStefano Zampini 1767a3c3d58SStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)P,((PetscObject)A)->type_name,&flg);CHKERRQ(ierr); 1774222ddf1SHong Zhang ierr = MatSetType(C,flg ? ((PetscObject)A)->type_name : MATDENSE);CHKERRQ(ierr); 1787a3c3d58SStefano Zampini } 1797a3c3d58SStefano Zampini ierr = MatSetUp(C);CHKERRQ(ierr); 1804222ddf1SHong Zhang c = (Mat_SeqDense*)C->data; 181ca15aa20SStefano Zampini ierr = MatCreate(PetscObjectComm((PetscObject)A),&c->ptapwork);CHKERRQ(ierr); 182ca15aa20SStefano Zampini ierr = MatSetSizes(c->ptapwork,A->rmap->n,P->cmap->n,A->rmap->N,P->cmap->N);CHKERRQ(ierr); 1837a3c3d58SStefano Zampini ierr = MatSetType(c->ptapwork,((PetscObject)C)->type_name);CHKERRQ(ierr); 1847a3c3d58SStefano Zampini ierr = MatSetUp(c->ptapwork);CHKERRQ(ierr); 185abc3b08eSStefano Zampini PetscFunctionReturn(0); 186abc3b08eSStefano Zampini } 187abc3b08eSStefano Zampini 188cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqAIJ_SeqDense(Mat A,MatType newtype,MatReuse reuse,Mat *newmat) 189b49cda9fSStefano Zampini { 190a13144ffSStefano Zampini Mat B = NULL; 191b49cda9fSStefano Zampini Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 192b49cda9fSStefano Zampini Mat_SeqDense *b; 193b49cda9fSStefano Zampini PetscErrorCode ierr; 194b49cda9fSStefano Zampini PetscInt *ai=a->i,*aj=a->j,m=A->rmap->N,n=A->cmap->N,i; 195b49cda9fSStefano Zampini MatScalar *av=a->a; 196a13144ffSStefano Zampini PetscBool isseqdense; 197b49cda9fSStefano Zampini 198b49cda9fSStefano Zampini PetscFunctionBegin; 199a13144ffSStefano Zampini if (reuse == MAT_REUSE_MATRIX) { 200a13144ffSStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)*newmat,MATSEQDENSE,&isseqdense);CHKERRQ(ierr); 201a32993e3SJed Brown if (!isseqdense) SETERRQ1(PetscObjectComm((PetscObject)*newmat),PETSC_ERR_USER,"Cannot reuse matrix of type %s",((PetscObject)(*newmat))->type_name); 202a13144ffSStefano Zampini } 203a13144ffSStefano Zampini if (reuse != MAT_REUSE_MATRIX) { 204b49cda9fSStefano Zampini ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); 205b49cda9fSStefano Zampini ierr = MatSetSizes(B,m,n,m,n);CHKERRQ(ierr); 206b49cda9fSStefano Zampini ierr = MatSetType(B,MATSEQDENSE);CHKERRQ(ierr); 207b49cda9fSStefano Zampini ierr = MatSeqDenseSetPreallocation(B,NULL);CHKERRQ(ierr); 208b49cda9fSStefano Zampini b = (Mat_SeqDense*)(B->data); 209a13144ffSStefano Zampini } else { 210a13144ffSStefano Zampini b = (Mat_SeqDense*)((*newmat)->data); 211580bdb30SBarry Smith ierr = PetscArrayzero(b->v,m*n);CHKERRQ(ierr); 212a13144ffSStefano Zampini } 213b49cda9fSStefano Zampini for (i=0; i<m; i++) { 214b49cda9fSStefano Zampini PetscInt j; 215b49cda9fSStefano Zampini for (j=0;j<ai[1]-ai[0];j++) { 216b49cda9fSStefano Zampini b->v[*aj*m+i] = *av; 217b49cda9fSStefano Zampini aj++; 218b49cda9fSStefano Zampini av++; 219b49cda9fSStefano Zampini } 220b49cda9fSStefano Zampini ai++; 221b49cda9fSStefano Zampini } 222b49cda9fSStefano Zampini 223511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 224a13144ffSStefano Zampini ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 225a13144ffSStefano Zampini ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 22628be2f97SBarry Smith ierr = MatHeaderReplace(A,&B);CHKERRQ(ierr); 227b49cda9fSStefano Zampini } else { 228a13144ffSStefano Zampini if (B) *newmat = B; 229a13144ffSStefano Zampini ierr = MatAssemblyBegin(*newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 230a13144ffSStefano Zampini ierr = MatAssemblyEnd(*newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 231b49cda9fSStefano Zampini } 232b49cda9fSStefano Zampini PetscFunctionReturn(0); 233b49cda9fSStefano Zampini } 234b49cda9fSStefano Zampini 235cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqDense_SeqAIJ(Mat A, MatType newtype,MatReuse reuse,Mat *newmat) 2366a63e612SBarry Smith { 2376a63e612SBarry Smith Mat B; 2386a63e612SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2396a63e612SBarry Smith PetscErrorCode ierr; 2409399e1b8SMatthew G. Knepley PetscInt i, j; 2419399e1b8SMatthew G. Knepley PetscInt *rows, *nnz; 2429399e1b8SMatthew G. Knepley MatScalar *aa = a->v, *vals; 2436a63e612SBarry Smith 2446a63e612SBarry Smith PetscFunctionBegin; 245ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); 2466a63e612SBarry Smith ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 2476a63e612SBarry Smith ierr = MatSetType(B,MATSEQAIJ);CHKERRQ(ierr); 2489399e1b8SMatthew G. Knepley ierr = PetscCalloc3(A->rmap->n,&rows,A->rmap->n,&nnz,A->rmap->n,&vals);CHKERRQ(ierr); 2499399e1b8SMatthew G. Knepley for (j=0; j<A->cmap->n; j++) { 2509399e1b8SMatthew G. Knepley for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) ++nnz[i]; 2516a63e612SBarry Smith aa += a->lda; 2526a63e612SBarry Smith } 2539399e1b8SMatthew G. Knepley ierr = MatSeqAIJSetPreallocation(B,PETSC_DETERMINE,nnz);CHKERRQ(ierr); 2549399e1b8SMatthew G. Knepley aa = a->v; 2559399e1b8SMatthew G. Knepley for (j=0; j<A->cmap->n; j++) { 2569399e1b8SMatthew G. Knepley PetscInt numRows = 0; 2579399e1b8SMatthew G. Knepley for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) {rows[numRows] = i; vals[numRows++] = aa[i];} 2589399e1b8SMatthew G. Knepley ierr = MatSetValues(B,numRows,rows,1,&j,vals,INSERT_VALUES);CHKERRQ(ierr); 2599399e1b8SMatthew G. Knepley aa += a->lda; 2609399e1b8SMatthew G. Knepley } 2619399e1b8SMatthew G. Knepley ierr = PetscFree3(rows,nnz,vals);CHKERRQ(ierr); 2626a63e612SBarry Smith ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2636a63e612SBarry Smith ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2646a63e612SBarry Smith 265511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 26628be2f97SBarry Smith ierr = MatHeaderReplace(A,&B);CHKERRQ(ierr); 2676a63e612SBarry Smith } else { 2686a63e612SBarry Smith *newmat = B; 2696a63e612SBarry Smith } 2706a63e612SBarry Smith PetscFunctionReturn(0); 2716a63e612SBarry Smith } 2726a63e612SBarry Smith 273ca15aa20SStefano Zampini PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str) 2741987afe7SBarry Smith { 2751987afe7SBarry Smith Mat_SeqDense *x = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data; 276ca15aa20SStefano Zampini const PetscScalar *xv; 277ca15aa20SStefano Zampini PetscScalar *yv; 2780805154bSBarry Smith PetscBLASInt N,m,ldax,lday,one = 1; 279efee365bSSatish Balay PetscErrorCode ierr; 2803a40ed3dSBarry Smith 2813a40ed3dSBarry Smith PetscFunctionBegin; 282ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(X,&xv);CHKERRQ(ierr); 283ca15aa20SStefano Zampini ierr = MatDenseGetArray(Y,&yv);CHKERRQ(ierr); 284c5df96a5SBarry Smith ierr = PetscBLASIntCast(X->rmap->n*X->cmap->n,&N);CHKERRQ(ierr); 285c5df96a5SBarry Smith ierr = PetscBLASIntCast(X->rmap->n,&m);CHKERRQ(ierr); 286c5df96a5SBarry Smith ierr = PetscBLASIntCast(x->lda,&ldax);CHKERRQ(ierr); 287c5df96a5SBarry Smith ierr = PetscBLASIntCast(y->lda,&lday);CHKERRQ(ierr); 288a5ce6ee0Svictorle if (ldax>m || lday>m) { 289ca15aa20SStefano Zampini PetscInt j; 290ca15aa20SStefano Zampini 291d0f46423SBarry Smith for (j=0; j<X->cmap->n; j++) { 292ca15aa20SStefano Zampini PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&m,&alpha,xv+j*ldax,&one,yv+j*lday,&one)); 293a5ce6ee0Svictorle } 294a5ce6ee0Svictorle } else { 295ca15aa20SStefano Zampini PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&N,&alpha,xv,&one,yv,&one)); 296a5ce6ee0Svictorle } 297ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(X,&xv);CHKERRQ(ierr); 298ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(Y,&yv);CHKERRQ(ierr); 2990450473dSBarry Smith ierr = PetscLogFlops(PetscMax(2*N-1,0));CHKERRQ(ierr); 3003a40ed3dSBarry Smith PetscFunctionReturn(0); 3011987afe7SBarry Smith } 3021987afe7SBarry Smith 303e0877f53SBarry Smith static PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info) 304289bc588SBarry Smith { 305ca15aa20SStefano Zampini PetscLogDouble N = A->rmap->n*A->cmap->n; 3063a40ed3dSBarry Smith 3073a40ed3dSBarry Smith PetscFunctionBegin; 3084e220ebcSLois Curfman McInnes info->block_size = 1.0; 309ca15aa20SStefano Zampini info->nz_allocated = N; 310ca15aa20SStefano Zampini info->nz_used = N; 311ca15aa20SStefano Zampini info->nz_unneeded = 0; 312ca15aa20SStefano Zampini info->assemblies = A->num_ass; 3134e220ebcSLois Curfman McInnes info->mallocs = 0; 3147adad957SLisandro Dalcin info->memory = ((PetscObject)A)->mem; 3154e220ebcSLois Curfman McInnes info->fill_ratio_given = 0; 3164e220ebcSLois Curfman McInnes info->fill_ratio_needed = 0; 3174e220ebcSLois Curfman McInnes info->factor_mallocs = 0; 3183a40ed3dSBarry Smith PetscFunctionReturn(0); 319289bc588SBarry Smith } 320289bc588SBarry Smith 321637a0070SStefano Zampini PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha) 32280cd9d93SLois Curfman McInnes { 323273d9f13SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 324ca15aa20SStefano Zampini PetscScalar *v; 325efee365bSSatish Balay PetscErrorCode ierr; 326c5df96a5SBarry Smith PetscBLASInt one = 1,j,nz,lda; 32780cd9d93SLois Curfman McInnes 3283a40ed3dSBarry Smith PetscFunctionBegin; 329ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr); 330c5df96a5SBarry Smith ierr = PetscBLASIntCast(a->lda,&lda);CHKERRQ(ierr); 331d0f46423SBarry Smith if (lda>A->rmap->n) { 332c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&nz);CHKERRQ(ierr); 333d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 334ca15aa20SStefano Zampini PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&alpha,v+j*lda,&one)); 335a5ce6ee0Svictorle } 336a5ce6ee0Svictorle } else { 337c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n*A->cmap->n,&nz);CHKERRQ(ierr); 338ca15aa20SStefano Zampini PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&alpha,v,&one)); 339a5ce6ee0Svictorle } 340efee365bSSatish Balay ierr = PetscLogFlops(nz);CHKERRQ(ierr); 341ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr); 3423a40ed3dSBarry Smith PetscFunctionReturn(0); 34380cd9d93SLois Curfman McInnes } 34480cd9d93SLois Curfman McInnes 345e0877f53SBarry Smith static PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscBool *fl) 3461cbb95d3SBarry Smith { 3471cbb95d3SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 348ca15aa20SStefano Zampini PetscInt i,j,m = A->rmap->n,N = a->lda; 349ca15aa20SStefano Zampini const PetscScalar *v; 350ca15aa20SStefano Zampini PetscErrorCode ierr; 3511cbb95d3SBarry Smith 3521cbb95d3SBarry Smith PetscFunctionBegin; 3531cbb95d3SBarry Smith *fl = PETSC_FALSE; 354d0f46423SBarry Smith if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0); 355ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&v);CHKERRQ(ierr); 3561cbb95d3SBarry Smith for (i=0; i<m; i++) { 357ca15aa20SStefano Zampini for (j=i; j<m; j++) { 358637a0070SStefano Zampini if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) { 359637a0070SStefano Zampini goto restore; 3601cbb95d3SBarry Smith } 3611cbb95d3SBarry Smith } 362637a0070SStefano Zampini } 3631cbb95d3SBarry Smith *fl = PETSC_TRUE; 364637a0070SStefano Zampini restore: 365637a0070SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&v);CHKERRQ(ierr); 366637a0070SStefano Zampini PetscFunctionReturn(0); 367637a0070SStefano Zampini } 368637a0070SStefano Zampini 369637a0070SStefano Zampini static PetscErrorCode MatIsSymmetric_SeqDense(Mat A,PetscReal rtol,PetscBool *fl) 370637a0070SStefano Zampini { 371637a0070SStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 372637a0070SStefano Zampini PetscInt i,j,m = A->rmap->n,N = a->lda; 373637a0070SStefano Zampini const PetscScalar *v; 374637a0070SStefano Zampini PetscErrorCode ierr; 375637a0070SStefano Zampini 376637a0070SStefano Zampini PetscFunctionBegin; 377637a0070SStefano Zampini *fl = PETSC_FALSE; 378637a0070SStefano Zampini if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0); 379637a0070SStefano Zampini ierr = MatDenseGetArrayRead(A,&v);CHKERRQ(ierr); 380637a0070SStefano Zampini for (i=0; i<m; i++) { 381637a0070SStefano Zampini for (j=i; j<m; j++) { 382637a0070SStefano Zampini if (PetscAbsScalar(v[i+j*N] - v[j+i*N]) > rtol) { 383637a0070SStefano Zampini goto restore; 384637a0070SStefano Zampini } 385637a0070SStefano Zampini } 386637a0070SStefano Zampini } 387637a0070SStefano Zampini *fl = PETSC_TRUE; 388637a0070SStefano Zampini restore: 389637a0070SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&v);CHKERRQ(ierr); 3901cbb95d3SBarry Smith PetscFunctionReturn(0); 3911cbb95d3SBarry Smith } 3921cbb95d3SBarry Smith 393ca15aa20SStefano Zampini PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat newi,Mat A,MatDuplicateOption cpvalues) 394b24902e0SBarry Smith { 395ca15aa20SStefano Zampini Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 396b24902e0SBarry Smith PetscErrorCode ierr; 39723fc5dcaSStefano Zampini PetscInt lda = (PetscInt)mat->lda,j,m,nlda = lda; 398b24902e0SBarry Smith 399b24902e0SBarry Smith PetscFunctionBegin; 400aa5ea44dSBarry Smith ierr = PetscLayoutReference(A->rmap,&newi->rmap);CHKERRQ(ierr); 401aa5ea44dSBarry Smith ierr = PetscLayoutReference(A->cmap,&newi->cmap);CHKERRQ(ierr); 40223fc5dcaSStefano Zampini if (cpvalues == MAT_SHARE_NONZERO_PATTERN) { /* propagate LDA */ 40323fc5dcaSStefano Zampini ierr = MatDenseSetLDA(newi,lda);CHKERRQ(ierr); 40423fc5dcaSStefano Zampini } 4050298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newi,NULL);CHKERRQ(ierr); 406b24902e0SBarry Smith if (cpvalues == MAT_COPY_VALUES) { 407ca15aa20SStefano Zampini const PetscScalar *av; 408ca15aa20SStefano Zampini PetscScalar *v; 409ca15aa20SStefano Zampini 410ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&av);CHKERRQ(ierr); 411ca15aa20SStefano Zampini ierr = MatDenseGetArray(newi,&v);CHKERRQ(ierr); 41223fc5dcaSStefano Zampini ierr = MatDenseGetLDA(newi,&nlda);CHKERRQ(ierr); 413d0f46423SBarry Smith m = A->rmap->n; 41423fc5dcaSStefano Zampini if (lda>m || nlda>m) { 415d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 41623fc5dcaSStefano Zampini ierr = PetscArraycpy(v+j*nlda,av+j*lda,m);CHKERRQ(ierr); 417b24902e0SBarry Smith } 418b24902e0SBarry Smith } else { 419ca15aa20SStefano Zampini ierr = PetscArraycpy(v,av,A->rmap->n*A->cmap->n);CHKERRQ(ierr); 420b24902e0SBarry Smith } 421ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(newi,&v);CHKERRQ(ierr); 422ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&av);CHKERRQ(ierr); 423b24902e0SBarry Smith } 424b24902e0SBarry Smith PetscFunctionReturn(0); 425b24902e0SBarry Smith } 426b24902e0SBarry Smith 427ca15aa20SStefano Zampini PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat) 42802cad45dSBarry Smith { 4296849ba73SBarry Smith PetscErrorCode ierr; 43002cad45dSBarry Smith 4313a40ed3dSBarry Smith PetscFunctionBegin; 432ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),newmat);CHKERRQ(ierr); 433d0f46423SBarry Smith ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 4345c9eb25fSBarry Smith ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 435719d5645SBarry Smith ierr = MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues);CHKERRQ(ierr); 436b24902e0SBarry Smith PetscFunctionReturn(0); 437b24902e0SBarry Smith } 438b24902e0SBarry Smith 439e0877f53SBarry Smith static PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 440289bc588SBarry Smith { 4414482741eSBarry Smith MatFactorInfo info; 442a093e273SMatthew Knepley PetscErrorCode ierr; 4433a40ed3dSBarry Smith 4443a40ed3dSBarry Smith PetscFunctionBegin; 445c3ef05f6SHong Zhang ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 446ca15aa20SStefano Zampini ierr = (*fact->ops->lufactor)(fact,0,0,&info);CHKERRQ(ierr); 4473a40ed3dSBarry Smith PetscFunctionReturn(0); 448289bc588SBarry Smith } 4496ee01492SSatish Balay 450e0877f53SBarry Smith static PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy) 451289bc588SBarry Smith { 452c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 4536849ba73SBarry Smith PetscErrorCode ierr; 454f1ceaac6SMatthew G. Knepley const PetscScalar *x; 455f1ceaac6SMatthew G. Knepley PetscScalar *y; 456c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 45767e560aaSBarry Smith 4583a40ed3dSBarry Smith PetscFunctionBegin; 459c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 460f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 4611ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 462580bdb30SBarry Smith ierr = PetscArraycpy(y,x,A->rmap->n);CHKERRQ(ierr); 463d5f3da31SBarry Smith if (A->factortype == MAT_FACTOR_LU) { 46400121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 4658b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 46600121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 467e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 468d5f3da31SBarry Smith } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 469a49dc2a2SStefano Zampini if (A->spd) { 47000121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 4718b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 47200121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 473e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 474a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX) 475a49dc2a2SStefano Zampini } else if (A->hermitian) { 47600121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 477a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKhetrs",LAPACKhetrs_("L",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 47800121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 479a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"HETRS Bad solve"); 480a49dc2a2SStefano Zampini #endif 481a49dc2a2SStefano Zampini } else { /* symmetric case */ 48200121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 483a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrs",LAPACKsytrs_("L",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 48400121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 485a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"SYTRS Bad solve"); 486a49dc2a2SStefano Zampini } 4872205254eSKarl Rupp } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 488f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 4891ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 490dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 4913a40ed3dSBarry Smith PetscFunctionReturn(0); 492289bc588SBarry Smith } 4936ee01492SSatish Balay 494e0877f53SBarry Smith static PetscErrorCode MatMatSolve_SeqDense(Mat A,Mat B,Mat X) 49585e2c93fSHong Zhang { 49685e2c93fSHong Zhang Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 49785e2c93fSHong Zhang PetscErrorCode ierr; 4981683a169SBarry Smith const PetscScalar *b; 4991683a169SBarry Smith PetscScalar *x; 500efb80c78SLisandro Dalcin PetscInt n; 501783b601eSJed Brown PetscBLASInt nrhs,info,m; 50285e2c93fSHong Zhang 50385e2c93fSHong Zhang PetscFunctionBegin; 504c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 5050298fd71SBarry Smith ierr = MatGetSize(B,NULL,&n);CHKERRQ(ierr); 506c5df96a5SBarry Smith ierr = PetscBLASIntCast(n,&nrhs);CHKERRQ(ierr); 5071683a169SBarry Smith ierr = MatDenseGetArrayRead(B,&b);CHKERRQ(ierr); 5088c778c55SBarry Smith ierr = MatDenseGetArray(X,&x);CHKERRQ(ierr); 50985e2c93fSHong Zhang 510580bdb30SBarry Smith ierr = PetscArraycpy(x,b,m*nrhs);CHKERRQ(ierr); 51185e2c93fSHong Zhang 51285e2c93fSHong Zhang if (A->factortype == MAT_FACTOR_LU) { 51300121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 5148b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info)); 51500121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 51685e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 51785e2c93fSHong Zhang } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 518a49dc2a2SStefano Zampini if (A->spd) { 51900121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 5208b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info)); 52100121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 52285e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 523a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX) 524a49dc2a2SStefano Zampini } else if (A->hermitian) { 52500121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 526a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKhetrs",LAPACKhetrs_("L",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info)); 52700121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 528a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"HETRS Bad solve"); 529a49dc2a2SStefano Zampini #endif 530a49dc2a2SStefano Zampini } else { /* symmetric case */ 53100121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 532a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrs",LAPACKsytrs_("L",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info)); 53300121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 534a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"SYTRS Bad solve"); 535a49dc2a2SStefano Zampini } 5362205254eSKarl Rupp } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 53785e2c93fSHong Zhang 5381683a169SBarry Smith ierr = MatDenseRestoreArrayRead(B,&b);CHKERRQ(ierr); 5398c778c55SBarry Smith ierr = MatDenseRestoreArray(X,&x);CHKERRQ(ierr); 54085e2c93fSHong Zhang ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr); 54185e2c93fSHong Zhang PetscFunctionReturn(0); 54285e2c93fSHong Zhang } 54385e2c93fSHong Zhang 54400121966SStefano Zampini static PetscErrorCode MatConjugate_SeqDense(Mat); 54500121966SStefano Zampini 546e0877f53SBarry Smith static PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy) 547da3a660dSBarry Smith { 548c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 549dfbe8321SBarry Smith PetscErrorCode ierr; 550f1ceaac6SMatthew G. Knepley const PetscScalar *x; 551f1ceaac6SMatthew G. Knepley PetscScalar *y; 552c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 55367e560aaSBarry Smith 5543a40ed3dSBarry Smith PetscFunctionBegin; 555c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 556f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 5571ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 558580bdb30SBarry Smith ierr = PetscArraycpy(y,x,A->rmap->n);CHKERRQ(ierr); 5598208b9aeSStefano Zampini if (A->factortype == MAT_FACTOR_LU) { 56000121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 5618b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 56200121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 563e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve"); 5648208b9aeSStefano Zampini } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 565a49dc2a2SStefano Zampini if (A->spd) { 56600121966SStefano Zampini #if defined(PETSC_USE_COMPLEX) 56700121966SStefano Zampini ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr); 56800121966SStefano Zampini #endif 56900121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 5708b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 57100121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 57200121966SStefano Zampini #if defined(PETSC_USE_COMPLEX) 57300121966SStefano Zampini ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr); 57400121966SStefano Zampini #endif 575a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 576a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX) 577a49dc2a2SStefano Zampini } else if (A->hermitian) { 57800121966SStefano Zampini ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr); 57900121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 58000121966SStefano Zampini PetscStackCallBLAS("LAPACKhetrs",LAPACKhetrs_("L",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 58100121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 58200121966SStefano Zampini ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr); 583ae7cfcebSSatish Balay #endif 584a49dc2a2SStefano Zampini } else { /* symmetric case */ 58500121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 586a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrs",LAPACKsytrs_("L",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 58700121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 588a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"SYTRS Bad solve"); 589da3a660dSBarry Smith } 590a49dc2a2SStefano Zampini } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 591f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 5921ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 593dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 5943a40ed3dSBarry Smith PetscFunctionReturn(0); 595da3a660dSBarry Smith } 5966ee01492SSatish Balay 597db4efbfdSBarry Smith /* ---------------------------------------------------------------*/ 598db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots, 599db4efbfdSBarry Smith rather than put it in the Mat->row slot.*/ 600ca15aa20SStefano Zampini PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo) 601db4efbfdSBarry Smith { 602db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 603db4efbfdSBarry Smith PetscErrorCode ierr; 604db4efbfdSBarry Smith PetscBLASInt n,m,info; 605db4efbfdSBarry Smith 606db4efbfdSBarry Smith PetscFunctionBegin; 607c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 608c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 609db4efbfdSBarry Smith if (!mat->pivots) { 6108208b9aeSStefano Zampini ierr = PetscMalloc1(A->rmap->n,&mat->pivots);CHKERRQ(ierr); 6113bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr); 612db4efbfdSBarry Smith } 613db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 6148e57ea43SSatish Balay ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 6158b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrf",LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info)); 6168e57ea43SSatish Balay ierr = PetscFPTrapPop();CHKERRQ(ierr); 6178e57ea43SSatish Balay 618e32f2f54SBarry Smith if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization"); 619e32f2f54SBarry Smith if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization"); 6208208b9aeSStefano Zampini 621db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 6228208b9aeSStefano Zampini A->ops->matsolve = MatMatSolve_SeqDense; 623db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 624d5f3da31SBarry Smith A->factortype = MAT_FACTOR_LU; 625db4efbfdSBarry Smith 626f6224b95SHong Zhang ierr = PetscFree(A->solvertype);CHKERRQ(ierr); 627f6224b95SHong Zhang ierr = PetscStrallocpy(MATSOLVERPETSC,&A->solvertype);CHKERRQ(ierr); 628f6224b95SHong Zhang 629dc0b31edSSatish Balay ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr); 630db4efbfdSBarry Smith PetscFunctionReturn(0); 631db4efbfdSBarry Smith } 632db4efbfdSBarry Smith 633a49dc2a2SStefano Zampini /* Cholesky as L*L^T or L*D*L^T and the symmetric/hermitian complex variants */ 634ca15aa20SStefano Zampini PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo) 635db4efbfdSBarry Smith { 636db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 637db4efbfdSBarry Smith PetscErrorCode ierr; 638c5df96a5SBarry Smith PetscBLASInt info,n; 639db4efbfdSBarry Smith 640db4efbfdSBarry Smith PetscFunctionBegin; 641c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 642db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 643a49dc2a2SStefano Zampini if (A->spd) { 64400121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 6458b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrf",LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info)); 64600121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 647a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX) 648a49dc2a2SStefano Zampini } else if (A->hermitian) { 649a49dc2a2SStefano Zampini if (!mat->pivots) { 650a49dc2a2SStefano Zampini ierr = PetscMalloc1(A->rmap->n,&mat->pivots);CHKERRQ(ierr); 651a49dc2a2SStefano Zampini ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr); 652a49dc2a2SStefano Zampini } 653a49dc2a2SStefano Zampini if (!mat->fwork) { 654a49dc2a2SStefano Zampini PetscScalar dummy; 655a49dc2a2SStefano Zampini 656a49dc2a2SStefano Zampini mat->lfwork = -1; 65700121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 658a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKhetrf",LAPACKhetrf_("L",&n,mat->v,&mat->lda,mat->pivots,&dummy,&mat->lfwork,&info)); 65900121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 660a49dc2a2SStefano Zampini mat->lfwork = (PetscInt)PetscRealPart(dummy); 661a49dc2a2SStefano Zampini ierr = PetscMalloc1(mat->lfwork,&mat->fwork);CHKERRQ(ierr); 662a49dc2a2SStefano Zampini ierr = PetscLogObjectMemory((PetscObject)A,mat->lfwork*sizeof(PetscBLASInt));CHKERRQ(ierr); 663a49dc2a2SStefano Zampini } 66400121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 665a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKhetrf",LAPACKhetrf_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&mat->lfwork,&info)); 66600121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 667a49dc2a2SStefano Zampini #endif 668a49dc2a2SStefano Zampini } else { /* symmetric case */ 669a49dc2a2SStefano Zampini if (!mat->pivots) { 670a49dc2a2SStefano Zampini ierr = PetscMalloc1(A->rmap->n,&mat->pivots);CHKERRQ(ierr); 671a49dc2a2SStefano Zampini ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr); 672a49dc2a2SStefano Zampini } 673a49dc2a2SStefano Zampini if (!mat->fwork) { 674a49dc2a2SStefano Zampini PetscScalar dummy; 675a49dc2a2SStefano Zampini 676a49dc2a2SStefano Zampini mat->lfwork = -1; 67700121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 678a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrf",LAPACKsytrf_("L",&n,mat->v,&mat->lda,mat->pivots,&dummy,&mat->lfwork,&info)); 67900121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 680a49dc2a2SStefano Zampini mat->lfwork = (PetscInt)PetscRealPart(dummy); 681a49dc2a2SStefano Zampini ierr = PetscMalloc1(mat->lfwork,&mat->fwork);CHKERRQ(ierr); 682a49dc2a2SStefano Zampini ierr = PetscLogObjectMemory((PetscObject)A,mat->lfwork*sizeof(PetscBLASInt));CHKERRQ(ierr); 683a49dc2a2SStefano Zampini } 68400121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 685a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrf",LAPACKsytrf_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&mat->lfwork,&info)); 68600121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 687a49dc2a2SStefano Zampini } 688e32f2f54SBarry Smith if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1); 6898208b9aeSStefano Zampini 690db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 6918208b9aeSStefano Zampini A->ops->matsolve = MatMatSolve_SeqDense; 692db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 693d5f3da31SBarry Smith A->factortype = MAT_FACTOR_CHOLESKY; 6942205254eSKarl Rupp 695f6224b95SHong Zhang ierr = PetscFree(A->solvertype);CHKERRQ(ierr); 696f6224b95SHong Zhang ierr = PetscStrallocpy(MATSOLVERPETSC,&A->solvertype);CHKERRQ(ierr); 697f6224b95SHong Zhang 698eb3f19e4SBarry Smith ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr); 699db4efbfdSBarry Smith PetscFunctionReturn(0); 700db4efbfdSBarry Smith } 701db4efbfdSBarry Smith 7020481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 703db4efbfdSBarry Smith { 704db4efbfdSBarry Smith PetscErrorCode ierr; 705db4efbfdSBarry Smith MatFactorInfo info; 706db4efbfdSBarry Smith 707db4efbfdSBarry Smith PetscFunctionBegin; 708db4efbfdSBarry Smith info.fill = 1.0; 7092205254eSKarl Rupp 710c3ef05f6SHong Zhang ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 711ca15aa20SStefano Zampini ierr = (*fact->ops->choleskyfactor)(fact,0,&info);CHKERRQ(ierr); 712db4efbfdSBarry Smith PetscFunctionReturn(0); 713db4efbfdSBarry Smith } 714db4efbfdSBarry Smith 715ca15aa20SStefano Zampini PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info) 716db4efbfdSBarry Smith { 717db4efbfdSBarry Smith PetscFunctionBegin; 718c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 7191bbcc794SSatish Balay fact->preallocated = PETSC_TRUE; 720719d5645SBarry Smith fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense; 721bd443b22SStefano Zampini fact->ops->solve = MatSolve_SeqDense; 722bd443b22SStefano Zampini fact->ops->matsolve = MatMatSolve_SeqDense; 723bd443b22SStefano Zampini fact->ops->solvetranspose = MatSolveTranspose_SeqDense; 724db4efbfdSBarry Smith PetscFunctionReturn(0); 725db4efbfdSBarry Smith } 726db4efbfdSBarry Smith 727ca15aa20SStefano Zampini PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info) 728db4efbfdSBarry Smith { 729db4efbfdSBarry Smith PetscFunctionBegin; 730b66fe19dSMatthew G Knepley fact->preallocated = PETSC_TRUE; 731c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 732719d5645SBarry Smith fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense; 733bd443b22SStefano Zampini fact->ops->solve = MatSolve_SeqDense; 734bd443b22SStefano Zampini fact->ops->matsolve = MatMatSolve_SeqDense; 735bd443b22SStefano Zampini fact->ops->solvetranspose = MatSolveTranspose_SeqDense; 736db4efbfdSBarry Smith PetscFunctionReturn(0); 737db4efbfdSBarry Smith } 738db4efbfdSBarry Smith 739ca15aa20SStefano Zampini /* uses LAPACK */ 740cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact) 741db4efbfdSBarry Smith { 742db4efbfdSBarry Smith PetscErrorCode ierr; 743db4efbfdSBarry Smith 744db4efbfdSBarry Smith PetscFunctionBegin; 745ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),fact);CHKERRQ(ierr); 746db4efbfdSBarry Smith ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 747ca15aa20SStefano Zampini ierr = MatSetType(*fact,MATDENSE);CHKERRQ(ierr); 748db4efbfdSBarry Smith if (ftype == MAT_FACTOR_LU) { 749db4efbfdSBarry Smith (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense; 750db4efbfdSBarry Smith } else { 751db4efbfdSBarry Smith (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense; 752db4efbfdSBarry Smith } 753d5f3da31SBarry Smith (*fact)->factortype = ftype; 75400c67f3bSHong Zhang 75500c67f3bSHong Zhang ierr = PetscFree((*fact)->solvertype);CHKERRQ(ierr); 75600c67f3bSHong Zhang ierr = PetscStrallocpy(MATSOLVERPETSC,&(*fact)->solvertype);CHKERRQ(ierr); 757db4efbfdSBarry Smith PetscFunctionReturn(0); 758db4efbfdSBarry Smith } 759db4efbfdSBarry Smith 760289bc588SBarry Smith /* ------------------------------------------------------------------*/ 761e0877f53SBarry Smith static PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx) 762289bc588SBarry Smith { 763c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 764d9ca1df4SBarry Smith PetscScalar *x,*v = mat->v,zero = 0.0,xt; 765d9ca1df4SBarry Smith const PetscScalar *b; 766dfbe8321SBarry Smith PetscErrorCode ierr; 767d0f46423SBarry Smith PetscInt m = A->rmap->n,i; 768c5df96a5SBarry Smith PetscBLASInt o = 1,bm; 769289bc588SBarry Smith 7703a40ed3dSBarry Smith PetscFunctionBegin; 771ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA) 772c70f7ee4SJunchao Zhang if (A->offloadmask == PETSC_OFFLOAD_GPU) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Not implemented"); 773ca15aa20SStefano Zampini #endif 774422a814eSBarry Smith if (shift == -1) shift = 0.0; /* negative shift indicates do not error on zero diagonal; this code never zeros on zero diagonal */ 775c5df96a5SBarry Smith ierr = PetscBLASIntCast(m,&bm);CHKERRQ(ierr); 776289bc588SBarry Smith if (flag & SOR_ZERO_INITIAL_GUESS) { 7773bffc371SBarry Smith /* this is a hack fix, should have another version without the second BLASdotu */ 7782dcb1b2aSMatthew Knepley ierr = VecSet(xx,zero);CHKERRQ(ierr); 779289bc588SBarry Smith } 7801ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 781d9ca1df4SBarry Smith ierr = VecGetArrayRead(bb,&b);CHKERRQ(ierr); 782b965ef7fSBarry Smith its = its*lits; 783e32f2f54SBarry Smith if (its <= 0) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Relaxation requires global its %D and local its %D both positive",its,lits); 784289bc588SBarry Smith while (its--) { 785fccaa45eSBarry Smith if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) { 786289bc588SBarry Smith for (i=0; i<m; i++) { 7873bffc371SBarry Smith PetscStackCallBLAS("BLASdotu",xt = b[i] - BLASdotu_(&bm,v+i,&bm,x,&o)); 78855a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 789289bc588SBarry Smith } 790289bc588SBarry Smith } 791fccaa45eSBarry Smith if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) { 792289bc588SBarry Smith for (i=m-1; i>=0; i--) { 7933bffc371SBarry Smith PetscStackCallBLAS("BLASdotu",xt = b[i] - BLASdotu_(&bm,v+i,&bm,x,&o)); 79455a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 795289bc588SBarry Smith } 796289bc588SBarry Smith } 797289bc588SBarry Smith } 798d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(bb,&b);CHKERRQ(ierr); 7991ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 8003a40ed3dSBarry Smith PetscFunctionReturn(0); 801289bc588SBarry Smith } 802289bc588SBarry Smith 803289bc588SBarry Smith /* -----------------------------------------------------------------*/ 804ca15aa20SStefano Zampini PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy) 805289bc588SBarry Smith { 806c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 807d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 808d9ca1df4SBarry Smith PetscScalar *y; 809dfbe8321SBarry Smith PetscErrorCode ierr; 8100805154bSBarry Smith PetscBLASInt m, n,_One=1; 811ea709b57SSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 8123a40ed3dSBarry Smith 8133a40ed3dSBarry Smith PetscFunctionBegin; 814c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 815c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 816d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 8172bf066beSStefano Zampini ierr = VecGetArrayWrite(yy,&y);CHKERRQ(ierr); 8185ac36cfcSBarry Smith if (!A->rmap->n || !A->cmap->n) { 8195ac36cfcSBarry Smith PetscBLASInt i; 8205ac36cfcSBarry Smith for (i=0; i<n; i++) y[i] = 0.0; 8215ac36cfcSBarry Smith } else { 8228b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One)); 8235ac36cfcSBarry Smith ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 8245ac36cfcSBarry Smith } 825d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 8262bf066beSStefano Zampini ierr = VecRestoreArrayWrite(yy,&y);CHKERRQ(ierr); 8273a40ed3dSBarry Smith PetscFunctionReturn(0); 828289bc588SBarry Smith } 829800995b7SMatthew Knepley 830ca15aa20SStefano Zampini PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy) 831289bc588SBarry Smith { 832c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 833d9ca1df4SBarry Smith PetscScalar *y,_DOne=1.0,_DZero=0.0; 834dfbe8321SBarry Smith PetscErrorCode ierr; 8350805154bSBarry Smith PetscBLASInt m, n, _One=1; 836d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 8373a40ed3dSBarry Smith 8383a40ed3dSBarry Smith PetscFunctionBegin; 839c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 840c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 841d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 8422bf066beSStefano Zampini ierr = VecGetArrayWrite(yy,&y);CHKERRQ(ierr); 8435ac36cfcSBarry Smith if (!A->rmap->n || !A->cmap->n) { 8445ac36cfcSBarry Smith PetscBLASInt i; 8455ac36cfcSBarry Smith for (i=0; i<m; i++) y[i] = 0.0; 8465ac36cfcSBarry Smith } else { 8478b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One)); 8485ac36cfcSBarry Smith ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr); 8495ac36cfcSBarry Smith } 850d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 8512bf066beSStefano Zampini ierr = VecRestoreArrayWrite(yy,&y);CHKERRQ(ierr); 8523a40ed3dSBarry Smith PetscFunctionReturn(0); 853289bc588SBarry Smith } 8546ee01492SSatish Balay 855ca15aa20SStefano Zampini PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 856289bc588SBarry Smith { 857c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 858d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 859d9ca1df4SBarry Smith PetscScalar *y,_DOne=1.0; 860dfbe8321SBarry Smith PetscErrorCode ierr; 8610805154bSBarry Smith PetscBLASInt m, n, _One=1; 8623a40ed3dSBarry Smith 8633a40ed3dSBarry Smith PetscFunctionBegin; 864c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 865c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 866d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 867600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 868d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 8691ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 8708b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One)); 871d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 8721ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 873dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 8743a40ed3dSBarry Smith PetscFunctionReturn(0); 875289bc588SBarry Smith } 8766ee01492SSatish Balay 877ca15aa20SStefano Zampini PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 878289bc588SBarry Smith { 879c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 880d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 881d9ca1df4SBarry Smith PetscScalar *y; 882dfbe8321SBarry Smith PetscErrorCode ierr; 8830805154bSBarry Smith PetscBLASInt m, n, _One=1; 88487828ca2SBarry Smith PetscScalar _DOne=1.0; 8853a40ed3dSBarry Smith 8863a40ed3dSBarry Smith PetscFunctionBegin; 887c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 888c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 889d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 890600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 891d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 8921ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 8938b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One)); 894d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 8951ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 896dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 8973a40ed3dSBarry Smith PetscFunctionReturn(0); 898289bc588SBarry Smith } 899289bc588SBarry Smith 900289bc588SBarry Smith /* -----------------------------------------------------------------*/ 901e0877f53SBarry Smith static PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 902289bc588SBarry Smith { 903c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 9046849ba73SBarry Smith PetscErrorCode ierr; 90513f74950SBarry Smith PetscInt i; 90667e560aaSBarry Smith 9073a40ed3dSBarry Smith PetscFunctionBegin; 908d0f46423SBarry Smith *ncols = A->cmap->n; 909289bc588SBarry Smith if (cols) { 910854ce69bSBarry Smith ierr = PetscMalloc1(A->cmap->n+1,cols);CHKERRQ(ierr); 911d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) (*cols)[i] = i; 912289bc588SBarry Smith } 913289bc588SBarry Smith if (vals) { 914ca15aa20SStefano Zampini const PetscScalar *v; 915ca15aa20SStefano Zampini 916ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&v);CHKERRQ(ierr); 917854ce69bSBarry Smith ierr = PetscMalloc1(A->cmap->n+1,vals);CHKERRQ(ierr); 918ca15aa20SStefano Zampini v += row; 919d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;} 920ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&v);CHKERRQ(ierr); 921289bc588SBarry Smith } 9223a40ed3dSBarry Smith PetscFunctionReturn(0); 923289bc588SBarry Smith } 9246ee01492SSatish Balay 925e0877f53SBarry Smith static PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 926289bc588SBarry Smith { 927dfbe8321SBarry Smith PetscErrorCode ierr; 9286e111a19SKarl Rupp 929606d414cSSatish Balay PetscFunctionBegin; 930606d414cSSatish Balay if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);} 931606d414cSSatish Balay if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); } 9323a40ed3dSBarry Smith PetscFunctionReturn(0); 933289bc588SBarry Smith } 934289bc588SBarry Smith /* ----------------------------------------------------------------*/ 935e0877f53SBarry Smith static PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv) 936289bc588SBarry Smith { 937c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 938ca15aa20SStefano Zampini PetscScalar *av; 93913f74950SBarry Smith PetscInt i,j,idx=0; 940ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA) 941c70f7ee4SJunchao Zhang PetscOffloadMask oldf; 942ca15aa20SStefano Zampini #endif 943ca15aa20SStefano Zampini PetscErrorCode ierr; 944d6dfbf8fSBarry Smith 9453a40ed3dSBarry Smith PetscFunctionBegin; 946ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&av);CHKERRQ(ierr); 947289bc588SBarry Smith if (!mat->roworiented) { 948dbb450caSBarry Smith if (addv == INSERT_VALUES) { 949289bc588SBarry Smith for (j=0; j<n; j++) { 950cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 951cf9c20a2SJed Brown if (PetscUnlikelyDebug(indexn[j] >= A->cmap->n)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1); 952289bc588SBarry Smith for (i=0; i<m; i++) { 953cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 954cf9c20a2SJed Brown if (PetscUnlikelyDebug(indexm[i] >= A->rmap->n)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1); 955ca15aa20SStefano Zampini av[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 956289bc588SBarry Smith } 957289bc588SBarry Smith } 9583a40ed3dSBarry Smith } else { 959289bc588SBarry Smith for (j=0; j<n; j++) { 960cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 961cf9c20a2SJed Brown if (PetscUnlikelyDebug(indexn[j] >= A->cmap->n)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1); 962289bc588SBarry Smith for (i=0; i<m; i++) { 963cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 964cf9c20a2SJed Brown if (PetscUnlikelyDebug(indexm[i] >= A->rmap->n)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1); 965ca15aa20SStefano Zampini av[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 966289bc588SBarry Smith } 967289bc588SBarry Smith } 968289bc588SBarry Smith } 9693a40ed3dSBarry Smith } else { 970dbb450caSBarry Smith if (addv == INSERT_VALUES) { 971e8d4e0b9SBarry Smith for (i=0; i<m; i++) { 972cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 973cf9c20a2SJed Brown if (PetscUnlikelyDebug(indexm[i] >= A->rmap->n)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1); 974e8d4e0b9SBarry Smith for (j=0; j<n; j++) { 975cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 976cf9c20a2SJed Brown if (PetscUnlikelyDebug(indexn[j] >= A->cmap->n)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1); 977ca15aa20SStefano Zampini av[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 978e8d4e0b9SBarry Smith } 979e8d4e0b9SBarry Smith } 9803a40ed3dSBarry Smith } else { 981289bc588SBarry Smith for (i=0; i<m; i++) { 982cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 983cf9c20a2SJed Brown if (PetscUnlikelyDebug(indexm[i] >= A->rmap->n)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1); 984289bc588SBarry Smith for (j=0; j<n; j++) { 985cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 986cf9c20a2SJed Brown if (PetscUnlikelyDebug(indexn[j] >= A->cmap->n)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1); 987ca15aa20SStefano Zampini av[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 988289bc588SBarry Smith } 989289bc588SBarry Smith } 990289bc588SBarry Smith } 991e8d4e0b9SBarry Smith } 992ca15aa20SStefano Zampini /* hack to prevent unneeded copy to the GPU while returning the array */ 993ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA) 994c70f7ee4SJunchao Zhang oldf = A->offloadmask; 995c70f7ee4SJunchao Zhang A->offloadmask = PETSC_OFFLOAD_GPU; 996ca15aa20SStefano Zampini #endif 997ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&av);CHKERRQ(ierr); 998ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA) 999c70f7ee4SJunchao Zhang A->offloadmask = (oldf == PETSC_OFFLOAD_UNALLOCATED ? PETSC_OFFLOAD_UNALLOCATED : PETSC_OFFLOAD_CPU); 1000ca15aa20SStefano Zampini #endif 10013a40ed3dSBarry Smith PetscFunctionReturn(0); 1002289bc588SBarry Smith } 1003e8d4e0b9SBarry Smith 1004e0877f53SBarry Smith static PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[]) 1005ae80bb75SLois Curfman McInnes { 1006ae80bb75SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1007ca15aa20SStefano Zampini const PetscScalar *vv; 100813f74950SBarry Smith PetscInt i,j; 1009ca15aa20SStefano Zampini PetscErrorCode ierr; 1010ae80bb75SLois Curfman McInnes 10113a40ed3dSBarry Smith PetscFunctionBegin; 1012ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&vv);CHKERRQ(ierr); 1013ae80bb75SLois Curfman McInnes /* row-oriented output */ 1014ae80bb75SLois Curfman McInnes for (i=0; i<m; i++) { 101597e567efSBarry Smith if (indexm[i] < 0) {v += n;continue;} 1016e32f2f54SBarry Smith if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row %D requested larger than number rows %D",indexm[i],A->rmap->n); 1017ae80bb75SLois Curfman McInnes for (j=0; j<n; j++) { 10186f31f424SBarry Smith if (indexn[j] < 0) {v++; continue;} 1019e32f2f54SBarry Smith if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column %D requested larger than number columns %D",indexn[j],A->cmap->n); 1020ca15aa20SStefano Zampini *v++ = vv[indexn[j]*mat->lda + indexm[i]]; 1021ae80bb75SLois Curfman McInnes } 1022ae80bb75SLois Curfman McInnes } 1023ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&vv);CHKERRQ(ierr); 10243a40ed3dSBarry Smith PetscFunctionReturn(0); 1025ae80bb75SLois Curfman McInnes } 1026ae80bb75SLois Curfman McInnes 1027289bc588SBarry Smith /* -----------------------------------------------------------------*/ 1028289bc588SBarry Smith 10298491ab44SLisandro Dalcin PetscErrorCode MatView_Dense_Binary(Mat mat,PetscViewer viewer) 1030aabbc4fbSShri Abhyankar { 1031aabbc4fbSShri Abhyankar PetscErrorCode ierr; 10328491ab44SLisandro Dalcin PetscBool skipHeader; 10338491ab44SLisandro Dalcin PetscViewerFormat format; 10348491ab44SLisandro Dalcin PetscInt header[4],M,N,m,lda,i,j,k; 10358491ab44SLisandro Dalcin const PetscScalar *v; 10368491ab44SLisandro Dalcin PetscScalar *vwork; 1037aabbc4fbSShri Abhyankar 1038aabbc4fbSShri Abhyankar PetscFunctionBegin; 10398491ab44SLisandro Dalcin ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr); 10408491ab44SLisandro Dalcin ierr = PetscViewerBinaryGetSkipHeader(viewer,&skipHeader);CHKERRQ(ierr); 10418491ab44SLisandro Dalcin ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 10428491ab44SLisandro Dalcin if (skipHeader) format = PETSC_VIEWER_NATIVE; 1043aabbc4fbSShri Abhyankar 10448491ab44SLisandro Dalcin ierr = MatGetSize(mat,&M,&N);CHKERRQ(ierr); 10458491ab44SLisandro Dalcin 10468491ab44SLisandro Dalcin /* write matrix header */ 10478491ab44SLisandro Dalcin header[0] = MAT_FILE_CLASSID; header[1] = M; header[2] = N; 10488491ab44SLisandro Dalcin header[3] = (format == PETSC_VIEWER_NATIVE) ? MATRIX_BINARY_FORMAT_DENSE : M*N; 10498491ab44SLisandro Dalcin if (!skipHeader) {ierr = PetscViewerBinaryWrite(viewer,header,4,PETSC_INT);CHKERRQ(ierr);} 10508491ab44SLisandro Dalcin 10518491ab44SLisandro Dalcin ierr = MatGetLocalSize(mat,&m,NULL);CHKERRQ(ierr); 10528491ab44SLisandro Dalcin if (format != PETSC_VIEWER_NATIVE) { 10538491ab44SLisandro Dalcin PetscInt nnz = m*N, *iwork; 10548491ab44SLisandro Dalcin /* store row lengths for each row */ 10558491ab44SLisandro Dalcin ierr = PetscMalloc1(nnz,&iwork);CHKERRQ(ierr); 10568491ab44SLisandro Dalcin for (i=0; i<m; i++) iwork[i] = N; 10578491ab44SLisandro Dalcin ierr = PetscViewerBinaryWriteAll(viewer,iwork,m,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_INT);CHKERRQ(ierr); 10588491ab44SLisandro Dalcin /* store column indices (zero start index) */ 10598491ab44SLisandro Dalcin for (k=0, i=0; i<m; i++) 10608491ab44SLisandro Dalcin for (j=0; j<N; j++, k++) 10618491ab44SLisandro Dalcin iwork[k] = j; 10628491ab44SLisandro Dalcin ierr = PetscViewerBinaryWriteAll(viewer,iwork,nnz,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_INT);CHKERRQ(ierr); 10638491ab44SLisandro Dalcin ierr = PetscFree(iwork);CHKERRQ(ierr); 10648491ab44SLisandro Dalcin } 10658491ab44SLisandro Dalcin /* store matrix values as a dense matrix in row major order */ 10668491ab44SLisandro Dalcin ierr = PetscMalloc1(m*N,&vwork);CHKERRQ(ierr); 10678491ab44SLisandro Dalcin ierr = MatDenseGetArrayRead(mat,&v);CHKERRQ(ierr); 10688491ab44SLisandro Dalcin ierr = MatDenseGetLDA(mat,&lda);CHKERRQ(ierr); 10698491ab44SLisandro Dalcin for (k=0, i=0; i<m; i++) 10708491ab44SLisandro Dalcin for (j=0; j<N; j++, k++) 10718491ab44SLisandro Dalcin vwork[k] = v[i+lda*j]; 10728491ab44SLisandro Dalcin ierr = MatDenseRestoreArrayRead(mat,&v);CHKERRQ(ierr); 10738491ab44SLisandro Dalcin ierr = PetscViewerBinaryWriteAll(viewer,vwork,m*N,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_SCALAR);CHKERRQ(ierr); 10748491ab44SLisandro Dalcin ierr = PetscFree(vwork);CHKERRQ(ierr); 10758491ab44SLisandro Dalcin PetscFunctionReturn(0); 10768491ab44SLisandro Dalcin } 10778491ab44SLisandro Dalcin 10788491ab44SLisandro Dalcin PetscErrorCode MatLoad_Dense_Binary(Mat mat,PetscViewer viewer) 10798491ab44SLisandro Dalcin { 10808491ab44SLisandro Dalcin PetscErrorCode ierr; 10818491ab44SLisandro Dalcin PetscBool skipHeader; 10828491ab44SLisandro Dalcin PetscInt header[4],M,N,m,nz,lda,i,j,k; 10838491ab44SLisandro Dalcin PetscInt rows,cols; 10848491ab44SLisandro Dalcin PetscScalar *v,*vwork; 10858491ab44SLisandro Dalcin 10868491ab44SLisandro Dalcin PetscFunctionBegin; 10878491ab44SLisandro Dalcin ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr); 10888491ab44SLisandro Dalcin ierr = PetscViewerBinaryGetSkipHeader(viewer,&skipHeader);CHKERRQ(ierr); 10898491ab44SLisandro Dalcin 10908491ab44SLisandro Dalcin if (!skipHeader) { 10918491ab44SLisandro Dalcin ierr = PetscViewerBinaryRead(viewer,header,4,NULL,PETSC_INT);CHKERRQ(ierr); 10928491ab44SLisandro Dalcin if (header[0] != MAT_FILE_CLASSID) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"Not a matrix object in file"); 10938491ab44SLisandro Dalcin M = header[1]; N = header[2]; 10948491ab44SLisandro Dalcin if (M < 0) SETERRQ1(PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"Matrix row size (%D) in file is negative",M); 10958491ab44SLisandro Dalcin if (N < 0) SETERRQ1(PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"Matrix column size (%D) in file is negative",N); 10968491ab44SLisandro Dalcin nz = header[3]; 10978491ab44SLisandro Dalcin if (nz != MATRIX_BINARY_FORMAT_DENSE && nz < 0) SETERRQ1(PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"Unknown matrix format %D in file",nz); 1098aabbc4fbSShri Abhyankar } else { 10998491ab44SLisandro Dalcin ierr = MatGetSize(mat,&M,&N);CHKERRQ(ierr); 11008491ab44SLisandro Dalcin if (M < 0 || N < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Matrix binary file header was skipped, thus the user must specify the global sizes of input matrix"); 11018491ab44SLisandro Dalcin nz = MATRIX_BINARY_FORMAT_DENSE; 1102e6324fbbSBarry Smith } 1103aabbc4fbSShri Abhyankar 11048491ab44SLisandro Dalcin /* setup global sizes if not set */ 11058491ab44SLisandro Dalcin if (mat->rmap->N < 0) mat->rmap->N = M; 11068491ab44SLisandro Dalcin if (mat->cmap->N < 0) mat->cmap->N = N; 11078491ab44SLisandro Dalcin ierr = MatSetUp(mat);CHKERRQ(ierr); 11088491ab44SLisandro Dalcin /* check if global sizes are correct */ 11098491ab44SLisandro Dalcin ierr = MatGetSize(mat,&rows,&cols);CHKERRQ(ierr); 11108491ab44SLisandro Dalcin if (M != rows || N != cols) SETERRQ4(PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED, "Matrix in file of different sizes (%d, %d) than the input matrix (%d, %d)",M,N,rows,cols); 1111aabbc4fbSShri Abhyankar 11128491ab44SLisandro Dalcin ierr = MatGetSize(mat,NULL,&N);CHKERRQ(ierr); 11138491ab44SLisandro Dalcin ierr = MatGetLocalSize(mat,&m,NULL);CHKERRQ(ierr); 11148491ab44SLisandro Dalcin ierr = MatDenseGetArray(mat,&v);CHKERRQ(ierr); 11158491ab44SLisandro Dalcin ierr = MatDenseGetLDA(mat,&lda);CHKERRQ(ierr); 11168491ab44SLisandro Dalcin if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense format */ 11178491ab44SLisandro Dalcin PetscInt nnz = m*N; 11188491ab44SLisandro Dalcin /* read in matrix values */ 11198491ab44SLisandro Dalcin ierr = PetscMalloc1(nnz,&vwork);CHKERRQ(ierr); 11208491ab44SLisandro Dalcin ierr = PetscViewerBinaryReadAll(viewer,vwork,nnz,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_SCALAR);CHKERRQ(ierr); 11218491ab44SLisandro Dalcin /* store values in column major order */ 11228491ab44SLisandro Dalcin for (j=0; j<N; j++) 11238491ab44SLisandro Dalcin for (i=0; i<m; i++) 11248491ab44SLisandro Dalcin v[i+lda*j] = vwork[i*N+j]; 11258491ab44SLisandro Dalcin ierr = PetscFree(vwork);CHKERRQ(ierr); 11268491ab44SLisandro Dalcin } else { /* matrix in file is sparse format */ 11278491ab44SLisandro Dalcin PetscInt nnz = 0, *rlens, *icols; 11288491ab44SLisandro Dalcin /* read in row lengths */ 11298491ab44SLisandro Dalcin ierr = PetscMalloc1(m,&rlens);CHKERRQ(ierr); 11308491ab44SLisandro Dalcin ierr = PetscViewerBinaryReadAll(viewer,rlens,m,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_INT);CHKERRQ(ierr); 11318491ab44SLisandro Dalcin for (i=0; i<m; i++) nnz += rlens[i]; 11328491ab44SLisandro Dalcin /* read in column indices and values */ 11338491ab44SLisandro Dalcin ierr = PetscMalloc2(nnz,&icols,nnz,&vwork);CHKERRQ(ierr); 11348491ab44SLisandro Dalcin ierr = PetscViewerBinaryReadAll(viewer,icols,nnz,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_INT);CHKERRQ(ierr); 11358491ab44SLisandro Dalcin ierr = PetscViewerBinaryReadAll(viewer,vwork,nnz,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_SCALAR);CHKERRQ(ierr); 11368491ab44SLisandro Dalcin /* store values in column major order */ 11378491ab44SLisandro Dalcin for (k=0, i=0; i<m; i++) 11388491ab44SLisandro Dalcin for (j=0; j<rlens[i]; j++, k++) 11398491ab44SLisandro Dalcin v[i+lda*icols[k]] = vwork[k]; 11408491ab44SLisandro Dalcin ierr = PetscFree(rlens);CHKERRQ(ierr); 11418491ab44SLisandro Dalcin ierr = PetscFree2(icols,vwork);CHKERRQ(ierr); 1142aabbc4fbSShri Abhyankar } 11438491ab44SLisandro Dalcin ierr = MatDenseRestoreArray(mat,&v);CHKERRQ(ierr); 11448491ab44SLisandro Dalcin ierr = MatAssemblyBegin(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 11458491ab44SLisandro Dalcin ierr = MatAssemblyEnd(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1146aabbc4fbSShri Abhyankar PetscFunctionReturn(0); 1147aabbc4fbSShri Abhyankar } 1148aabbc4fbSShri Abhyankar 1149eb91f321SVaclav Hapla PetscErrorCode MatLoad_SeqDense(Mat newMat, PetscViewer viewer) 1150eb91f321SVaclav Hapla { 1151eb91f321SVaclav Hapla PetscBool isbinary, ishdf5; 1152eb91f321SVaclav Hapla PetscErrorCode ierr; 1153eb91f321SVaclav Hapla 1154eb91f321SVaclav Hapla PetscFunctionBegin; 1155eb91f321SVaclav Hapla PetscValidHeaderSpecific(newMat,MAT_CLASSID,1); 1156eb91f321SVaclav Hapla PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 1157eb91f321SVaclav Hapla /* force binary viewer to load .info file if it has not yet done so */ 1158eb91f321SVaclav Hapla ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr); 1159eb91f321SVaclav Hapla ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 1160eb91f321SVaclav Hapla ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERHDF5, &ishdf5);CHKERRQ(ierr); 1161eb91f321SVaclav Hapla if (isbinary) { 11628491ab44SLisandro Dalcin ierr = MatLoad_Dense_Binary(newMat,viewer);CHKERRQ(ierr); 1163eb91f321SVaclav Hapla } else if (ishdf5) { 1164eb91f321SVaclav Hapla #if defined(PETSC_HAVE_HDF5) 1165eb91f321SVaclav Hapla ierr = MatLoad_Dense_HDF5(newMat,viewer);CHKERRQ(ierr); 1166eb91f321SVaclav Hapla #else 1167eb91f321SVaclav Hapla SETERRQ(PetscObjectComm((PetscObject)newMat),PETSC_ERR_SUP,"HDF5 not supported in this build.\nPlease reconfigure using --download-hdf5"); 1168eb91f321SVaclav Hapla #endif 1169eb91f321SVaclav Hapla } else { 1170eb91f321SVaclav Hapla SETERRQ2(PetscObjectComm((PetscObject)newMat),PETSC_ERR_SUP,"Viewer type %s not yet supported for reading %s matrices",((PetscObject)viewer)->type_name,((PetscObject)newMat)->type_name); 1171eb91f321SVaclav Hapla } 1172eb91f321SVaclav Hapla PetscFunctionReturn(0); 1173eb91f321SVaclav Hapla } 1174eb91f321SVaclav Hapla 11756849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer) 1176289bc588SBarry Smith { 1177932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1178dfbe8321SBarry Smith PetscErrorCode ierr; 117913f74950SBarry Smith PetscInt i,j; 11802dcb1b2aSMatthew Knepley const char *name; 1181ca15aa20SStefano Zampini PetscScalar *v,*av; 1182f3ef73ceSBarry Smith PetscViewerFormat format; 11835f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX) 1184ace3abfcSBarry Smith PetscBool allreal = PETSC_TRUE; 11855f481a85SSatish Balay #endif 1186932b0c3eSLois Curfman McInnes 11873a40ed3dSBarry Smith PetscFunctionBegin; 1188ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,(const PetscScalar**)&av);CHKERRQ(ierr); 1189b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1190456192e2SBarry Smith if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 11913a40ed3dSBarry Smith PetscFunctionReturn(0); /* do nothing for now */ 1192fb9695e5SSatish Balay } else if (format == PETSC_VIEWER_ASCII_COMMON) { 1193d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 1194d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 1195ca15aa20SStefano Zampini v = av + i; 119677431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr); 1197d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1198aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 1199329f5518SBarry Smith if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) { 120057622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g + %g i) ",j,(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr); 1201329f5518SBarry Smith } else if (PetscRealPart(*v)) { 120257622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)PetscRealPart(*v));CHKERRQ(ierr); 12036831982aSBarry Smith } 120480cd9d93SLois Curfman McInnes #else 12056831982aSBarry Smith if (*v) { 120657622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)*v);CHKERRQ(ierr); 12076831982aSBarry Smith } 120880cd9d93SLois Curfman McInnes #endif 12091b807ce4Svictorle v += a->lda; 121080cd9d93SLois Curfman McInnes } 1211b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 121280cd9d93SLois Curfman McInnes } 1213d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 12143a40ed3dSBarry Smith } else { 1215d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 1216aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 121747989497SBarry Smith /* determine if matrix has all real values */ 1218ca15aa20SStefano Zampini v = av; 1219d0f46423SBarry Smith for (i=0; i<A->rmap->n*A->cmap->n; i++) { 1220ffac6cdbSBarry Smith if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break;} 122147989497SBarry Smith } 122247989497SBarry Smith #endif 1223fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 12243a7fca6bSBarry Smith ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr); 1225d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr); 1226d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 1227fb9695e5SSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr); 1228ffac6cdbSBarry Smith } 1229ffac6cdbSBarry Smith 1230d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 1231ca15aa20SStefano Zampini v = av + i; 1232d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1233aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 123447989497SBarry Smith if (allreal) { 1235c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr); 123647989497SBarry Smith } else { 1237c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr); 123847989497SBarry Smith } 1239289bc588SBarry Smith #else 1240c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr); 1241289bc588SBarry Smith #endif 12421b807ce4Svictorle v += a->lda; 1243289bc588SBarry Smith } 1244b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 1245289bc588SBarry Smith } 1246fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 1247b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr); 1248ffac6cdbSBarry Smith } 1249d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 1250da3a660dSBarry Smith } 1251ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,(const PetscScalar**)&av);CHKERRQ(ierr); 1252b0a32e0cSBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 12533a40ed3dSBarry Smith PetscFunctionReturn(0); 1254289bc588SBarry Smith } 1255289bc588SBarry Smith 12569804daf3SBarry Smith #include <petscdraw.h> 1257e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa) 1258f1af5d2fSBarry Smith { 1259f1af5d2fSBarry Smith Mat A = (Mat) Aa; 12606849ba73SBarry Smith PetscErrorCode ierr; 1261383922c3SLisandro Dalcin PetscInt m = A->rmap->n,n = A->cmap->n,i,j; 1262383922c3SLisandro Dalcin int color = PETSC_DRAW_WHITE; 1263ca15aa20SStefano Zampini const PetscScalar *v; 1264b0a32e0cSBarry Smith PetscViewer viewer; 1265b05fc000SLisandro Dalcin PetscReal xl,yl,xr,yr,x_l,x_r,y_l,y_r; 1266f3ef73ceSBarry Smith PetscViewerFormat format; 1267f1af5d2fSBarry Smith 1268f1af5d2fSBarry Smith PetscFunctionBegin; 1269f1af5d2fSBarry Smith ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr); 1270b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1271b0a32e0cSBarry Smith ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr); 1272f1af5d2fSBarry Smith 1273f1af5d2fSBarry Smith /* Loop over matrix elements drawing boxes */ 1274ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&v);CHKERRQ(ierr); 1275fb9695e5SSatish Balay if (format != PETSC_VIEWER_DRAW_CONTOUR) { 1276383922c3SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 1277f1af5d2fSBarry Smith /* Blue for negative and Red for positive */ 1278f1af5d2fSBarry Smith for (j = 0; j < n; j++) { 1279383922c3SLisandro Dalcin x_l = j; x_r = x_l + 1.0; 1280f1af5d2fSBarry Smith for (i = 0; i < m; i++) { 1281f1af5d2fSBarry Smith y_l = m - i - 1.0; 1282f1af5d2fSBarry Smith y_r = y_l + 1.0; 1283ca15aa20SStefano Zampini if (PetscRealPart(v[j*m+i]) > 0.) color = PETSC_DRAW_RED; 1284ca15aa20SStefano Zampini else if (PetscRealPart(v[j*m+i]) < 0.) color = PETSC_DRAW_BLUE; 1285ca15aa20SStefano Zampini else continue; 1286b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1287f1af5d2fSBarry Smith } 1288f1af5d2fSBarry Smith } 1289383922c3SLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 1290f1af5d2fSBarry Smith } else { 1291f1af5d2fSBarry Smith /* use contour shading to indicate magnitude of values */ 1292f1af5d2fSBarry Smith /* first determine max of all nonzero values */ 1293b05fc000SLisandro Dalcin PetscReal minv = 0.0, maxv = 0.0; 1294b05fc000SLisandro Dalcin PetscDraw popup; 1295b05fc000SLisandro Dalcin 1296f1af5d2fSBarry Smith for (i=0; i < m*n; i++) { 1297f1af5d2fSBarry Smith if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]); 1298f1af5d2fSBarry Smith } 1299383922c3SLisandro Dalcin if (minv >= maxv) maxv = minv + PETSC_SMALL; 1300b0a32e0cSBarry Smith ierr = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr); 130145f3bb6eSLisandro Dalcin ierr = PetscDrawScalePopup(popup,minv,maxv);CHKERRQ(ierr); 1302383922c3SLisandro Dalcin 1303383922c3SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 1304f1af5d2fSBarry Smith for (j=0; j<n; j++) { 1305f1af5d2fSBarry Smith x_l = j; 1306f1af5d2fSBarry Smith x_r = x_l + 1.0; 1307f1af5d2fSBarry Smith for (i=0; i<m; i++) { 1308f1af5d2fSBarry Smith y_l = m - i - 1.0; 1309f1af5d2fSBarry Smith y_r = y_l + 1.0; 1310b05fc000SLisandro Dalcin color = PetscDrawRealToColor(PetscAbsScalar(v[j*m+i]),minv,maxv); 1311b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1312f1af5d2fSBarry Smith } 1313f1af5d2fSBarry Smith } 1314383922c3SLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 1315f1af5d2fSBarry Smith } 1316ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&v);CHKERRQ(ierr); 1317f1af5d2fSBarry Smith PetscFunctionReturn(0); 1318f1af5d2fSBarry Smith } 1319f1af5d2fSBarry Smith 1320e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer) 1321f1af5d2fSBarry Smith { 1322b0a32e0cSBarry Smith PetscDraw draw; 1323ace3abfcSBarry Smith PetscBool isnull; 1324329f5518SBarry Smith PetscReal xr,yr,xl,yl,h,w; 1325dfbe8321SBarry Smith PetscErrorCode ierr; 1326f1af5d2fSBarry Smith 1327f1af5d2fSBarry Smith PetscFunctionBegin; 1328b0a32e0cSBarry Smith ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr); 1329b0a32e0cSBarry Smith ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 1330abc0a331SBarry Smith if (isnull) PetscFunctionReturn(0); 1331f1af5d2fSBarry Smith 1332d0f46423SBarry Smith xr = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0; 1333f1af5d2fSBarry Smith xr += w; yr += h; xl = -w; yl = -h; 1334b0a32e0cSBarry Smith ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr); 1335832b7cebSLisandro Dalcin ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr); 1336b0a32e0cSBarry Smith ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr); 13370298fd71SBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr); 1338832b7cebSLisandro Dalcin ierr = PetscDrawSave(draw);CHKERRQ(ierr); 1339f1af5d2fSBarry Smith PetscFunctionReturn(0); 1340f1af5d2fSBarry Smith } 1341f1af5d2fSBarry Smith 1342dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer) 1343932b0c3eSLois Curfman McInnes { 1344dfbe8321SBarry Smith PetscErrorCode ierr; 1345ace3abfcSBarry Smith PetscBool iascii,isbinary,isdraw; 1346932b0c3eSLois Curfman McInnes 13473a40ed3dSBarry Smith PetscFunctionBegin; 1348251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 1349251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 1350251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 13510f5bd95cSBarry Smith 1352c45a1595SBarry Smith if (iascii) { 1353c45a1595SBarry Smith ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr); 13540f5bd95cSBarry Smith } else if (isbinary) { 1355637a0070SStefano Zampini ierr = MatView_Dense_Binary(A,viewer);CHKERRQ(ierr); 1356f1af5d2fSBarry Smith } else if (isdraw) { 1357f1af5d2fSBarry Smith ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr); 1358932b0c3eSLois Curfman McInnes } 13593a40ed3dSBarry Smith PetscFunctionReturn(0); 1360932b0c3eSLois Curfman McInnes } 1361289bc588SBarry Smith 1362637a0070SStefano Zampini static PetscErrorCode MatDensePlaceArray_SeqDense(Mat A,const PetscScalar *array) 1363d3042a70SBarry Smith { 1364d3042a70SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1365d3042a70SBarry Smith 1366d3042a70SBarry Smith PetscFunctionBegin; 13675ea7661aSPierre Jolivet if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first"); 13685ea7661aSPierre Jolivet if (a->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first"); 13695ea7661aSPierre Jolivet if (a->unplacedarray) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreArray() first"); 1370d3042a70SBarry Smith a->unplacedarray = a->v; 1371d3042a70SBarry Smith a->unplaced_user_alloc = a->user_alloc; 1372d3042a70SBarry Smith a->v = (PetscScalar*) array; 1373637a0070SStefano Zampini a->user_alloc = PETSC_TRUE; 1374ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA) 1375c70f7ee4SJunchao Zhang A->offloadmask = PETSC_OFFLOAD_CPU; 1376ca15aa20SStefano Zampini #endif 1377d3042a70SBarry Smith PetscFunctionReturn(0); 1378d3042a70SBarry Smith } 1379d3042a70SBarry Smith 1380d3042a70SBarry Smith static PetscErrorCode MatDenseResetArray_SeqDense(Mat A) 1381d3042a70SBarry Smith { 1382d3042a70SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1383d3042a70SBarry Smith 1384d3042a70SBarry Smith PetscFunctionBegin; 13855ea7661aSPierre Jolivet if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first"); 13865ea7661aSPierre Jolivet if (a->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first"); 1387d3042a70SBarry Smith a->v = a->unplacedarray; 1388d3042a70SBarry Smith a->user_alloc = a->unplaced_user_alloc; 1389d3042a70SBarry Smith a->unplacedarray = NULL; 1390ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA) 1391c70f7ee4SJunchao Zhang A->offloadmask = PETSC_OFFLOAD_CPU; 1392ca15aa20SStefano Zampini #endif 1393d3042a70SBarry Smith PetscFunctionReturn(0); 1394d3042a70SBarry Smith } 1395d3042a70SBarry Smith 1396d5ea218eSStefano Zampini static PetscErrorCode MatDenseReplaceArray_SeqDense(Mat A,const PetscScalar *array) 1397d5ea218eSStefano Zampini { 1398d5ea218eSStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1399d5ea218eSStefano Zampini PetscErrorCode ierr; 1400d5ea218eSStefano Zampini 1401d5ea218eSStefano Zampini PetscFunctionBegin; 14025ea7661aSPierre Jolivet if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first"); 14035ea7661aSPierre Jolivet if (a->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first"); 1404d5ea218eSStefano Zampini if (!a->user_alloc) { ierr = PetscFree(a->v);CHKERRQ(ierr); } 1405d5ea218eSStefano Zampini a->v = (PetscScalar*) array; 1406d5ea218eSStefano Zampini a->user_alloc = PETSC_FALSE; 1407d5ea218eSStefano Zampini #if defined(PETSC_HAVE_CUDA) 1408d5ea218eSStefano Zampini A->offloadmask = PETSC_OFFLOAD_CPU; 1409d5ea218eSStefano Zampini #endif 1410d5ea218eSStefano Zampini PetscFunctionReturn(0); 1411d5ea218eSStefano Zampini } 1412d5ea218eSStefano Zampini 1413ca15aa20SStefano Zampini PetscErrorCode MatDestroy_SeqDense(Mat mat) 1414289bc588SBarry Smith { 1415ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)mat->data; 1416dfbe8321SBarry Smith PetscErrorCode ierr; 141790f02eecSBarry Smith 14183a40ed3dSBarry Smith PetscFunctionBegin; 1419aa482453SBarry Smith #if defined(PETSC_USE_LOG) 1420d0f46423SBarry Smith PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n); 1421a5a9c739SBarry Smith #endif 142205b42c5fSBarry Smith ierr = PetscFree(l->pivots);CHKERRQ(ierr); 1423a49dc2a2SStefano Zampini ierr = PetscFree(l->fwork);CHKERRQ(ierr); 1424abc3b08eSStefano Zampini ierr = MatDestroy(&l->ptapwork);CHKERRQ(ierr); 14256857c123SSatish Balay if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);} 1426637a0070SStefano Zampini if (!l->unplaced_user_alloc) {ierr = PetscFree(l->unplacedarray);CHKERRQ(ierr);} 14275ea7661aSPierre Jolivet if (l->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first"); 14285ea7661aSPierre Jolivet if (l->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first"); 14296947451fSStefano Zampini ierr = VecDestroy(&l->cvec);CHKERRQ(ierr); 14305ea7661aSPierre Jolivet ierr = MatDestroy(&l->cmat);CHKERRQ(ierr); 1431bf0cc555SLisandro Dalcin ierr = PetscFree(mat->data);CHKERRQ(ierr); 1432dbd8c25aSHong Zhang 1433dbd8c25aSHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr); 143449a6ff4bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetLDA_C",NULL);CHKERRQ(ierr); 1435ad16ce7aSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseSetLDA_C",NULL);CHKERRQ(ierr); 1436bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL);CHKERRQ(ierr); 143752c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL);CHKERRQ(ierr); 1438d3042a70SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDensePlaceArray_C",NULL);CHKERRQ(ierr); 1439d3042a70SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseResetArray_C",NULL);CHKERRQ(ierr); 1440d5ea218eSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseReplaceArray_C",NULL);CHKERRQ(ierr); 144152c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArrayRead_C",NULL);CHKERRQ(ierr); 144252c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArrayRead_C",NULL);CHKERRQ(ierr); 14436947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArrayWrite_C",NULL);CHKERRQ(ierr); 14446947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArrayWrite_C",NULL);CHKERRQ(ierr); 14458baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL);CHKERRQ(ierr); 14468baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 14478baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL);CHKERRQ(ierr); 14488baccfbdSHong Zhang #endif 1449d24d4204SJose E. Roman #if defined(PETSC_HAVE_SCALAPACK) 1450d24d4204SJose E. Roman ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_scalapack_C",NULL);CHKERRQ(ierr); 1451d24d4204SJose E. Roman #endif 14522bf066beSStefano Zampini #if defined(PETSC_HAVE_CUDA) 14532bf066beSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqdensecuda_C",NULL);CHKERRQ(ierr); 14544222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqdensecuda_seqdensecuda_C",NULL);CHKERRQ(ierr); 14554222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqdensecuda_seqdense_C",NULL);CHKERRQ(ierr); 14562bf066beSStefano Zampini #endif 1457bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL);CHKERRQ(ierr); 14584222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 14594222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqdense_seqdense_C",NULL);CHKERRQ(ierr); 14604222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqbaij_seqdense_C",NULL);CHKERRQ(ierr); 14614222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqsbaij_seqdense_C",NULL);CHKERRQ(ierr); 146252c5f739Sprj- 146386aefd0dSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumn_C",NULL);CHKERRQ(ierr); 146486aefd0dSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumn_C",NULL);CHKERRQ(ierr); 14656947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumnVec_C",NULL);CHKERRQ(ierr); 14666947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumnVec_C",NULL);CHKERRQ(ierr); 14676947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumnVecRead_C",NULL);CHKERRQ(ierr); 14686947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumnVecRead_C",NULL);CHKERRQ(ierr); 14696947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumnVecWrite_C",NULL);CHKERRQ(ierr); 14706947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumnVecWrite_C",NULL);CHKERRQ(ierr); 14715ea7661aSPierre Jolivet ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetSubMatrix_C",NULL);CHKERRQ(ierr); 14725ea7661aSPierre Jolivet ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreSubMatrix_C",NULL);CHKERRQ(ierr); 14733a40ed3dSBarry Smith PetscFunctionReturn(0); 1474289bc588SBarry Smith } 1475289bc588SBarry Smith 1476e0877f53SBarry Smith static PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout) 1477289bc588SBarry Smith { 1478c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 14796849ba73SBarry Smith PetscErrorCode ierr; 148013f74950SBarry Smith PetscInt k,j,m,n,M; 148187828ca2SBarry Smith PetscScalar *v,tmp; 148248b35521SBarry Smith 14833a40ed3dSBarry Smith PetscFunctionBegin; 1484ca15aa20SStefano Zampini m = A->rmap->n; M = mat->lda; n = A->cmap->n; 14852847e3fdSStefano Zampini if (reuse == MAT_INPLACE_MATRIX && m == n) { /* in place transpose */ 1486ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr); 1487d3e5ee88SLois Curfman McInnes for (j=0; j<m; j++) { 1488289bc588SBarry Smith for (k=0; k<j; k++) { 14891b807ce4Svictorle tmp = v[j + k*M]; 14901b807ce4Svictorle v[j + k*M] = v[k + j*M]; 14911b807ce4Svictorle v[k + j*M] = tmp; 1492289bc588SBarry Smith } 1493289bc588SBarry Smith } 1494ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr); 14953a40ed3dSBarry Smith } else { /* out-of-place transpose */ 1496d3e5ee88SLois Curfman McInnes Mat tmat; 1497ec8511deSBarry Smith Mat_SeqDense *tmatd; 149887828ca2SBarry Smith PetscScalar *v2; 1499af36a384SStefano Zampini PetscInt M2; 1500ea709b57SSatish Balay 15012847e3fdSStefano Zampini if (reuse != MAT_REUSE_MATRIX) { 1502ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr); 1503d0f46423SBarry Smith ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr); 15047adad957SLisandro Dalcin ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 15050298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr); 1506ca15aa20SStefano Zampini } else tmat = *matout; 1507ca15aa20SStefano Zampini 1508ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,(const PetscScalar**)&v);CHKERRQ(ierr); 1509ca15aa20SStefano Zampini ierr = MatDenseGetArray(tmat,&v2);CHKERRQ(ierr); 1510ec8511deSBarry Smith tmatd = (Mat_SeqDense*)tmat->data; 1511ca15aa20SStefano Zampini M2 = tmatd->lda; 1512d3e5ee88SLois Curfman McInnes for (j=0; j<n; j++) { 1513af36a384SStefano Zampini for (k=0; k<m; k++) v2[j + k*M2] = v[k + j*M]; 1514d3e5ee88SLois Curfman McInnes } 1515ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(tmat,&v2);CHKERRQ(ierr); 1516ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,(const PetscScalar**)&v);CHKERRQ(ierr); 15176d4a8577SBarry Smith ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 15186d4a8577SBarry Smith ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 15192847e3fdSStefano Zampini if (reuse == MAT_INITIAL_MATRIX || reuse == MAT_REUSE_MATRIX) *matout = tmat; 15202847e3fdSStefano Zampini else { 15212847e3fdSStefano Zampini ierr = MatHeaderMerge(A,&tmat);CHKERRQ(ierr); 15222847e3fdSStefano Zampini } 152348b35521SBarry Smith } 15243a40ed3dSBarry Smith PetscFunctionReturn(0); 1525289bc588SBarry Smith } 1526289bc588SBarry Smith 1527e0877f53SBarry Smith static PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool *flg) 1528289bc588SBarry Smith { 1529c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data; 1530c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data; 1531ca15aa20SStefano Zampini PetscInt i; 1532ca15aa20SStefano Zampini const PetscScalar *v1,*v2; 1533ca15aa20SStefano Zampini PetscErrorCode ierr; 15349ea5d5aeSSatish Balay 15353a40ed3dSBarry Smith PetscFunctionBegin; 1536d0f46423SBarry Smith if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1537d0f46423SBarry Smith if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1538ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A1,&v1);CHKERRQ(ierr); 1539ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A2,&v2);CHKERRQ(ierr); 1540ca15aa20SStefano Zampini for (i=0; i<A1->cmap->n; i++) { 1541ca15aa20SStefano Zampini ierr = PetscArraycmp(v1,v2,A1->rmap->n,flg);CHKERRQ(ierr); 1542ca15aa20SStefano Zampini if (*flg == PETSC_FALSE) PetscFunctionReturn(0); 1543ca15aa20SStefano Zampini v1 += mat1->lda; 1544ca15aa20SStefano Zampini v2 += mat2->lda; 15451b807ce4Svictorle } 1546ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A1,&v1);CHKERRQ(ierr); 1547ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A2,&v2);CHKERRQ(ierr); 154877c4ece6SBarry Smith *flg = PETSC_TRUE; 15493a40ed3dSBarry Smith PetscFunctionReturn(0); 1550289bc588SBarry Smith } 1551289bc588SBarry Smith 1552e0877f53SBarry Smith static PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v) 1553289bc588SBarry Smith { 1554c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 155513f74950SBarry Smith PetscInt i,n,len; 1556ca15aa20SStefano Zampini PetscScalar *x; 1557ca15aa20SStefano Zampini const PetscScalar *vv; 1558ca15aa20SStefano Zampini PetscErrorCode ierr; 155944cd7ae7SLois Curfman McInnes 15603a40ed3dSBarry Smith PetscFunctionBegin; 15617a97a34bSBarry Smith ierr = VecGetSize(v,&n);CHKERRQ(ierr); 15621ebc52fbSHong Zhang ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1563d0f46423SBarry Smith len = PetscMin(A->rmap->n,A->cmap->n); 1564ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&vv);CHKERRQ(ierr); 1565e32f2f54SBarry Smith if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec"); 156644cd7ae7SLois Curfman McInnes for (i=0; i<len; i++) { 1567ca15aa20SStefano Zampini x[i] = vv[i*mat->lda + i]; 1568289bc588SBarry Smith } 1569ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&vv);CHKERRQ(ierr); 15701ebc52fbSHong Zhang ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 15713a40ed3dSBarry Smith PetscFunctionReturn(0); 1572289bc588SBarry Smith } 1573289bc588SBarry Smith 1574e0877f53SBarry Smith static PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr) 1575289bc588SBarry Smith { 1576c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1577f1ceaac6SMatthew G. Knepley const PetscScalar *l,*r; 1578ca15aa20SStefano Zampini PetscScalar x,*v,*vv; 1579dfbe8321SBarry Smith PetscErrorCode ierr; 1580d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n; 158155659b69SBarry Smith 15823a40ed3dSBarry Smith PetscFunctionBegin; 1583ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&vv);CHKERRQ(ierr); 158428988994SBarry Smith if (ll) { 15857a97a34bSBarry Smith ierr = VecGetSize(ll,&m);CHKERRQ(ierr); 1586f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(ll,&l);CHKERRQ(ierr); 1587e32f2f54SBarry Smith if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size"); 1588da3a660dSBarry Smith for (i=0; i<m; i++) { 1589da3a660dSBarry Smith x = l[i]; 1590ca15aa20SStefano Zampini v = vv + i; 1591b43bac26SStefano Zampini for (j=0; j<n; j++) { (*v) *= x; v+= mat->lda;} 1592da3a660dSBarry Smith } 1593f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(ll,&l);CHKERRQ(ierr); 1594eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr); 1595da3a660dSBarry Smith } 159628988994SBarry Smith if (rr) { 15977a97a34bSBarry Smith ierr = VecGetSize(rr,&n);CHKERRQ(ierr); 1598f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(rr,&r);CHKERRQ(ierr); 1599e32f2f54SBarry Smith if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size"); 1600da3a660dSBarry Smith for (i=0; i<n; i++) { 1601da3a660dSBarry Smith x = r[i]; 1602ca15aa20SStefano Zampini v = vv + i*mat->lda; 16032205254eSKarl Rupp for (j=0; j<m; j++) (*v++) *= x; 1604da3a660dSBarry Smith } 1605f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(rr,&r);CHKERRQ(ierr); 1606eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr); 1607da3a660dSBarry Smith } 1608ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&vv);CHKERRQ(ierr); 16093a40ed3dSBarry Smith PetscFunctionReturn(0); 1610289bc588SBarry Smith } 1611289bc588SBarry Smith 1612ca15aa20SStefano Zampini PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm) 1613289bc588SBarry Smith { 1614c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1615ca15aa20SStefano Zampini PetscScalar *v,*vv; 1616329f5518SBarry Smith PetscReal sum = 0.0; 1617d0f46423SBarry Smith PetscInt lda =mat->lda,m=A->rmap->n,i,j; 1618efee365bSSatish Balay PetscErrorCode ierr; 161955659b69SBarry Smith 16203a40ed3dSBarry Smith PetscFunctionBegin; 1621ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,(const PetscScalar**)&vv);CHKERRQ(ierr); 1622ca15aa20SStefano Zampini v = vv; 1623289bc588SBarry Smith if (type == NORM_FROBENIUS) { 1624a5ce6ee0Svictorle if (lda>m) { 1625d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1626ca15aa20SStefano Zampini v = vv+j*lda; 1627a5ce6ee0Svictorle for (i=0; i<m; i++) { 1628a5ce6ee0Svictorle sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1629a5ce6ee0Svictorle } 1630a5ce6ee0Svictorle } 1631a5ce6ee0Svictorle } else { 1632570b7f6dSBarry Smith #if defined(PETSC_USE_REAL___FP16) 1633570b7f6dSBarry Smith PetscBLASInt one = 1,cnt = A->cmap->n*A->rmap->n; 1634570b7f6dSBarry Smith *nrm = BLASnrm2_(&cnt,v,&one); 1635570b7f6dSBarry Smith } 1636570b7f6dSBarry Smith #else 1637d0f46423SBarry Smith for (i=0; i<A->cmap->n*A->rmap->n; i++) { 1638329f5518SBarry Smith sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1639289bc588SBarry Smith } 1640a5ce6ee0Svictorle } 16418f1a2a5eSBarry Smith *nrm = PetscSqrtReal(sum); 1642570b7f6dSBarry Smith #endif 1643dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 16443a40ed3dSBarry Smith } else if (type == NORM_1) { 1645064f8208SBarry Smith *nrm = 0.0; 1646d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1647ca15aa20SStefano Zampini v = vv + j*mat->lda; 1648289bc588SBarry Smith sum = 0.0; 1649d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 165033a8263dSBarry Smith sum += PetscAbsScalar(*v); v++; 1651289bc588SBarry Smith } 1652064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1653289bc588SBarry Smith } 1654eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 16553a40ed3dSBarry Smith } else if (type == NORM_INFINITY) { 1656064f8208SBarry Smith *nrm = 0.0; 1657d0f46423SBarry Smith for (j=0; j<A->rmap->n; j++) { 1658ca15aa20SStefano Zampini v = vv + j; 1659289bc588SBarry Smith sum = 0.0; 1660d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) { 16611b807ce4Svictorle sum += PetscAbsScalar(*v); v += mat->lda; 1662289bc588SBarry Smith } 1663064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1664289bc588SBarry Smith } 1665eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 1666e7e72b3dSBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm"); 1667ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,(const PetscScalar**)&vv);CHKERRQ(ierr); 16683a40ed3dSBarry Smith PetscFunctionReturn(0); 1669289bc588SBarry Smith } 1670289bc588SBarry Smith 1671e0877f53SBarry Smith static PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg) 1672289bc588SBarry Smith { 1673c0bbcb79SLois Curfman McInnes Mat_SeqDense *aij = (Mat_SeqDense*)A->data; 167463ba0a88SBarry Smith PetscErrorCode ierr; 167567e560aaSBarry Smith 16763a40ed3dSBarry Smith PetscFunctionBegin; 1677b5a2b587SKris Buschelman switch (op) { 1678b5a2b587SKris Buschelman case MAT_ROW_ORIENTED: 16794e0d8c25SBarry Smith aij->roworiented = flg; 1680b5a2b587SKris Buschelman break; 1681512a5fc5SBarry Smith case MAT_NEW_NONZERO_LOCATIONS: 1682b5a2b587SKris Buschelman case MAT_NEW_NONZERO_LOCATION_ERR: 16833971808eSMatthew Knepley case MAT_NEW_NONZERO_ALLOCATION_ERR: 16844e0d8c25SBarry Smith case MAT_NEW_DIAGONALS: 168513fa8e87SLisandro Dalcin case MAT_KEEP_NONZERO_PATTERN: 1686b5a2b587SKris Buschelman case MAT_IGNORE_OFF_PROC_ENTRIES: 1687b5a2b587SKris Buschelman case MAT_USE_HASH_TABLE: 16880f8fb01aSBarry Smith case MAT_IGNORE_ZERO_ENTRIES: 16895021d80fSJed Brown case MAT_IGNORE_LOWER_TRIANGULAR: 1690071fcb05SBarry Smith case MAT_SORTED_FULL: 16915021d80fSJed Brown ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr); 16925021d80fSJed Brown break; 16935021d80fSJed Brown case MAT_SPD: 169477e54ba9SKris Buschelman case MAT_SYMMETRIC: 169577e54ba9SKris Buschelman case MAT_STRUCTURALLY_SYMMETRIC: 16969a4540c5SBarry Smith case MAT_HERMITIAN: 16979a4540c5SBarry Smith case MAT_SYMMETRY_ETERNAL: 16985021d80fSJed Brown /* These options are handled directly by MatSetOption() */ 169977e54ba9SKris Buschelman break; 1700b5a2b587SKris Buschelman default: 1701e32f2f54SBarry Smith SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]); 17023a40ed3dSBarry Smith } 17033a40ed3dSBarry Smith PetscFunctionReturn(0); 1704289bc588SBarry Smith } 1705289bc588SBarry Smith 1706e0877f53SBarry Smith static PetscErrorCode MatZeroEntries_SeqDense(Mat A) 17076f0a148fSBarry Smith { 1708ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 17096849ba73SBarry Smith PetscErrorCode ierr; 1710d0f46423SBarry Smith PetscInt lda=l->lda,m=A->rmap->n,j; 1711ca15aa20SStefano Zampini PetscScalar *v; 17123a40ed3dSBarry Smith 17133a40ed3dSBarry Smith PetscFunctionBegin; 1714ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr); 1715a5ce6ee0Svictorle if (lda>m) { 1716d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1717ca15aa20SStefano Zampini ierr = PetscArrayzero(v+j*lda,m);CHKERRQ(ierr); 1718a5ce6ee0Svictorle } 1719a5ce6ee0Svictorle } else { 1720ca15aa20SStefano Zampini ierr = PetscArrayzero(v,A->rmap->n*A->cmap->n);CHKERRQ(ierr); 1721a5ce6ee0Svictorle } 1722ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr); 17233a40ed3dSBarry Smith PetscFunctionReturn(0); 17246f0a148fSBarry Smith } 17256f0a148fSBarry Smith 1726e0877f53SBarry Smith static PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b) 17276f0a148fSBarry Smith { 172897b48c8fSBarry Smith PetscErrorCode ierr; 1729ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 1730b9679d65SBarry Smith PetscInt m = l->lda, n = A->cmap->n, i,j; 1731ca15aa20SStefano Zampini PetscScalar *slot,*bb,*v; 173297b48c8fSBarry Smith const PetscScalar *xx; 173355659b69SBarry Smith 17343a40ed3dSBarry Smith PetscFunctionBegin; 173576bd3646SJed Brown if (PetscDefined(USE_DEBUG)) { 1736b9679d65SBarry Smith for (i=0; i<N; i++) { 1737b9679d65SBarry Smith if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed"); 1738b9679d65SBarry Smith if (rows[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row %D requested to be zeroed greater than or equal number of rows %D",rows[i],A->rmap->n); 1739b9679d65SBarry Smith } 174076bd3646SJed Brown } 1741ca15aa20SStefano Zampini if (!N) PetscFunctionReturn(0); 1742b9679d65SBarry Smith 174397b48c8fSBarry Smith /* fix right hand side if needed */ 174497b48c8fSBarry Smith if (x && b) { 174597b48c8fSBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 174697b48c8fSBarry Smith ierr = VecGetArray(b,&bb);CHKERRQ(ierr); 17472205254eSKarl Rupp for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]]; 174897b48c8fSBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 174997b48c8fSBarry Smith ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr); 175097b48c8fSBarry Smith } 175197b48c8fSBarry Smith 1752ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr); 17536f0a148fSBarry Smith for (i=0; i<N; i++) { 1754ca15aa20SStefano Zampini slot = v + rows[i]; 1755b9679d65SBarry Smith for (j=0; j<n; j++) { *slot = 0.0; slot += m;} 17566f0a148fSBarry Smith } 1757f4df32b1SMatthew Knepley if (diag != 0.0) { 1758b9679d65SBarry Smith if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 17596f0a148fSBarry Smith for (i=0; i<N; i++) { 1760ca15aa20SStefano Zampini slot = v + (m+1)*rows[i]; 1761f4df32b1SMatthew Knepley *slot = diag; 17626f0a148fSBarry Smith } 17636f0a148fSBarry Smith } 1764ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr); 17653a40ed3dSBarry Smith PetscFunctionReturn(0); 17666f0a148fSBarry Smith } 1767557bce09SLois Curfman McInnes 176849a6ff4bSBarry Smith static PetscErrorCode MatDenseGetLDA_SeqDense(Mat A,PetscInt *lda) 176949a6ff4bSBarry Smith { 177049a6ff4bSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 177149a6ff4bSBarry Smith 177249a6ff4bSBarry Smith PetscFunctionBegin; 177349a6ff4bSBarry Smith *lda = mat->lda; 177449a6ff4bSBarry Smith PetscFunctionReturn(0); 177549a6ff4bSBarry Smith } 177649a6ff4bSBarry Smith 1777637a0070SStefano Zampini PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar **array) 177864e87e97SBarry Smith { 1779c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 17803a40ed3dSBarry Smith 17813a40ed3dSBarry Smith PetscFunctionBegin; 1782616b8fbbSStefano Zampini if (mat->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first"); 178364e87e97SBarry Smith *array = mat->v; 17843a40ed3dSBarry Smith PetscFunctionReturn(0); 178564e87e97SBarry Smith } 17860754003eSLois Curfman McInnes 1787637a0070SStefano Zampini PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar **array) 1788ff14e315SSatish Balay { 17893a40ed3dSBarry Smith PetscFunctionBegin; 1790637a0070SStefano Zampini *array = NULL; 17913a40ed3dSBarry Smith PetscFunctionReturn(0); 1792ff14e315SSatish Balay } 17930754003eSLois Curfman McInnes 1794dec5eb66SMatthew G Knepley /*@C 179549a6ff4bSBarry Smith MatDenseGetLDA - gets the leading dimension of the array returned from MatDenseGetArray() 179649a6ff4bSBarry Smith 1797ad16ce7aSStefano Zampini Not collective 179849a6ff4bSBarry Smith 179949a6ff4bSBarry Smith Input Parameter: 180049a6ff4bSBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 180149a6ff4bSBarry Smith 180249a6ff4bSBarry Smith Output Parameter: 180349a6ff4bSBarry Smith . lda - the leading dimension 180449a6ff4bSBarry Smith 180549a6ff4bSBarry Smith Level: intermediate 180649a6ff4bSBarry Smith 1807ad16ce7aSStefano Zampini .seealso: MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead(), MatDenseSetLDA() 180849a6ff4bSBarry Smith @*/ 180949a6ff4bSBarry Smith PetscErrorCode MatDenseGetLDA(Mat A,PetscInt *lda) 181049a6ff4bSBarry Smith { 181149a6ff4bSBarry Smith PetscErrorCode ierr; 181249a6ff4bSBarry Smith 181349a6ff4bSBarry Smith PetscFunctionBegin; 1814d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 1815d5ea218eSStefano Zampini PetscValidPointer(lda,2); 181649a6ff4bSBarry Smith ierr = PetscUseMethod(A,"MatDenseGetLDA_C",(Mat,PetscInt*),(A,lda));CHKERRQ(ierr); 181749a6ff4bSBarry Smith PetscFunctionReturn(0); 181849a6ff4bSBarry Smith } 181949a6ff4bSBarry Smith 182049a6ff4bSBarry Smith /*@C 1821ad16ce7aSStefano Zampini MatDenseSetLDA - Sets the leading dimension of the array used by the dense matrix 1822ad16ce7aSStefano Zampini 1823ad16ce7aSStefano Zampini Not collective 1824ad16ce7aSStefano Zampini 1825ad16ce7aSStefano Zampini Input Parameter: 1826ad16ce7aSStefano Zampini + mat - a MATSEQDENSE or MATMPIDENSE matrix 1827ad16ce7aSStefano Zampini - lda - the leading dimension 1828ad16ce7aSStefano Zampini 1829ad16ce7aSStefano Zampini Level: intermediate 1830ad16ce7aSStefano Zampini 1831ad16ce7aSStefano Zampini .seealso: MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead(), MatDenseGetLDA() 1832ad16ce7aSStefano Zampini @*/ 1833ad16ce7aSStefano Zampini PetscErrorCode MatDenseSetLDA(Mat A,PetscInt lda) 1834ad16ce7aSStefano Zampini { 1835ad16ce7aSStefano Zampini PetscErrorCode ierr; 1836ad16ce7aSStefano Zampini 1837ad16ce7aSStefano Zampini PetscFunctionBegin; 1838ad16ce7aSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 1839ad16ce7aSStefano Zampini ierr = PetscTryMethod(A,"MatDenseSetLDA_C",(Mat,PetscInt),(A,lda));CHKERRQ(ierr); 1840ad16ce7aSStefano Zampini PetscFunctionReturn(0); 1841ad16ce7aSStefano Zampini } 1842ad16ce7aSStefano Zampini 1843ad16ce7aSStefano Zampini /*@C 18446947451fSStefano Zampini MatDenseGetArray - gives read-write access to the array where the data for a dense matrix is stored 184573a71a0fSBarry Smith 18468572280aSBarry Smith Logically Collective on Mat 184773a71a0fSBarry Smith 184873a71a0fSBarry Smith Input Parameter: 18496947451fSStefano Zampini . mat - a dense matrix 185073a71a0fSBarry Smith 185173a71a0fSBarry Smith Output Parameter: 185273a71a0fSBarry Smith . array - pointer to the data 185373a71a0fSBarry Smith 185473a71a0fSBarry Smith Level: intermediate 185573a71a0fSBarry Smith 18566947451fSStefano Zampini .seealso: MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead(), MatDenseGetArrayWrite(), MatDenseRestoreArrayWrite() 185773a71a0fSBarry Smith @*/ 18588c778c55SBarry Smith PetscErrorCode MatDenseGetArray(Mat A,PetscScalar **array) 185973a71a0fSBarry Smith { 186073a71a0fSBarry Smith PetscErrorCode ierr; 186173a71a0fSBarry Smith 186273a71a0fSBarry Smith PetscFunctionBegin; 1863d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 1864d5ea218eSStefano Zampini PetscValidPointer(array,2); 18658c778c55SBarry Smith ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 186673a71a0fSBarry Smith PetscFunctionReturn(0); 186773a71a0fSBarry Smith } 186873a71a0fSBarry Smith 1869dec5eb66SMatthew G Knepley /*@C 1870579dbff0SBarry Smith MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray() 187173a71a0fSBarry Smith 18728572280aSBarry Smith Logically Collective on Mat 18738572280aSBarry Smith 18748572280aSBarry Smith Input Parameters: 18756947451fSStefano Zampini + mat - a dense matrix 1876a2b725a8SWilliam Gropp - array - pointer to the data 18778572280aSBarry Smith 18788572280aSBarry Smith Level: intermediate 18798572280aSBarry Smith 18806947451fSStefano Zampini .seealso: MatDenseGetArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead(), MatDenseGetArrayWrite(), MatDenseRestoreArrayWrite() 18818572280aSBarry Smith @*/ 18828572280aSBarry Smith PetscErrorCode MatDenseRestoreArray(Mat A,PetscScalar **array) 18838572280aSBarry Smith { 18848572280aSBarry Smith PetscErrorCode ierr; 18858572280aSBarry Smith 18868572280aSBarry Smith PetscFunctionBegin; 1887d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 1888d5ea218eSStefano Zampini PetscValidPointer(array,2); 18898572280aSBarry Smith ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 18908572280aSBarry Smith ierr = PetscObjectStateIncrease((PetscObject)A);CHKERRQ(ierr); 1891637a0070SStefano Zampini #if defined(PETSC_HAVE_CUDA) 1892637a0070SStefano Zampini A->offloadmask = PETSC_OFFLOAD_CPU; 1893637a0070SStefano Zampini #endif 18948572280aSBarry Smith PetscFunctionReturn(0); 18958572280aSBarry Smith } 18968572280aSBarry Smith 18978572280aSBarry Smith /*@C 18986947451fSStefano Zampini MatDenseGetArrayRead - gives read-only access to the array where the data for a dense matrix is stored 18998572280aSBarry Smith 19008572280aSBarry Smith Not Collective 19018572280aSBarry Smith 19028572280aSBarry Smith Input Parameter: 19036947451fSStefano Zampini . mat - a dense matrix 19048572280aSBarry Smith 19058572280aSBarry Smith Output Parameter: 19068572280aSBarry Smith . array - pointer to the data 19078572280aSBarry Smith 19088572280aSBarry Smith Level: intermediate 19098572280aSBarry Smith 19106947451fSStefano Zampini .seealso: MatDenseRestoreArrayRead(), MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayWrite(), MatDenseRestoreArrayWrite() 19118572280aSBarry Smith @*/ 19128572280aSBarry Smith PetscErrorCode MatDenseGetArrayRead(Mat A,const PetscScalar **array) 19138572280aSBarry Smith { 19148572280aSBarry Smith PetscErrorCode ierr; 19158572280aSBarry Smith 19168572280aSBarry Smith PetscFunctionBegin; 1917d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 1918d5ea218eSStefano Zampini PetscValidPointer(array,2); 19198572280aSBarry Smith ierr = PetscUseMethod(A,"MatDenseGetArrayRead_C",(Mat,const PetscScalar**),(A,array));CHKERRQ(ierr); 19208572280aSBarry Smith PetscFunctionReturn(0); 19218572280aSBarry Smith } 19228572280aSBarry Smith 19238572280aSBarry Smith /*@C 19246947451fSStefano Zampini MatDenseRestoreArrayRead - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArrayRead() 19258572280aSBarry Smith 192673a71a0fSBarry Smith Not Collective 192773a71a0fSBarry Smith 192873a71a0fSBarry Smith Input Parameters: 19296947451fSStefano Zampini + mat - a dense matrix 1930a2b725a8SWilliam Gropp - array - pointer to the data 193173a71a0fSBarry Smith 193273a71a0fSBarry Smith Level: intermediate 193373a71a0fSBarry Smith 19346947451fSStefano Zampini .seealso: MatDenseGetArrayRead(), MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayWrite(), MatDenseRestoreArrayWrite() 193573a71a0fSBarry Smith @*/ 19368572280aSBarry Smith PetscErrorCode MatDenseRestoreArrayRead(Mat A,const PetscScalar **array) 193773a71a0fSBarry Smith { 193873a71a0fSBarry Smith PetscErrorCode ierr; 193973a71a0fSBarry Smith 194073a71a0fSBarry Smith PetscFunctionBegin; 1941d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 1942d5ea218eSStefano Zampini PetscValidPointer(array,2); 19438572280aSBarry Smith ierr = PetscUseMethod(A,"MatDenseRestoreArrayRead_C",(Mat,const PetscScalar**),(A,array));CHKERRQ(ierr); 194473a71a0fSBarry Smith PetscFunctionReturn(0); 194573a71a0fSBarry Smith } 194673a71a0fSBarry Smith 19476947451fSStefano Zampini /*@C 19486947451fSStefano Zampini MatDenseGetArrayWrite - gives write-only access to the array where the data for a dense matrix is stored 19496947451fSStefano Zampini 19506947451fSStefano Zampini Not Collective 19516947451fSStefano Zampini 19526947451fSStefano Zampini Input Parameter: 19536947451fSStefano Zampini . mat - a dense matrix 19546947451fSStefano Zampini 19556947451fSStefano Zampini Output Parameter: 19566947451fSStefano Zampini . array - pointer to the data 19576947451fSStefano Zampini 19586947451fSStefano Zampini Level: intermediate 19596947451fSStefano Zampini 19606947451fSStefano Zampini .seealso: MatDenseRestoreArrayWrite(), MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead() 19616947451fSStefano Zampini @*/ 19626947451fSStefano Zampini PetscErrorCode MatDenseGetArrayWrite(Mat A,PetscScalar **array) 19636947451fSStefano Zampini { 19646947451fSStefano Zampini PetscErrorCode ierr; 19656947451fSStefano Zampini 19666947451fSStefano Zampini PetscFunctionBegin; 1967d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 1968d5ea218eSStefano Zampini PetscValidPointer(array,2); 19696947451fSStefano Zampini ierr = PetscUseMethod(A,"MatDenseGetArrayWrite_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 19706947451fSStefano Zampini PetscFunctionReturn(0); 19716947451fSStefano Zampini } 19726947451fSStefano Zampini 19736947451fSStefano Zampini /*@C 19746947451fSStefano Zampini MatDenseRestoreArrayWrite - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArrayWrite() 19756947451fSStefano Zampini 19766947451fSStefano Zampini Not Collective 19776947451fSStefano Zampini 19786947451fSStefano Zampini Input Parameters: 19796947451fSStefano Zampini + mat - a dense matrix 19806947451fSStefano Zampini - array - pointer to the data 19816947451fSStefano Zampini 19826947451fSStefano Zampini Level: intermediate 19836947451fSStefano Zampini 19846947451fSStefano Zampini .seealso: MatDenseGetArrayWrite(), MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead() 19856947451fSStefano Zampini @*/ 19866947451fSStefano Zampini PetscErrorCode MatDenseRestoreArrayWrite(Mat A,PetscScalar **array) 19876947451fSStefano Zampini { 19886947451fSStefano Zampini PetscErrorCode ierr; 19896947451fSStefano Zampini 19906947451fSStefano Zampini PetscFunctionBegin; 1991d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 1992d5ea218eSStefano Zampini PetscValidPointer(array,2); 19936947451fSStefano Zampini ierr = PetscUseMethod(A,"MatDenseRestoreArrayWrite_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 19946947451fSStefano Zampini ierr = PetscObjectStateIncrease((PetscObject)A);CHKERRQ(ierr); 19956947451fSStefano Zampini #if defined(PETSC_HAVE_CUDA) 19966947451fSStefano Zampini A->offloadmask = PETSC_OFFLOAD_CPU; 19976947451fSStefano Zampini #endif 19986947451fSStefano Zampini PetscFunctionReturn(0); 19996947451fSStefano Zampini } 20006947451fSStefano Zampini 20017dae84e0SHong Zhang static PetscErrorCode MatCreateSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B) 20020754003eSLois Curfman McInnes { 2003c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 20046849ba73SBarry Smith PetscErrorCode ierr; 2005ca15aa20SStefano Zampini PetscInt i,j,nrows,ncols,blda; 20065d0c19d7SBarry Smith const PetscInt *irow,*icol; 200787828ca2SBarry Smith PetscScalar *av,*bv,*v = mat->v; 20080754003eSLois Curfman McInnes Mat newmat; 20090754003eSLois Curfman McInnes 20103a40ed3dSBarry Smith PetscFunctionBegin; 201178b31e54SBarry Smith ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr); 201278b31e54SBarry Smith ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr); 2013e03a110bSBarry Smith ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr); 2014e03a110bSBarry Smith ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr); 20150754003eSLois Curfman McInnes 2016182d2002SSatish Balay /* Check submatrixcall */ 2017182d2002SSatish Balay if (scall == MAT_REUSE_MATRIX) { 201813f74950SBarry Smith PetscInt n_cols,n_rows; 2019182d2002SSatish Balay ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr); 202021a2c019SBarry Smith if (n_rows != nrows || n_cols != ncols) { 2021f746d493SDmitry Karpeev /* resize the result matrix to match number of requested rows/columns */ 2022c61587bbSBarry Smith ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 202321a2c019SBarry Smith } 2024182d2002SSatish Balay newmat = *B; 2025182d2002SSatish Balay } else { 20260754003eSLois Curfman McInnes /* Create and fill new matrix */ 2027ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr); 2028f69a0ea3SMatthew Knepley ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 20297adad957SLisandro Dalcin ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 20300298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr); 2031182d2002SSatish Balay } 2032182d2002SSatish Balay 2033182d2002SSatish Balay /* Now extract the data pointers and do the copy,column at a time */ 2034ca15aa20SStefano Zampini ierr = MatDenseGetArray(newmat,&bv);CHKERRQ(ierr); 2035ca15aa20SStefano Zampini ierr = MatDenseGetLDA(newmat,&blda);CHKERRQ(ierr); 2036182d2002SSatish Balay for (i=0; i<ncols; i++) { 20376de62eeeSBarry Smith av = v + mat->lda*icol[i]; 2038ca15aa20SStefano Zampini for (j=0; j<nrows; j++) bv[j] = av[irow[j]]; 2039ca15aa20SStefano Zampini bv += blda; 20400754003eSLois Curfman McInnes } 2041ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(newmat,&bv);CHKERRQ(ierr); 2042182d2002SSatish Balay 2043182d2002SSatish Balay /* Assemble the matrices so that the correct flags are set */ 20446d4a8577SBarry Smith ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 20456d4a8577SBarry Smith ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 20460754003eSLois Curfman McInnes 20470754003eSLois Curfman McInnes /* Free work space */ 204878b31e54SBarry Smith ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr); 204978b31e54SBarry Smith ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr); 2050182d2002SSatish Balay *B = newmat; 20513a40ed3dSBarry Smith PetscFunctionReturn(0); 20520754003eSLois Curfman McInnes } 20530754003eSLois Curfman McInnes 20547dae84e0SHong Zhang static PetscErrorCode MatCreateSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[]) 2055905e6a2fSBarry Smith { 20566849ba73SBarry Smith PetscErrorCode ierr; 205713f74950SBarry Smith PetscInt i; 2058905e6a2fSBarry Smith 20593a40ed3dSBarry Smith PetscFunctionBegin; 2060905e6a2fSBarry Smith if (scall == MAT_INITIAL_MATRIX) { 2061df750dc8SHong Zhang ierr = PetscCalloc1(n+1,B);CHKERRQ(ierr); 2062905e6a2fSBarry Smith } 2063905e6a2fSBarry Smith 2064905e6a2fSBarry Smith for (i=0; i<n; i++) { 20657dae84e0SHong Zhang ierr = MatCreateSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr); 2066905e6a2fSBarry Smith } 20673a40ed3dSBarry Smith PetscFunctionReturn(0); 2068905e6a2fSBarry Smith } 2069905e6a2fSBarry Smith 2070e0877f53SBarry Smith static PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode) 2071c0aa2d19SHong Zhang { 2072c0aa2d19SHong Zhang PetscFunctionBegin; 2073c0aa2d19SHong Zhang PetscFunctionReturn(0); 2074c0aa2d19SHong Zhang } 2075c0aa2d19SHong Zhang 2076e0877f53SBarry Smith static PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode) 2077c0aa2d19SHong Zhang { 2078c0aa2d19SHong Zhang PetscFunctionBegin; 2079c0aa2d19SHong Zhang PetscFunctionReturn(0); 2080c0aa2d19SHong Zhang } 2081c0aa2d19SHong Zhang 2082e0877f53SBarry Smith static PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str) 20834b0e389bSBarry Smith { 20844b0e389bSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data; 20856849ba73SBarry Smith PetscErrorCode ierr; 2086ca15aa20SStefano Zampini const PetscScalar *va; 2087ca15aa20SStefano Zampini PetscScalar *vb; 2088d0f46423SBarry Smith PetscInt lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j; 20893a40ed3dSBarry Smith 20903a40ed3dSBarry Smith PetscFunctionBegin; 209133f4a19fSKris Buschelman /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */ 209233f4a19fSKris Buschelman if (A->ops->copy != B->ops->copy) { 2093cb5b572fSBarry Smith ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr); 20943a40ed3dSBarry Smith PetscFunctionReturn(0); 20953a40ed3dSBarry Smith } 2096e32f2f54SBarry Smith if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)"); 2097ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&va);CHKERRQ(ierr); 2098ca15aa20SStefano Zampini ierr = MatDenseGetArray(B,&vb);CHKERRQ(ierr); 2099a5ce6ee0Svictorle if (lda1>m || lda2>m) { 21000dbb7854Svictorle for (j=0; j<n; j++) { 2101ca15aa20SStefano Zampini ierr = PetscArraycpy(vb+j*lda2,va+j*lda1,m);CHKERRQ(ierr); 2102a5ce6ee0Svictorle } 2103a5ce6ee0Svictorle } else { 2104ca15aa20SStefano Zampini ierr = PetscArraycpy(vb,va,A->rmap->n*A->cmap->n);CHKERRQ(ierr); 2105a5ce6ee0Svictorle } 2106ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(B,&vb);CHKERRQ(ierr); 2107ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&va);CHKERRQ(ierr); 2108ca15aa20SStefano Zampini ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2109ca15aa20SStefano Zampini ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2110273d9f13SBarry Smith PetscFunctionReturn(0); 2111273d9f13SBarry Smith } 2112273d9f13SBarry Smith 2113e0877f53SBarry Smith static PetscErrorCode MatSetUp_SeqDense(Mat A) 2114273d9f13SBarry Smith { 2115dfbe8321SBarry Smith PetscErrorCode ierr; 2116273d9f13SBarry Smith 2117273d9f13SBarry Smith PetscFunctionBegin; 211818992e5dSStefano Zampini ierr = PetscLayoutSetUp(A->rmap);CHKERRQ(ierr); 211918992e5dSStefano Zampini ierr = PetscLayoutSetUp(A->cmap);CHKERRQ(ierr); 212018992e5dSStefano Zampini if (!A->preallocated) { 2121273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr); 212218992e5dSStefano Zampini } 21233a40ed3dSBarry Smith PetscFunctionReturn(0); 21244b0e389bSBarry Smith } 21254b0e389bSBarry Smith 2126ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A) 2127ba337c44SJed Brown { 2128ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 2129ca15aa20SStefano Zampini PetscScalar *aa; 2130ca15aa20SStefano Zampini PetscErrorCode ierr; 2131ba337c44SJed Brown 2132ba337c44SJed Brown PetscFunctionBegin; 2133ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&aa);CHKERRQ(ierr); 2134ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]); 2135ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&aa);CHKERRQ(ierr); 2136ba337c44SJed Brown PetscFunctionReturn(0); 2137ba337c44SJed Brown } 2138ba337c44SJed Brown 2139ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A) 2140ba337c44SJed Brown { 2141ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 2142ca15aa20SStefano Zampini PetscScalar *aa; 2143ca15aa20SStefano Zampini PetscErrorCode ierr; 2144ba337c44SJed Brown 2145ba337c44SJed Brown PetscFunctionBegin; 2146ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&aa);CHKERRQ(ierr); 2147ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]); 2148ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&aa);CHKERRQ(ierr); 2149ba337c44SJed Brown PetscFunctionReturn(0); 2150ba337c44SJed Brown } 2151ba337c44SJed Brown 2152ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A) 2153ba337c44SJed Brown { 2154ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 2155ca15aa20SStefano Zampini PetscScalar *aa; 2156ca15aa20SStefano Zampini PetscErrorCode ierr; 2157ba337c44SJed Brown 2158ba337c44SJed Brown PetscFunctionBegin; 2159ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&aa);CHKERRQ(ierr); 2160ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]); 2161ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&aa);CHKERRQ(ierr); 2162ba337c44SJed Brown PetscFunctionReturn(0); 2163ba337c44SJed Brown } 2164284134d9SBarry Smith 2165a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/ 21664222ddf1SHong Zhang PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat C) 2167a9fe9ddaSSatish Balay { 2168ee16a9a1SHong Zhang PetscErrorCode ierr; 2169d0f46423SBarry Smith PetscInt m=A->rmap->n,n=B->cmap->n; 21707a3c3d58SStefano Zampini PetscBool cisdense; 2171a9fe9ddaSSatish Balay 2172ee16a9a1SHong Zhang PetscFunctionBegin; 21734222ddf1SHong Zhang ierr = MatSetSizes(C,m,n,m,n);CHKERRQ(ierr); 21747a3c3d58SStefano Zampini ierr = PetscObjectTypeCompareAny((PetscObject)C,&cisdense,MATSEQDENSE,MATSEQDENSECUDA,"");CHKERRQ(ierr); 21757a3c3d58SStefano Zampini if (!cisdense) { 21767a3c3d58SStefano Zampini PetscBool flg; 21777a3c3d58SStefano Zampini 2178ca15aa20SStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)B,((PetscObject)A)->type_name,&flg);CHKERRQ(ierr); 21794222ddf1SHong Zhang ierr = MatSetType(C,flg ? ((PetscObject)A)->type_name : MATDENSE);CHKERRQ(ierr); 21807a3c3d58SStefano Zampini } 218118992e5dSStefano Zampini ierr = MatSetUp(C);CHKERRQ(ierr); 2182ee16a9a1SHong Zhang PetscFunctionReturn(0); 2183ee16a9a1SHong Zhang } 2184a9fe9ddaSSatish Balay 2185a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 2186a9fe9ddaSSatish Balay { 21876718818eSStefano Zampini Mat_SeqDense *a=(Mat_SeqDense*)A->data,*b=(Mat_SeqDense*)B->data,*c=(Mat_SeqDense*)C->data; 21880805154bSBarry Smith PetscBLASInt m,n,k; 2189ca15aa20SStefano Zampini const PetscScalar *av,*bv; 2190ca15aa20SStefano Zampini PetscScalar *cv; 2191a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 2192c2916339SPierre Jolivet PetscErrorCode ierr; 2193a9fe9ddaSSatish Balay 2194a9fe9ddaSSatish Balay PetscFunctionBegin; 21958208b9aeSStefano Zampini ierr = PetscBLASIntCast(C->rmap->n,&m);CHKERRQ(ierr); 21968208b9aeSStefano Zampini ierr = PetscBLASIntCast(C->cmap->n,&n);CHKERRQ(ierr); 2197c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr); 219849d0e964SStefano Zampini if (!m || !n || !k) PetscFunctionReturn(0); 2199ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&av);CHKERRQ(ierr); 2200ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(B,&bv);CHKERRQ(ierr); 22016718818eSStefano Zampini ierr = MatDenseGetArrayWrite(C,&cv);CHKERRQ(ierr); 2202ca15aa20SStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("N","N",&m,&n,&k,&_DOne,av,&a->lda,bv,&b->lda,&_DZero,cv,&c->lda)); 2203ca15aa20SStefano Zampini ierr = PetscLogFlops(1.0*m*n*k + 1.0*m*n*(k-1));CHKERRQ(ierr); 2204ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&av);CHKERRQ(ierr); 2205ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(B,&bv);CHKERRQ(ierr); 22066718818eSStefano Zampini ierr = MatDenseRestoreArrayWrite(C,&cv);CHKERRQ(ierr); 2207a9fe9ddaSSatish Balay PetscFunctionReturn(0); 2208a9fe9ddaSSatish Balay } 2209a9fe9ddaSSatish Balay 22104222ddf1SHong Zhang PetscErrorCode MatMatTransposeMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat C) 221169f65d41SStefano Zampini { 221269f65d41SStefano Zampini PetscErrorCode ierr; 221369f65d41SStefano Zampini PetscInt m=A->rmap->n,n=B->rmap->n; 22147a3c3d58SStefano Zampini PetscBool cisdense; 221569f65d41SStefano Zampini 221669f65d41SStefano Zampini PetscFunctionBegin; 22174222ddf1SHong Zhang ierr = MatSetSizes(C,m,n,m,n);CHKERRQ(ierr); 22187a3c3d58SStefano Zampini ierr = PetscObjectTypeCompareAny((PetscObject)C,&cisdense,MATSEQDENSE,MATSEQDENSECUDA,"");CHKERRQ(ierr); 22197a3c3d58SStefano Zampini if (!cisdense) { 22207a3c3d58SStefano Zampini PetscBool flg; 22217a3c3d58SStefano Zampini 2222ca15aa20SStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)B,((PetscObject)A)->type_name,&flg);CHKERRQ(ierr); 22234222ddf1SHong Zhang ierr = MatSetType(C,flg ? ((PetscObject)A)->type_name : MATDENSE);CHKERRQ(ierr); 22247a3c3d58SStefano Zampini } 222518992e5dSStefano Zampini ierr = MatSetUp(C);CHKERRQ(ierr); 222669f65d41SStefano Zampini PetscFunctionReturn(0); 222769f65d41SStefano Zampini } 222869f65d41SStefano Zampini 222969f65d41SStefano Zampini PetscErrorCode MatMatTransposeMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 223069f65d41SStefano Zampini { 223169f65d41SStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 223269f65d41SStefano Zampini Mat_SeqDense *b = (Mat_SeqDense*)B->data; 223369f65d41SStefano Zampini Mat_SeqDense *c = (Mat_SeqDense*)C->data; 22346718818eSStefano Zampini const PetscScalar *av,*bv; 22356718818eSStefano Zampini PetscScalar *cv; 223669f65d41SStefano Zampini PetscBLASInt m,n,k; 223769f65d41SStefano Zampini PetscScalar _DOne=1.0,_DZero=0.0; 223869f65d41SStefano Zampini PetscErrorCode ierr; 223969f65d41SStefano Zampini 224069f65d41SStefano Zampini PetscFunctionBegin; 224149d0e964SStefano Zampini ierr = PetscBLASIntCast(C->rmap->n,&m);CHKERRQ(ierr); 224249d0e964SStefano Zampini ierr = PetscBLASIntCast(C->cmap->n,&n);CHKERRQ(ierr); 224369f65d41SStefano Zampini ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr); 224449d0e964SStefano Zampini if (!m || !n || !k) PetscFunctionReturn(0); 22456718818eSStefano Zampini ierr = MatDenseGetArrayRead(A,&av);CHKERRQ(ierr); 22466718818eSStefano Zampini ierr = MatDenseGetArrayRead(B,&bv);CHKERRQ(ierr); 22476718818eSStefano Zampini ierr = MatDenseGetArrayWrite(C,&cv);CHKERRQ(ierr); 22486718818eSStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("N","T",&m,&n,&k,&_DOne,av,&a->lda,bv,&b->lda,&_DZero,cv,&c->lda)); 22496718818eSStefano Zampini ierr = MatDenseRestoreArrayRead(A,&av);CHKERRQ(ierr); 22506718818eSStefano Zampini ierr = MatDenseRestoreArrayRead(B,&bv);CHKERRQ(ierr); 22516718818eSStefano Zampini ierr = MatDenseRestoreArrayWrite(C,&cv);CHKERRQ(ierr); 2252ca15aa20SStefano Zampini ierr = PetscLogFlops(1.0*m*n*k + 1.0*m*n*(k-1));CHKERRQ(ierr); 225369f65d41SStefano Zampini PetscFunctionReturn(0); 225469f65d41SStefano Zampini } 225569f65d41SStefano Zampini 22564222ddf1SHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat C) 2257a9fe9ddaSSatish Balay { 2258ee16a9a1SHong Zhang PetscErrorCode ierr; 2259d0f46423SBarry Smith PetscInt m=A->cmap->n,n=B->cmap->n; 22607a3c3d58SStefano Zampini PetscBool cisdense; 2261a9fe9ddaSSatish Balay 2262ee16a9a1SHong Zhang PetscFunctionBegin; 22634222ddf1SHong Zhang ierr = MatSetSizes(C,m,n,m,n);CHKERRQ(ierr); 22647a3c3d58SStefano Zampini ierr = PetscObjectTypeCompareAny((PetscObject)C,&cisdense,MATSEQDENSE,MATSEQDENSECUDA,"");CHKERRQ(ierr); 22657a3c3d58SStefano Zampini if (!cisdense) { 22667a3c3d58SStefano Zampini PetscBool flg; 22677a3c3d58SStefano Zampini 2268ca15aa20SStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)B,((PetscObject)A)->type_name,&flg);CHKERRQ(ierr); 22694222ddf1SHong Zhang ierr = MatSetType(C,flg ? ((PetscObject)A)->type_name : MATDENSE);CHKERRQ(ierr); 22707a3c3d58SStefano Zampini } 227118992e5dSStefano Zampini ierr = MatSetUp(C);CHKERRQ(ierr); 2272ee16a9a1SHong Zhang PetscFunctionReturn(0); 2273ee16a9a1SHong Zhang } 2274a9fe9ddaSSatish Balay 227575648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 2276a9fe9ddaSSatish Balay { 2277a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2278a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 2279a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 22806718818eSStefano Zampini const PetscScalar *av,*bv; 22816718818eSStefano Zampini PetscScalar *cv; 22820805154bSBarry Smith PetscBLASInt m,n,k; 2283a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 2284c5df96a5SBarry Smith PetscErrorCode ierr; 2285a9fe9ddaSSatish Balay 2286a9fe9ddaSSatish Balay PetscFunctionBegin; 22878208b9aeSStefano Zampini ierr = PetscBLASIntCast(C->rmap->n,&m);CHKERRQ(ierr); 22888208b9aeSStefano Zampini ierr = PetscBLASIntCast(C->cmap->n,&n);CHKERRQ(ierr); 2289c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr); 229049d0e964SStefano Zampini if (!m || !n || !k) PetscFunctionReturn(0); 22916718818eSStefano Zampini ierr = MatDenseGetArrayRead(A,&av);CHKERRQ(ierr); 22926718818eSStefano Zampini ierr = MatDenseGetArrayRead(B,&bv);CHKERRQ(ierr); 22936718818eSStefano Zampini ierr = MatDenseGetArrayWrite(C,&cv);CHKERRQ(ierr); 22946718818eSStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("T","N",&m,&n,&k,&_DOne,av,&a->lda,bv,&b->lda,&_DZero,cv,&c->lda)); 22956718818eSStefano Zampini ierr = MatDenseRestoreArrayRead(A,&av);CHKERRQ(ierr); 22966718818eSStefano Zampini ierr = MatDenseRestoreArrayRead(B,&bv);CHKERRQ(ierr); 22976718818eSStefano Zampini ierr = MatDenseRestoreArrayWrite(C,&cv);CHKERRQ(ierr); 2298ca15aa20SStefano Zampini ierr = PetscLogFlops(1.0*m*n*k + 1.0*m*n*(k-1));CHKERRQ(ierr); 2299a9fe9ddaSSatish Balay PetscFunctionReturn(0); 2300a9fe9ddaSSatish Balay } 2301985db425SBarry Smith 23024222ddf1SHong Zhang /* ----------------------------------------------- */ 23034222ddf1SHong Zhang static PetscErrorCode MatProductSetFromOptions_SeqDense_AB(Mat C) 23044222ddf1SHong Zhang { 23054222ddf1SHong Zhang PetscFunctionBegin; 23064222ddf1SHong Zhang C->ops->matmultsymbolic = MatMatMultSymbolic_SeqDense_SeqDense; 23074222ddf1SHong Zhang C->ops->productsymbolic = MatProductSymbolic_AB; 23084222ddf1SHong Zhang PetscFunctionReturn(0); 23094222ddf1SHong Zhang } 23104222ddf1SHong Zhang 23114222ddf1SHong Zhang static PetscErrorCode MatProductSetFromOptions_SeqDense_AtB(Mat C) 23124222ddf1SHong Zhang { 23134222ddf1SHong Zhang PetscFunctionBegin; 23144222ddf1SHong Zhang C->ops->transposematmultsymbolic = MatTransposeMatMultSymbolic_SeqDense_SeqDense; 23154222ddf1SHong Zhang C->ops->productsymbolic = MatProductSymbolic_AtB; 23164222ddf1SHong Zhang PetscFunctionReturn(0); 23174222ddf1SHong Zhang } 23184222ddf1SHong Zhang 23194222ddf1SHong Zhang static PetscErrorCode MatProductSetFromOptions_SeqDense_ABt(Mat C) 23204222ddf1SHong Zhang { 23214222ddf1SHong Zhang PetscFunctionBegin; 23224222ddf1SHong Zhang C->ops->mattransposemultsymbolic = MatMatTransposeMultSymbolic_SeqDense_SeqDense; 23234222ddf1SHong Zhang C->ops->productsymbolic = MatProductSymbolic_ABt; 23244222ddf1SHong Zhang PetscFunctionReturn(0); 23254222ddf1SHong Zhang } 23264222ddf1SHong Zhang 23274222ddf1SHong Zhang PETSC_INTERN PetscErrorCode MatProductSetFromOptions_SeqDense(Mat C) 23284222ddf1SHong Zhang { 23294222ddf1SHong Zhang PetscErrorCode ierr; 23304222ddf1SHong Zhang Mat_Product *product = C->product; 23314222ddf1SHong Zhang 23324222ddf1SHong Zhang PetscFunctionBegin; 23334222ddf1SHong Zhang switch (product->type) { 23344222ddf1SHong Zhang case MATPRODUCT_AB: 23354222ddf1SHong Zhang ierr = MatProductSetFromOptions_SeqDense_AB(C);CHKERRQ(ierr); 23364222ddf1SHong Zhang break; 23374222ddf1SHong Zhang case MATPRODUCT_AtB: 23384222ddf1SHong Zhang ierr = MatProductSetFromOptions_SeqDense_AtB(C);CHKERRQ(ierr); 23394222ddf1SHong Zhang break; 23404222ddf1SHong Zhang case MATPRODUCT_ABt: 23414222ddf1SHong Zhang ierr = MatProductSetFromOptions_SeqDense_ABt(C);CHKERRQ(ierr); 23424222ddf1SHong Zhang break; 23436718818eSStefano Zampini default: 23444222ddf1SHong Zhang break; 23454222ddf1SHong Zhang } 23464222ddf1SHong Zhang PetscFunctionReturn(0); 23474222ddf1SHong Zhang } 23484222ddf1SHong Zhang /* ----------------------------------------------- */ 23494222ddf1SHong Zhang 2350e0877f53SBarry Smith static PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[]) 2351985db425SBarry Smith { 2352985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2353985db425SBarry Smith PetscErrorCode ierr; 2354d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 2355985db425SBarry Smith PetscScalar *x; 2356ca15aa20SStefano Zampini const PetscScalar *aa; 2357985db425SBarry Smith 2358985db425SBarry Smith PetscFunctionBegin; 2359e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2360985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2361985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 2362ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&aa);CHKERRQ(ierr); 2363e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2364985db425SBarry Smith for (i=0; i<m; i++) { 2365985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 2366985db425SBarry Smith for (j=1; j<n; j++) { 2367ca15aa20SStefano Zampini if (PetscRealPart(x[i]) < PetscRealPart(aa[i+a->lda*j])) {x[i] = aa[i + a->lda*j]; if (idx) idx[i] = j;} 2368985db425SBarry Smith } 2369985db425SBarry Smith } 2370ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&aa);CHKERRQ(ierr); 2371985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2372985db425SBarry Smith PetscFunctionReturn(0); 2373985db425SBarry Smith } 2374985db425SBarry Smith 2375e0877f53SBarry Smith static PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[]) 2376985db425SBarry Smith { 2377985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2378985db425SBarry Smith PetscErrorCode ierr; 2379d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 2380985db425SBarry Smith PetscScalar *x; 2381985db425SBarry Smith PetscReal atmp; 2382ca15aa20SStefano Zampini const PetscScalar *aa; 2383985db425SBarry Smith 2384985db425SBarry Smith PetscFunctionBegin; 2385e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2386985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2387985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 2388ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&aa);CHKERRQ(ierr); 2389e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2390985db425SBarry Smith for (i=0; i<m; i++) { 23919189402eSHong Zhang x[i] = PetscAbsScalar(aa[i]); 2392985db425SBarry Smith for (j=1; j<n; j++) { 2393ca15aa20SStefano Zampini atmp = PetscAbsScalar(aa[i+a->lda*j]); 2394985db425SBarry Smith if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;} 2395985db425SBarry Smith } 2396985db425SBarry Smith } 2397ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&aa);CHKERRQ(ierr); 2398985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2399985db425SBarry Smith PetscFunctionReturn(0); 2400985db425SBarry Smith } 2401985db425SBarry Smith 2402e0877f53SBarry Smith static PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[]) 2403985db425SBarry Smith { 2404985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2405985db425SBarry Smith PetscErrorCode ierr; 2406d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 2407985db425SBarry Smith PetscScalar *x; 2408ca15aa20SStefano Zampini const PetscScalar *aa; 2409985db425SBarry Smith 2410985db425SBarry Smith PetscFunctionBegin; 2411e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2412ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&aa);CHKERRQ(ierr); 2413985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2414985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 2415e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2416985db425SBarry Smith for (i=0; i<m; i++) { 2417985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 2418985db425SBarry Smith for (j=1; j<n; j++) { 2419ca15aa20SStefano Zampini if (PetscRealPart(x[i]) > PetscRealPart(aa[i+a->lda*j])) {x[i] = aa[i + a->lda*j]; if (idx) idx[i] = j;} 2420985db425SBarry Smith } 2421985db425SBarry Smith } 2422985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2423ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&aa);CHKERRQ(ierr); 2424985db425SBarry Smith PetscFunctionReturn(0); 2425985db425SBarry Smith } 2426985db425SBarry Smith 2427637a0070SStefano Zampini PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col) 24288d0534beSBarry Smith { 24298d0534beSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 24308d0534beSBarry Smith PetscErrorCode ierr; 24318d0534beSBarry Smith PetscScalar *x; 2432ca15aa20SStefano Zampini const PetscScalar *aa; 24338d0534beSBarry Smith 24348d0534beSBarry Smith PetscFunctionBegin; 2435e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2436ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&aa);CHKERRQ(ierr); 24378d0534beSBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2438ca15aa20SStefano Zampini ierr = PetscArraycpy(x,aa+col*a->lda,A->rmap->n);CHKERRQ(ierr); 24398d0534beSBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2440ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&aa);CHKERRQ(ierr); 24418d0534beSBarry Smith PetscFunctionReturn(0); 24428d0534beSBarry Smith } 24438d0534beSBarry Smith 244452c5f739Sprj- PETSC_INTERN PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms) 24450716a85fSBarry Smith { 24460716a85fSBarry Smith PetscErrorCode ierr; 24470716a85fSBarry Smith PetscInt i,j,m,n; 24481683a169SBarry Smith const PetscScalar *a; 24490716a85fSBarry Smith 24500716a85fSBarry Smith PetscFunctionBegin; 24510716a85fSBarry Smith ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr); 2452580bdb30SBarry Smith ierr = PetscArrayzero(norms,n);CHKERRQ(ierr); 24531683a169SBarry Smith ierr = MatDenseGetArrayRead(A,&a);CHKERRQ(ierr); 24540716a85fSBarry Smith if (type == NORM_2) { 24550716a85fSBarry Smith for (i=0; i<n; i++) { 24560716a85fSBarry Smith for (j=0; j<m; j++) { 24570716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]*a[j]); 24580716a85fSBarry Smith } 24590716a85fSBarry Smith a += m; 24600716a85fSBarry Smith } 24610716a85fSBarry Smith } else if (type == NORM_1) { 24620716a85fSBarry Smith for (i=0; i<n; i++) { 24630716a85fSBarry Smith for (j=0; j<m; j++) { 24640716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]); 24650716a85fSBarry Smith } 24660716a85fSBarry Smith a += m; 24670716a85fSBarry Smith } 24680716a85fSBarry Smith } else if (type == NORM_INFINITY) { 24690716a85fSBarry Smith for (i=0; i<n; i++) { 24700716a85fSBarry Smith for (j=0; j<m; j++) { 24710716a85fSBarry Smith norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]); 24720716a85fSBarry Smith } 24730716a85fSBarry Smith a += m; 24740716a85fSBarry Smith } 2475ce94432eSBarry Smith } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType"); 24761683a169SBarry Smith ierr = MatDenseRestoreArrayRead(A,&a);CHKERRQ(ierr); 24770716a85fSBarry Smith if (type == NORM_2) { 24788f1a2a5eSBarry Smith for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]); 24790716a85fSBarry Smith } 24800716a85fSBarry Smith PetscFunctionReturn(0); 24810716a85fSBarry Smith } 24820716a85fSBarry Smith 248373a71a0fSBarry Smith static PetscErrorCode MatSetRandom_SeqDense(Mat x,PetscRandom rctx) 248473a71a0fSBarry Smith { 248573a71a0fSBarry Smith PetscErrorCode ierr; 248673a71a0fSBarry Smith PetscScalar *a; 2487637a0070SStefano Zampini PetscInt lda,m,n,i,j; 248873a71a0fSBarry Smith 248973a71a0fSBarry Smith PetscFunctionBegin; 249073a71a0fSBarry Smith ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr); 2491637a0070SStefano Zampini ierr = MatDenseGetLDA(x,&lda);CHKERRQ(ierr); 24928c778c55SBarry Smith ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr); 2493637a0070SStefano Zampini for (j=0; j<n; j++) { 2494637a0070SStefano Zampini for (i=0; i<m; i++) { 2495637a0070SStefano Zampini ierr = PetscRandomGetValue(rctx,a+j*lda+i);CHKERRQ(ierr); 2496637a0070SStefano Zampini } 249773a71a0fSBarry Smith } 24988c778c55SBarry Smith ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr); 249973a71a0fSBarry Smith PetscFunctionReturn(0); 250073a71a0fSBarry Smith } 250173a71a0fSBarry Smith 25023b49f96aSBarry Smith static PetscErrorCode MatMissingDiagonal_SeqDense(Mat A,PetscBool *missing,PetscInt *d) 25033b49f96aSBarry Smith { 25043b49f96aSBarry Smith PetscFunctionBegin; 25053b49f96aSBarry Smith *missing = PETSC_FALSE; 25063b49f96aSBarry Smith PetscFunctionReturn(0); 25073b49f96aSBarry Smith } 250873a71a0fSBarry Smith 2509ca15aa20SStefano Zampini /* vals is not const */ 2510af53bab2SHong Zhang static PetscErrorCode MatDenseGetColumn_SeqDense(Mat A,PetscInt col,PetscScalar **vals) 251186aefd0dSHong Zhang { 2512ca15aa20SStefano Zampini PetscErrorCode ierr; 251386aefd0dSHong Zhang Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2514ca15aa20SStefano Zampini PetscScalar *v; 251586aefd0dSHong Zhang 251686aefd0dSHong Zhang PetscFunctionBegin; 251786aefd0dSHong Zhang if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2518ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr); 2519ca15aa20SStefano Zampini *vals = v+col*a->lda; 2520ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr); 252186aefd0dSHong Zhang PetscFunctionReturn(0); 252286aefd0dSHong Zhang } 252386aefd0dSHong Zhang 2524af53bab2SHong Zhang static PetscErrorCode MatDenseRestoreColumn_SeqDense(Mat A,PetscScalar **vals) 252586aefd0dSHong Zhang { 252686aefd0dSHong Zhang PetscFunctionBegin; 252786aefd0dSHong Zhang *vals = 0; /* user cannot accidently use the array later */ 252886aefd0dSHong Zhang PetscFunctionReturn(0); 252986aefd0dSHong Zhang } 2530abc3b08eSStefano Zampini 2531289bc588SBarry Smith /* -------------------------------------------------------------------*/ 2532a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense, 2533905e6a2fSBarry Smith MatGetRow_SeqDense, 2534905e6a2fSBarry Smith MatRestoreRow_SeqDense, 2535905e6a2fSBarry Smith MatMult_SeqDense, 253697304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense, 25377c922b88SBarry Smith MatMultTranspose_SeqDense, 25387c922b88SBarry Smith MatMultTransposeAdd_SeqDense, 2539db4efbfdSBarry Smith 0, 2540db4efbfdSBarry Smith 0, 2541db4efbfdSBarry Smith 0, 2542db4efbfdSBarry Smith /* 10*/ 0, 2543905e6a2fSBarry Smith MatLUFactor_SeqDense, 2544905e6a2fSBarry Smith MatCholeskyFactor_SeqDense, 254541f059aeSBarry Smith MatSOR_SeqDense, 2546ec8511deSBarry Smith MatTranspose_SeqDense, 254797304618SKris Buschelman /* 15*/ MatGetInfo_SeqDense, 2548905e6a2fSBarry Smith MatEqual_SeqDense, 2549905e6a2fSBarry Smith MatGetDiagonal_SeqDense, 2550905e6a2fSBarry Smith MatDiagonalScale_SeqDense, 2551905e6a2fSBarry Smith MatNorm_SeqDense, 2552c0aa2d19SHong Zhang /* 20*/ MatAssemblyBegin_SeqDense, 2553c0aa2d19SHong Zhang MatAssemblyEnd_SeqDense, 2554905e6a2fSBarry Smith MatSetOption_SeqDense, 2555905e6a2fSBarry Smith MatZeroEntries_SeqDense, 2556d519adbfSMatthew Knepley /* 24*/ MatZeroRows_SeqDense, 2557db4efbfdSBarry Smith 0, 2558db4efbfdSBarry Smith 0, 2559db4efbfdSBarry Smith 0, 2560db4efbfdSBarry Smith 0, 25614994cf47SJed Brown /* 29*/ MatSetUp_SeqDense, 2562273d9f13SBarry Smith 0, 2563905e6a2fSBarry Smith 0, 256473a71a0fSBarry Smith 0, 256573a71a0fSBarry Smith 0, 2566d519adbfSMatthew Knepley /* 34*/ MatDuplicate_SeqDense, 2567a5ae1ecdSBarry Smith 0, 2568a5ae1ecdSBarry Smith 0, 2569a5ae1ecdSBarry Smith 0, 2570a5ae1ecdSBarry Smith 0, 2571d519adbfSMatthew Knepley /* 39*/ MatAXPY_SeqDense, 25727dae84e0SHong Zhang MatCreateSubMatrices_SeqDense, 2573a5ae1ecdSBarry Smith 0, 25744b0e389bSBarry Smith MatGetValues_SeqDense, 2575a5ae1ecdSBarry Smith MatCopy_SeqDense, 2576d519adbfSMatthew Knepley /* 44*/ MatGetRowMax_SeqDense, 2577a5ae1ecdSBarry Smith MatScale_SeqDense, 25787d68702bSBarry Smith MatShift_Basic, 2579a5ae1ecdSBarry Smith 0, 25803f49a652SStefano Zampini MatZeroRowsColumns_SeqDense, 258173a71a0fSBarry Smith /* 49*/ MatSetRandom_SeqDense, 2582a5ae1ecdSBarry Smith 0, 2583a5ae1ecdSBarry Smith 0, 2584a5ae1ecdSBarry Smith 0, 2585a5ae1ecdSBarry Smith 0, 2586d519adbfSMatthew Knepley /* 54*/ 0, 2587a5ae1ecdSBarry Smith 0, 2588a5ae1ecdSBarry Smith 0, 2589a5ae1ecdSBarry Smith 0, 2590a5ae1ecdSBarry Smith 0, 2591d519adbfSMatthew Knepley /* 59*/ 0, 2592e03a110bSBarry Smith MatDestroy_SeqDense, 2593e03a110bSBarry Smith MatView_SeqDense, 2594357abbc8SBarry Smith 0, 259597304618SKris Buschelman 0, 2596d519adbfSMatthew Knepley /* 64*/ 0, 259797304618SKris Buschelman 0, 259897304618SKris Buschelman 0, 259997304618SKris Buschelman 0, 260097304618SKris Buschelman 0, 2601d519adbfSMatthew Knepley /* 69*/ MatGetRowMaxAbs_SeqDense, 260297304618SKris Buschelman 0, 260397304618SKris Buschelman 0, 260497304618SKris Buschelman 0, 260597304618SKris Buschelman 0, 2606d519adbfSMatthew Knepley /* 74*/ 0, 260797304618SKris Buschelman 0, 260897304618SKris Buschelman 0, 260997304618SKris Buschelman 0, 261097304618SKris Buschelman 0, 2611d519adbfSMatthew Knepley /* 79*/ 0, 261297304618SKris Buschelman 0, 261397304618SKris Buschelman 0, 261497304618SKris Buschelman 0, 26155bba2384SShri Abhyankar /* 83*/ MatLoad_SeqDense, 2616637a0070SStefano Zampini MatIsSymmetric_SeqDense, 26171cbb95d3SBarry Smith MatIsHermitian_SeqDense, 2618865e5f61SKris Buschelman 0, 2619865e5f61SKris Buschelman 0, 2620865e5f61SKris Buschelman 0, 26214222ddf1SHong Zhang /* 89*/ 0, 26224222ddf1SHong Zhang 0, 2623a9fe9ddaSSatish Balay MatMatMultNumeric_SeqDense_SeqDense, 26244222ddf1SHong Zhang 0, 26254222ddf1SHong Zhang 0, 26264222ddf1SHong Zhang /* 94*/ 0, 26274222ddf1SHong Zhang 0, 26284222ddf1SHong Zhang 0, 262969f65d41SStefano Zampini MatMatTransposeMultNumeric_SeqDense_SeqDense, 2630284134d9SBarry Smith 0, 26314222ddf1SHong Zhang /* 99*/ MatProductSetFromOptions_SeqDense, 2632284134d9SBarry Smith 0, 2633284134d9SBarry Smith 0, 2634ba337c44SJed Brown MatConjugate_SeqDense, 2635f73d5cc4SBarry Smith 0, 2636ba337c44SJed Brown /*104*/ 0, 2637ba337c44SJed Brown MatRealPart_SeqDense, 2638ba337c44SJed Brown MatImaginaryPart_SeqDense, 2639985db425SBarry Smith 0, 2640985db425SBarry Smith 0, 26418208b9aeSStefano Zampini /*109*/ 0, 2642985db425SBarry Smith 0, 26438d0534beSBarry Smith MatGetRowMin_SeqDense, 2644aabbc4fbSShri Abhyankar MatGetColumnVector_SeqDense, 26453b49f96aSBarry Smith MatMissingDiagonal_SeqDense, 2646aabbc4fbSShri Abhyankar /*114*/ 0, 2647aabbc4fbSShri Abhyankar 0, 2648aabbc4fbSShri Abhyankar 0, 2649aabbc4fbSShri Abhyankar 0, 2650aabbc4fbSShri Abhyankar 0, 2651aabbc4fbSShri Abhyankar /*119*/ 0, 2652aabbc4fbSShri Abhyankar 0, 2653aabbc4fbSShri Abhyankar 0, 26540716a85fSBarry Smith 0, 26550716a85fSBarry Smith 0, 26560716a85fSBarry Smith /*124*/ 0, 26575df89d91SHong Zhang MatGetColumnNorms_SeqDense, 26585df89d91SHong Zhang 0, 26595df89d91SHong Zhang 0, 26605df89d91SHong Zhang 0, 26615df89d91SHong Zhang /*129*/ 0, 26624222ddf1SHong Zhang 0, 26634222ddf1SHong Zhang 0, 266475648e8dSHong Zhang MatTransposeMatMultNumeric_SeqDense_SeqDense, 26653964eb88SJed Brown 0, 26663964eb88SJed Brown /*134*/ 0, 26673964eb88SJed Brown 0, 26683964eb88SJed Brown 0, 26693964eb88SJed Brown 0, 26703964eb88SJed Brown 0, 26713964eb88SJed Brown /*139*/ 0, 2672f9426fe0SMark Adams 0, 2673d528f656SJakub Kruzik 0, 2674d528f656SJakub Kruzik 0, 2675d528f656SJakub Kruzik 0, 26764222ddf1SHong Zhang MatCreateMPIMatConcatenateSeqMat_SeqDense, 26774222ddf1SHong Zhang /*145*/ 0, 26784222ddf1SHong Zhang 0, 26794222ddf1SHong Zhang 0 2680985db425SBarry Smith }; 268190ace30eSBarry Smith 26824b828684SBarry Smith /*@C 2683fafbff53SBarry Smith MatCreateSeqDense - Creates a sequential dense matrix that 2684d65003e9SLois Curfman McInnes is stored in column major order (the usual Fortran 77 manner). Many 2685d65003e9SLois Curfman McInnes of the matrix operations use the BLAS and LAPACK routines. 2686289bc588SBarry Smith 2687d083f849SBarry Smith Collective 2688db81eaa0SLois Curfman McInnes 268920563c6bSBarry Smith Input Parameters: 2690db81eaa0SLois Curfman McInnes + comm - MPI communicator, set to PETSC_COMM_SELF 26910c775827SLois Curfman McInnes . m - number of rows 269218f449edSLois Curfman McInnes . n - number of columns 26930298fd71SBarry Smith - data - optional location of matrix data in column major order. Set data=NULL for PETSc 2694dfc5480cSLois Curfman McInnes to control all matrix memory allocation. 269520563c6bSBarry Smith 269620563c6bSBarry Smith Output Parameter: 269744cd7ae7SLois Curfman McInnes . A - the matrix 269820563c6bSBarry Smith 2699b259b22eSLois Curfman McInnes Notes: 270018f449edSLois Curfman McInnes The data input variable is intended primarily for Fortran programmers 270118f449edSLois Curfman McInnes who wish to allocate their own matrix memory space. Most users should 27020298fd71SBarry Smith set data=NULL. 270318f449edSLois Curfman McInnes 2704027ccd11SLois Curfman McInnes Level: intermediate 2705027ccd11SLois Curfman McInnes 270669b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues() 270720563c6bSBarry Smith @*/ 27087087cfbeSBarry Smith PetscErrorCode MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A) 2709289bc588SBarry Smith { 2710dfbe8321SBarry Smith PetscErrorCode ierr; 27113b2fbd54SBarry Smith 27123a40ed3dSBarry Smith PetscFunctionBegin; 2713f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 2714f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr); 2715273d9f13SBarry Smith ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr); 2716273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr); 2717273d9f13SBarry Smith PetscFunctionReturn(0); 2718273d9f13SBarry Smith } 2719273d9f13SBarry Smith 2720273d9f13SBarry Smith /*@C 2721273d9f13SBarry Smith MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements 2722273d9f13SBarry Smith 2723d083f849SBarry Smith Collective 2724273d9f13SBarry Smith 2725273d9f13SBarry Smith Input Parameters: 27261c4f3114SJed Brown + B - the matrix 27270298fd71SBarry Smith - data - the array (or NULL) 2728273d9f13SBarry Smith 2729273d9f13SBarry Smith Notes: 2730273d9f13SBarry Smith The data input variable is intended primarily for Fortran programmers 2731273d9f13SBarry Smith who wish to allocate their own matrix memory space. Most users should 2732284134d9SBarry Smith need not call this routine. 2733273d9f13SBarry Smith 2734273d9f13SBarry Smith Level: intermediate 2735273d9f13SBarry Smith 2736ad16ce7aSStefano Zampini .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatDenseSetLDA() 2737867c911aSBarry Smith 2738273d9f13SBarry Smith @*/ 27397087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation(Mat B,PetscScalar data[]) 2740273d9f13SBarry Smith { 27414ac538c5SBarry Smith PetscErrorCode ierr; 2742a23d5eceSKris Buschelman 2743a23d5eceSKris Buschelman PetscFunctionBegin; 2744d5ea218eSStefano Zampini PetscValidHeaderSpecific(B,MAT_CLASSID,1); 27454ac538c5SBarry Smith ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr); 2746a23d5eceSKris Buschelman PetscFunctionReturn(0); 2747a23d5eceSKris Buschelman } 2748a23d5eceSKris Buschelman 27497087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data) 2750a23d5eceSKris Buschelman { 2751ad16ce7aSStefano Zampini Mat_SeqDense *b = (Mat_SeqDense*)B->data; 2752dfbe8321SBarry Smith PetscErrorCode ierr; 2753273d9f13SBarry Smith 2754273d9f13SBarry Smith PetscFunctionBegin; 2755616b8fbbSStefano Zampini if (b->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first"); 2756273d9f13SBarry Smith B->preallocated = PETSC_TRUE; 2757a868139aSShri Abhyankar 275834ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr); 275934ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr); 276034ef9618SShri Abhyankar 2761ad16ce7aSStefano Zampini if (b->lda <= 0) b->lda = B->rmap->n; 276286d161a7SShri Abhyankar 2763ad16ce7aSStefano Zampini ierr = PetscIntMultError(b->lda,B->cmap->n,NULL);CHKERRQ(ierr); 27649e8f95c4SLisandro Dalcin if (!data) { /* petsc-allocated storage */ 27659e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2766ad16ce7aSStefano Zampini ierr = PetscCalloc1((size_t)b->lda*B->cmap->n,&b->v);CHKERRQ(ierr); 2767ad16ce7aSStefano Zampini ierr = PetscLogObjectMemory((PetscObject)B,b->lda*B->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 27682205254eSKarl Rupp 27699e8f95c4SLisandro Dalcin b->user_alloc = PETSC_FALSE; 2770273d9f13SBarry Smith } else { /* user-allocated storage */ 27719e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2772273d9f13SBarry Smith b->v = data; 2773273d9f13SBarry Smith b->user_alloc = PETSC_TRUE; 2774273d9f13SBarry Smith } 27750450473dSBarry Smith B->assembled = PETSC_TRUE; 2776273d9f13SBarry Smith PetscFunctionReturn(0); 2777273d9f13SBarry Smith } 2778273d9f13SBarry Smith 277965b80a83SHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 2780cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat) 27818baccfbdSHong Zhang { 2782d77f618aSHong Zhang Mat mat_elemental; 2783d77f618aSHong Zhang PetscErrorCode ierr; 27841683a169SBarry Smith const PetscScalar *array; 27851683a169SBarry Smith PetscScalar *v_colwise; 2786d77f618aSHong Zhang PetscInt M=A->rmap->N,N=A->cmap->N,i,j,k,*rows,*cols; 2787d77f618aSHong Zhang 27888baccfbdSHong Zhang PetscFunctionBegin; 2789d77f618aSHong Zhang ierr = PetscMalloc3(M*N,&v_colwise,M,&rows,N,&cols);CHKERRQ(ierr); 27901683a169SBarry Smith ierr = MatDenseGetArrayRead(A,&array);CHKERRQ(ierr); 2791d77f618aSHong Zhang /* convert column-wise array into row-wise v_colwise, see MatSetValues_Elemental() */ 2792d77f618aSHong Zhang k = 0; 2793d77f618aSHong Zhang for (j=0; j<N; j++) { 2794d77f618aSHong Zhang cols[j] = j; 2795d77f618aSHong Zhang for (i=0; i<M; i++) { 2796d77f618aSHong Zhang v_colwise[j*M+i] = array[k++]; 2797d77f618aSHong Zhang } 2798d77f618aSHong Zhang } 2799d77f618aSHong Zhang for (i=0; i<M; i++) { 2800d77f618aSHong Zhang rows[i] = i; 2801d77f618aSHong Zhang } 28021683a169SBarry Smith ierr = MatDenseRestoreArrayRead(A,&array);CHKERRQ(ierr); 2803d77f618aSHong Zhang 2804d77f618aSHong Zhang ierr = MatCreate(PetscObjectComm((PetscObject)A), &mat_elemental);CHKERRQ(ierr); 2805d77f618aSHong Zhang ierr = MatSetSizes(mat_elemental,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr); 2806d77f618aSHong Zhang ierr = MatSetType(mat_elemental,MATELEMENTAL);CHKERRQ(ierr); 2807d77f618aSHong Zhang ierr = MatSetUp(mat_elemental);CHKERRQ(ierr); 2808d77f618aSHong Zhang 2809d77f618aSHong Zhang /* PETSc-Elemental interaface uses axpy for setting off-processor entries, only ADD_VALUES is allowed */ 2810d77f618aSHong Zhang ierr = MatSetValues(mat_elemental,M,rows,N,cols,v_colwise,ADD_VALUES);CHKERRQ(ierr); 2811d77f618aSHong Zhang ierr = MatAssemblyBegin(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2812d77f618aSHong Zhang ierr = MatAssemblyEnd(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2813d77f618aSHong Zhang ierr = PetscFree3(v_colwise,rows,cols);CHKERRQ(ierr); 2814d77f618aSHong Zhang 2815511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 281628be2f97SBarry Smith ierr = MatHeaderReplace(A,&mat_elemental);CHKERRQ(ierr); 2817d77f618aSHong Zhang } else { 2818d77f618aSHong Zhang *newmat = mat_elemental; 2819d77f618aSHong Zhang } 28208baccfbdSHong Zhang PetscFunctionReturn(0); 28218baccfbdSHong Zhang } 282265b80a83SHong Zhang #endif 28238baccfbdSHong Zhang 282417359960SJose E. Roman PetscErrorCode MatDenseSetLDA_SeqDense(Mat B,PetscInt lda) 28251b807ce4Svictorle { 28261b807ce4Svictorle Mat_SeqDense *b = (Mat_SeqDense*)B->data; 2827*7422da62SJose E. Roman PetscBool data; 282821a2c019SBarry Smith 28291b807ce4Svictorle PetscFunctionBegin; 2830*7422da62SJose E. Roman data = (PetscBool)((B->rmap->n > 0 && B->cmap->n > 0) ? (b->v ? PETSC_TRUE : PETSC_FALSE) : PETSC_FALSE); 2831*7422da62SJose E. Roman if (!b->user_alloc && data && b->lda!=lda) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"LDA cannot be changed after allocation of internal storage"); 2832e32f2f54SBarry Smith if (lda < B->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"LDA %D must be at least matrix dimension %D",lda,B->rmap->n); 28331b807ce4Svictorle b->lda = lda; 28341b807ce4Svictorle PetscFunctionReturn(0); 28351b807ce4Svictorle } 28361b807ce4Svictorle 2837d528f656SJakub Kruzik PetscErrorCode MatCreateMPIMatConcatenateSeqMat_SeqDense(MPI_Comm comm,Mat inmat,PetscInt n,MatReuse scall,Mat *outmat) 2838d528f656SJakub Kruzik { 2839d528f656SJakub Kruzik PetscErrorCode ierr; 2840d528f656SJakub Kruzik PetscMPIInt size; 2841d528f656SJakub Kruzik 2842d528f656SJakub Kruzik PetscFunctionBegin; 2843d528f656SJakub Kruzik ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 2844d528f656SJakub Kruzik if (size == 1) { 2845d528f656SJakub Kruzik if (scall == MAT_INITIAL_MATRIX) { 2846d528f656SJakub Kruzik ierr = MatDuplicate(inmat,MAT_COPY_VALUES,outmat);CHKERRQ(ierr); 2847d528f656SJakub Kruzik } else { 2848d528f656SJakub Kruzik ierr = MatCopy(inmat,*outmat,SAME_NONZERO_PATTERN);CHKERRQ(ierr); 2849d528f656SJakub Kruzik } 2850d528f656SJakub Kruzik } else { 2851d528f656SJakub Kruzik ierr = MatCreateMPIMatConcatenateSeqMat_MPIDense(comm,inmat,n,scall,outmat);CHKERRQ(ierr); 2852d528f656SJakub Kruzik } 2853d528f656SJakub Kruzik PetscFunctionReturn(0); 2854d528f656SJakub Kruzik } 2855d528f656SJakub Kruzik 28566947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVec_SeqDense(Mat A,PetscInt col,Vec *v) 28576947451fSStefano Zampini { 28586947451fSStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 28596947451fSStefano Zampini PetscErrorCode ierr; 28606947451fSStefano Zampini 28616947451fSStefano Zampini PetscFunctionBegin; 28625ea7661aSPierre Jolivet if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first"); 28635ea7661aSPierre Jolivet if (a->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first"); 28646947451fSStefano Zampini if (!a->cvec) { 28656947451fSStefano Zampini ierr = VecCreateSeqWithArray(PetscObjectComm((PetscObject)A),A->rmap->bs,A->rmap->n,NULL,&a->cvec);CHKERRQ(ierr); 2866616b8fbbSStefano Zampini ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)a->cvec);CHKERRQ(ierr); 28676947451fSStefano Zampini } 28686947451fSStefano Zampini a->vecinuse = col + 1; 28696947451fSStefano Zampini ierr = MatDenseGetArray(A,(PetscScalar**)&a->ptrinuse);CHKERRQ(ierr); 28706947451fSStefano Zampini ierr = VecPlaceArray(a->cvec,a->ptrinuse + (size_t)col * (size_t)a->lda);CHKERRQ(ierr); 28716947451fSStefano Zampini *v = a->cvec; 28726947451fSStefano Zampini PetscFunctionReturn(0); 28736947451fSStefano Zampini } 28746947451fSStefano Zampini 28756947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVec_SeqDense(Mat A,PetscInt col,Vec *v) 28766947451fSStefano Zampini { 28776947451fSStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 28786947451fSStefano Zampini PetscErrorCode ierr; 28796947451fSStefano Zampini 28806947451fSStefano Zampini PetscFunctionBegin; 28815ea7661aSPierre Jolivet if (!a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseGetColumnVec() first"); 28826947451fSStefano Zampini if (!a->cvec) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing internal column vector"); 28836947451fSStefano Zampini a->vecinuse = 0; 28846947451fSStefano Zampini ierr = MatDenseRestoreArray(A,(PetscScalar**)&a->ptrinuse);CHKERRQ(ierr); 28856947451fSStefano Zampini ierr = VecResetArray(a->cvec);CHKERRQ(ierr); 28866947451fSStefano Zampini *v = NULL; 28876947451fSStefano Zampini PetscFunctionReturn(0); 28886947451fSStefano Zampini } 28896947451fSStefano Zampini 28906947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVecRead_SeqDense(Mat A,PetscInt col,Vec *v) 28916947451fSStefano Zampini { 28926947451fSStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 28936947451fSStefano Zampini PetscErrorCode ierr; 28946947451fSStefano Zampini 28956947451fSStefano Zampini PetscFunctionBegin; 28965ea7661aSPierre Jolivet if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first"); 28975ea7661aSPierre Jolivet if (a->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first"); 28986947451fSStefano Zampini if (!a->cvec) { 28996947451fSStefano Zampini ierr = VecCreateSeqWithArray(PetscObjectComm((PetscObject)A),A->rmap->bs,A->rmap->n,NULL,&a->cvec);CHKERRQ(ierr); 2900616b8fbbSStefano Zampini ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)a->cvec);CHKERRQ(ierr); 29016947451fSStefano Zampini } 29026947451fSStefano Zampini a->vecinuse = col + 1; 29036947451fSStefano Zampini ierr = MatDenseGetArrayRead(A,&a->ptrinuse);CHKERRQ(ierr); 29046947451fSStefano Zampini ierr = VecPlaceArray(a->cvec,a->ptrinuse + (size_t)col * (size_t)a->lda);CHKERRQ(ierr); 29056947451fSStefano Zampini ierr = VecLockReadPush(a->cvec);CHKERRQ(ierr); 29066947451fSStefano Zampini *v = a->cvec; 29076947451fSStefano Zampini PetscFunctionReturn(0); 29086947451fSStefano Zampini } 29096947451fSStefano Zampini 29106947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVecRead_SeqDense(Mat A,PetscInt col,Vec *v) 29116947451fSStefano Zampini { 29126947451fSStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 29136947451fSStefano Zampini PetscErrorCode ierr; 29146947451fSStefano Zampini 29156947451fSStefano Zampini PetscFunctionBegin; 29165ea7661aSPierre Jolivet if (!a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseGetColumnVec() first"); 29176947451fSStefano Zampini if (!a->cvec) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing internal column vector"); 29186947451fSStefano Zampini a->vecinuse = 0; 29196947451fSStefano Zampini ierr = MatDenseRestoreArrayRead(A,&a->ptrinuse);CHKERRQ(ierr); 29206947451fSStefano Zampini ierr = VecLockReadPop(a->cvec);CHKERRQ(ierr); 29216947451fSStefano Zampini ierr = VecResetArray(a->cvec);CHKERRQ(ierr); 29226947451fSStefano Zampini *v = NULL; 29236947451fSStefano Zampini PetscFunctionReturn(0); 29246947451fSStefano Zampini } 29256947451fSStefano Zampini 29266947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVecWrite_SeqDense(Mat A,PetscInt col,Vec *v) 29276947451fSStefano Zampini { 29286947451fSStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 29296947451fSStefano Zampini PetscErrorCode ierr; 29306947451fSStefano Zampini 29316947451fSStefano Zampini PetscFunctionBegin; 29325ea7661aSPierre Jolivet if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first"); 29335ea7661aSPierre Jolivet if (a->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first"); 29346947451fSStefano Zampini if (!a->cvec) { 29356947451fSStefano Zampini ierr = VecCreateSeqWithArray(PetscObjectComm((PetscObject)A),A->rmap->bs,A->rmap->n,NULL,&a->cvec);CHKERRQ(ierr); 2936616b8fbbSStefano Zampini ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)a->cvec);CHKERRQ(ierr); 29376947451fSStefano Zampini } 29386947451fSStefano Zampini a->vecinuse = col + 1; 29396947451fSStefano Zampini ierr = MatDenseGetArrayWrite(A,(PetscScalar**)&a->ptrinuse);CHKERRQ(ierr); 29406947451fSStefano Zampini ierr = VecPlaceArray(a->cvec,a->ptrinuse + (size_t)col * (size_t)a->lda);CHKERRQ(ierr); 29416947451fSStefano Zampini *v = a->cvec; 29426947451fSStefano Zampini PetscFunctionReturn(0); 29436947451fSStefano Zampini } 29446947451fSStefano Zampini 29456947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVecWrite_SeqDense(Mat A,PetscInt col,Vec *v) 29466947451fSStefano Zampini { 29476947451fSStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 29486947451fSStefano Zampini PetscErrorCode ierr; 29496947451fSStefano Zampini 29506947451fSStefano Zampini PetscFunctionBegin; 29515ea7661aSPierre Jolivet if (!a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseGetColumnVec() first"); 29526947451fSStefano Zampini if (!a->cvec) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing internal column vector"); 29536947451fSStefano Zampini a->vecinuse = 0; 29546947451fSStefano Zampini ierr = MatDenseRestoreArrayWrite(A,(PetscScalar**)&a->ptrinuse);CHKERRQ(ierr); 29556947451fSStefano Zampini ierr = VecResetArray(a->cvec);CHKERRQ(ierr); 29566947451fSStefano Zampini *v = NULL; 29576947451fSStefano Zampini PetscFunctionReturn(0); 29586947451fSStefano Zampini } 29596947451fSStefano Zampini 29605ea7661aSPierre Jolivet PetscErrorCode MatDenseGetSubMatrix_SeqDense(Mat A,PetscInt cbegin,PetscInt cend,Mat *v) 29615ea7661aSPierre Jolivet { 29625ea7661aSPierre Jolivet Mat_SeqDense *a = (Mat_SeqDense*)A->data; 29635ea7661aSPierre Jolivet PetscErrorCode ierr; 29645ea7661aSPierre Jolivet 29655ea7661aSPierre Jolivet PetscFunctionBegin; 29665ea7661aSPierre Jolivet if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec() first"); 29675ea7661aSPierre Jolivet if (a->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreSubMatrix() first"); 29685ea7661aSPierre Jolivet if (a->cmat && cend-cbegin != a->cmat->cmap->N) { 29695ea7661aSPierre Jolivet ierr = MatDestroy(&a->cmat);CHKERRQ(ierr); 29705ea7661aSPierre Jolivet } 29715ea7661aSPierre Jolivet if (!a->cmat) { 2972616b8fbbSStefano Zampini ierr = MatCreateDense(PetscObjectComm((PetscObject)A),A->rmap->n,PETSC_DECIDE,A->rmap->N,cend-cbegin,(PetscScalar*)a->v + (size_t)cbegin * (size_t)a->lda,&a->cmat);CHKERRQ(ierr); 2973616b8fbbSStefano Zampini ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)a->cmat);CHKERRQ(ierr); 29745ea7661aSPierre Jolivet } else { 2975616b8fbbSStefano Zampini ierr = MatDensePlaceArray(a->cmat,a->v + (size_t)cbegin * (size_t)a->lda);CHKERRQ(ierr); 29765ea7661aSPierre Jolivet } 2977616b8fbbSStefano Zampini ierr = MatDenseSetLDA(a->cmat,a->lda);CHKERRQ(ierr); 29785ea7661aSPierre Jolivet a->matinuse = cbegin + 1; 29795ea7661aSPierre Jolivet *v = a->cmat; 29805ea7661aSPierre Jolivet PetscFunctionReturn(0); 29815ea7661aSPierre Jolivet } 29825ea7661aSPierre Jolivet 29835ea7661aSPierre Jolivet PetscErrorCode MatDenseRestoreSubMatrix_SeqDense(Mat A,Mat *v) 29845ea7661aSPierre Jolivet { 29855ea7661aSPierre Jolivet Mat_SeqDense *a = (Mat_SeqDense*)A->data; 29865ea7661aSPierre Jolivet PetscErrorCode ierr; 29875ea7661aSPierre Jolivet 29885ea7661aSPierre Jolivet PetscFunctionBegin; 29895ea7661aSPierre Jolivet if (!a->matinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseGetSubMatrix() first"); 29905ea7661aSPierre Jolivet if (!a->cmat) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing internal column matrix"); 2991616b8fbbSStefano Zampini if (*v != a->cmat) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not the matrix obtained from MatDenseGetSubMatrix()"); 29925ea7661aSPierre Jolivet a->matinuse = 0; 29935ea7661aSPierre Jolivet ierr = MatDenseResetArray(a->cmat);CHKERRQ(ierr); 29945ea7661aSPierre Jolivet *v = NULL; 29955ea7661aSPierre Jolivet PetscFunctionReturn(0); 29965ea7661aSPierre Jolivet } 29975ea7661aSPierre Jolivet 29980bad9183SKris Buschelman /*MC 2999fafad747SKris Buschelman MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices. 30000bad9183SKris Buschelman 30010bad9183SKris Buschelman Options Database Keys: 30020bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions() 30030bad9183SKris Buschelman 30040bad9183SKris Buschelman Level: beginner 30050bad9183SKris Buschelman 300689665df3SBarry Smith .seealso: MatCreateSeqDense() 300789665df3SBarry Smith 30080bad9183SKris Buschelman M*/ 3009ca15aa20SStefano Zampini PetscErrorCode MatCreate_SeqDense(Mat B) 3010273d9f13SBarry Smith { 3011273d9f13SBarry Smith Mat_SeqDense *b; 3012dfbe8321SBarry Smith PetscErrorCode ierr; 30137c334f02SBarry Smith PetscMPIInt size; 3014273d9f13SBarry Smith 3015273d9f13SBarry Smith PetscFunctionBegin; 3016ce94432eSBarry Smith ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr); 3017e32f2f54SBarry Smith if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1"); 301855659b69SBarry Smith 3019b00a9115SJed Brown ierr = PetscNewLog(B,&b);CHKERRQ(ierr); 3020549d3d68SSatish Balay ierr = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr); 302144cd7ae7SLois Curfman McInnes B->data = (void*)b; 302218f449edSLois Curfman McInnes 3023273d9f13SBarry Smith b->roworiented = PETSC_TRUE; 30244e220ebcSLois Curfman McInnes 302549a6ff4bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetLDA_C",MatDenseGetLDA_SeqDense);CHKERRQ(ierr); 3026ad16ce7aSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseSetLDA_C",MatDenseSetLDA_SeqDense);CHKERRQ(ierr); 3027bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr); 30288572280aSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr); 3029d3042a70SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDensePlaceArray_C",MatDensePlaceArray_SeqDense);CHKERRQ(ierr); 3030d3042a70SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseResetArray_C",MatDenseResetArray_SeqDense);CHKERRQ(ierr); 3031d5ea218eSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseReplaceArray_C",MatDenseReplaceArray_SeqDense);CHKERRQ(ierr); 30328572280aSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArrayRead_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr); 3033715b7558SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArrayRead_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr); 30346947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArrayWrite_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr); 30356947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArrayWrite_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr); 3036bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr); 30378baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 30388baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr); 30398baccfbdSHong Zhang #endif 3040d24d4204SJose E. Roman #if defined(PETSC_HAVE_SCALAPACK) 3041d24d4204SJose E. Roman ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_scalapack_C",MatConvert_Dense_ScaLAPACK);CHKERRQ(ierr); 3042d24d4204SJose E. Roman #endif 30432bf066beSStefano Zampini #if defined(PETSC_HAVE_CUDA) 30442bf066beSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqdensecuda_C",MatConvert_SeqDense_SeqDenseCUDA);CHKERRQ(ierr); 30454222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqdensecuda_seqdensecuda_C",MatProductSetFromOptions_SeqDense);CHKERRQ(ierr); 30464222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqdensecuda_seqdense_C",MatProductSetFromOptions_SeqDense);CHKERRQ(ierr); 3047637a0070SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqdense_seqdensecuda_C",MatProductSetFromOptions_SeqDense);CHKERRQ(ierr); 30482bf066beSStefano Zampini #endif 3049bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr); 30504222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqaij_seqdense_C",MatProductSetFromOptions_SeqAIJ_SeqDense);CHKERRQ(ierr); 30514222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqdense_seqdense_C",MatProductSetFromOptions_SeqDense);CHKERRQ(ierr); 30524222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqbaij_seqdense_C",MatProductSetFromOptions_SeqXBAIJ_SeqDense);CHKERRQ(ierr); 30534222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqsbaij_seqdense_C",MatProductSetFromOptions_SeqXBAIJ_SeqDense);CHKERRQ(ierr); 305496e6d5c4SRichard Tran Mills 3055af53bab2SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumn_C",MatDenseGetColumn_SeqDense);CHKERRQ(ierr); 3056af53bab2SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumn_C",MatDenseRestoreColumn_SeqDense);CHKERRQ(ierr); 30576947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumnVec_C",MatDenseGetColumnVec_SeqDense);CHKERRQ(ierr); 30586947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumnVec_C",MatDenseRestoreColumnVec_SeqDense);CHKERRQ(ierr); 30596947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumnVecRead_C",MatDenseGetColumnVecRead_SeqDense);CHKERRQ(ierr); 30606947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumnVecRead_C",MatDenseRestoreColumnVecRead_SeqDense);CHKERRQ(ierr); 30616947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumnVecWrite_C",MatDenseGetColumnVecWrite_SeqDense);CHKERRQ(ierr); 30626947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumnVecWrite_C",MatDenseRestoreColumnVecWrite_SeqDense);CHKERRQ(ierr); 30635ea7661aSPierre Jolivet ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetSubMatrix_C",MatDenseGetSubMatrix_SeqDense);CHKERRQ(ierr); 30645ea7661aSPierre Jolivet ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreSubMatrix_C",MatDenseRestoreSubMatrix_SeqDense);CHKERRQ(ierr); 306517667f90SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr); 30663a40ed3dSBarry Smith PetscFunctionReturn(0); 3067289bc588SBarry Smith } 306886aefd0dSHong Zhang 306986aefd0dSHong Zhang /*@C 3070af53bab2SHong 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. 307186aefd0dSHong Zhang 307286aefd0dSHong Zhang Not Collective 307386aefd0dSHong Zhang 30745ea7661aSPierre Jolivet Input Parameters: 307586aefd0dSHong Zhang + mat - a MATSEQDENSE or MATMPIDENSE matrix 307686aefd0dSHong Zhang - col - column index 307786aefd0dSHong Zhang 307886aefd0dSHong Zhang Output Parameter: 307986aefd0dSHong Zhang . vals - pointer to the data 308086aefd0dSHong Zhang 308186aefd0dSHong Zhang Level: intermediate 308286aefd0dSHong Zhang 308386aefd0dSHong Zhang .seealso: MatDenseRestoreColumn() 308486aefd0dSHong Zhang @*/ 308586aefd0dSHong Zhang PetscErrorCode MatDenseGetColumn(Mat A,PetscInt col,PetscScalar **vals) 308686aefd0dSHong Zhang { 308786aefd0dSHong Zhang PetscErrorCode ierr; 308886aefd0dSHong Zhang 308986aefd0dSHong Zhang PetscFunctionBegin; 3090d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 3091d5ea218eSStefano Zampini PetscValidLogicalCollectiveInt(A,col,2); 3092d5ea218eSStefano Zampini PetscValidPointer(vals,3); 309386aefd0dSHong Zhang ierr = PetscUseMethod(A,"MatDenseGetColumn_C",(Mat,PetscInt,PetscScalar**),(A,col,vals));CHKERRQ(ierr); 309486aefd0dSHong Zhang PetscFunctionReturn(0); 309586aefd0dSHong Zhang } 309686aefd0dSHong Zhang 309786aefd0dSHong Zhang /*@C 309886aefd0dSHong Zhang MatDenseRestoreColumn - returns access to a column of a dense matrix which is returned by MatDenseGetColumn(). 309986aefd0dSHong Zhang 310086aefd0dSHong Zhang Not Collective 310186aefd0dSHong Zhang 310286aefd0dSHong Zhang Input Parameter: 310386aefd0dSHong Zhang . mat - a MATSEQDENSE or MATMPIDENSE matrix 310486aefd0dSHong Zhang 310586aefd0dSHong Zhang Output Parameter: 310686aefd0dSHong Zhang . vals - pointer to the data 310786aefd0dSHong Zhang 310886aefd0dSHong Zhang Level: intermediate 310986aefd0dSHong Zhang 311086aefd0dSHong Zhang .seealso: MatDenseGetColumn() 311186aefd0dSHong Zhang @*/ 311286aefd0dSHong Zhang PetscErrorCode MatDenseRestoreColumn(Mat A,PetscScalar **vals) 311386aefd0dSHong Zhang { 311486aefd0dSHong Zhang PetscErrorCode ierr; 311586aefd0dSHong Zhang 311686aefd0dSHong Zhang PetscFunctionBegin; 3117d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 3118d5ea218eSStefano Zampini PetscValidPointer(vals,2); 311986aefd0dSHong Zhang ierr = PetscUseMethod(A,"MatDenseRestoreColumn_C",(Mat,PetscScalar**),(A,vals));CHKERRQ(ierr); 312086aefd0dSHong Zhang PetscFunctionReturn(0); 312186aefd0dSHong Zhang } 31226947451fSStefano Zampini 31236947451fSStefano Zampini /*@C 31246947451fSStefano Zampini MatDenseGetColumnVec - Gives read-write access to a column of a dense matrix, represented as a Vec. 31256947451fSStefano Zampini 31266947451fSStefano Zampini Collective 31276947451fSStefano Zampini 31285ea7661aSPierre Jolivet Input Parameters: 31296947451fSStefano Zampini + mat - the Mat object 31306947451fSStefano Zampini - col - the column index 31316947451fSStefano Zampini 31326947451fSStefano Zampini Output Parameter: 31336947451fSStefano Zampini . v - the vector 31346947451fSStefano Zampini 31356947451fSStefano Zampini Notes: 31366947451fSStefano Zampini The vector is owned by PETSc. Users need to call MatDenseRestoreColumnVec() when the vector is no longer needed. 31376947451fSStefano Zampini Use MatDenseGetColumnVecRead() to obtain read-only access or MatDenseGetColumnVecWrite() for write-only access. 31386947451fSStefano Zampini 31396947451fSStefano Zampini Level: intermediate 31406947451fSStefano Zampini 31416947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVecRead(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecRead(), MatDenseRestoreColumnVecWrite() 31426947451fSStefano Zampini @*/ 31436947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVec(Mat A,PetscInt col,Vec *v) 31446947451fSStefano Zampini { 31456947451fSStefano Zampini PetscErrorCode ierr; 31466947451fSStefano Zampini 31476947451fSStefano Zampini PetscFunctionBegin; 31486947451fSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 31496947451fSStefano Zampini PetscValidType(A,1); 31506947451fSStefano Zampini PetscValidLogicalCollectiveInt(A,col,2); 31516947451fSStefano Zampini PetscValidPointer(v,3); 31526947451fSStefano Zampini if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated"); 31536947451fSStefano Zampini if (col < 0 || col > A->cmap->N) SETERRQ2(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid col %D, should be in [0,%D)",col,A->cmap->N); 31546947451fSStefano Zampini ierr = PetscUseMethod(A,"MatDenseGetColumnVec_C",(Mat,PetscInt,Vec*),(A,col,v));CHKERRQ(ierr); 31556947451fSStefano Zampini PetscFunctionReturn(0); 31566947451fSStefano Zampini } 31576947451fSStefano Zampini 31586947451fSStefano Zampini /*@C 31596947451fSStefano Zampini MatDenseRestoreColumnVec - Returns access to a column of a dense matrix obtained from MatDenseGetColumnVec(). 31606947451fSStefano Zampini 31616947451fSStefano Zampini Collective 31626947451fSStefano Zampini 31635ea7661aSPierre Jolivet Input Parameters: 31646947451fSStefano Zampini + mat - the Mat object 31656947451fSStefano Zampini . col - the column index 31666947451fSStefano Zampini - v - the Vec object 31676947451fSStefano Zampini 31686947451fSStefano Zampini Level: intermediate 31696947451fSStefano Zampini 31706947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecRead(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVecRead(), MatDenseRestoreColumnVecWrite() 31716947451fSStefano Zampini @*/ 31726947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVec(Mat A,PetscInt col,Vec *v) 31736947451fSStefano Zampini { 31746947451fSStefano Zampini PetscErrorCode ierr; 31756947451fSStefano Zampini 31766947451fSStefano Zampini PetscFunctionBegin; 31776947451fSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 31786947451fSStefano Zampini PetscValidType(A,1); 31796947451fSStefano Zampini PetscValidLogicalCollectiveInt(A,col,2); 31806947451fSStefano Zampini PetscValidPointer(v,3); 31816947451fSStefano Zampini if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated"); 31826947451fSStefano Zampini if (col < 0 || col > A->cmap->N) SETERRQ2(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid col %D, should be in [0,%D)",col,A->cmap->N); 31836947451fSStefano Zampini ierr = PetscUseMethod(A,"MatDenseRestoreColumnVec_C",(Mat,PetscInt,Vec*),(A,col,v));CHKERRQ(ierr); 31846947451fSStefano Zampini PetscFunctionReturn(0); 31856947451fSStefano Zampini } 31866947451fSStefano Zampini 31876947451fSStefano Zampini /*@C 31886947451fSStefano Zampini MatDenseGetColumnVecRead - Gives read-only access to a column of a dense matrix, represented as a Vec. 31896947451fSStefano Zampini 31906947451fSStefano Zampini Collective 31916947451fSStefano Zampini 31925ea7661aSPierre Jolivet Input Parameters: 31936947451fSStefano Zampini + mat - the Mat object 31946947451fSStefano Zampini - col - the column index 31956947451fSStefano Zampini 31966947451fSStefano Zampini Output Parameter: 31976947451fSStefano Zampini . v - the vector 31986947451fSStefano Zampini 31996947451fSStefano Zampini Notes: 32006947451fSStefano Zampini The vector is owned by PETSc and users cannot modify it. 32016947451fSStefano Zampini Users need to call MatDenseRestoreColumnVecRead() when the vector is no longer needed. 32026947451fSStefano Zampini Use MatDenseGetColumnVec() to obtain read-write access or MatDenseGetColumnVecWrite() for write-only access. 32036947451fSStefano Zampini 32046947451fSStefano Zampini Level: intermediate 32056947451fSStefano Zampini 32066947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecRead(), MatDenseRestoreColumnVecWrite() 32076947451fSStefano Zampini @*/ 32086947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVecRead(Mat A,PetscInt col,Vec *v) 32096947451fSStefano Zampini { 32106947451fSStefano Zampini PetscErrorCode ierr; 32116947451fSStefano Zampini 32126947451fSStefano Zampini PetscFunctionBegin; 32136947451fSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 32146947451fSStefano Zampini PetscValidType(A,1); 32156947451fSStefano Zampini PetscValidLogicalCollectiveInt(A,col,2); 32166947451fSStefano Zampini PetscValidPointer(v,3); 32176947451fSStefano Zampini if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated"); 32186947451fSStefano Zampini if (col < 0 || col > A->cmap->N) SETERRQ2(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid col %D, should be in [0,%D)",col,A->cmap->N); 32196947451fSStefano Zampini ierr = PetscUseMethod(A,"MatDenseGetColumnVecRead_C",(Mat,PetscInt,Vec*),(A,col,v));CHKERRQ(ierr); 32206947451fSStefano Zampini PetscFunctionReturn(0); 32216947451fSStefano Zampini } 32226947451fSStefano Zampini 32236947451fSStefano Zampini /*@C 32246947451fSStefano Zampini MatDenseRestoreColumnVecRead - Returns access to a column of a dense matrix obtained from MatDenseGetColumnVecRead(). 32256947451fSStefano Zampini 32266947451fSStefano Zampini Collective 32276947451fSStefano Zampini 32285ea7661aSPierre Jolivet Input Parameters: 32296947451fSStefano Zampini + mat - the Mat object 32306947451fSStefano Zampini . col - the column index 32316947451fSStefano Zampini - v - the Vec object 32326947451fSStefano Zampini 32336947451fSStefano Zampini Level: intermediate 32346947451fSStefano Zampini 32356947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecRead(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecWrite() 32366947451fSStefano Zampini @*/ 32376947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVecRead(Mat A,PetscInt col,Vec *v) 32386947451fSStefano Zampini { 32396947451fSStefano Zampini PetscErrorCode ierr; 32406947451fSStefano Zampini 32416947451fSStefano Zampini PetscFunctionBegin; 32426947451fSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 32436947451fSStefano Zampini PetscValidType(A,1); 32446947451fSStefano Zampini PetscValidLogicalCollectiveInt(A,col,2); 32456947451fSStefano Zampini PetscValidPointer(v,3); 32466947451fSStefano Zampini if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated"); 32476947451fSStefano Zampini if (col < 0 || col > A->cmap->N) SETERRQ2(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid col %D, should be in [0,%D)",col,A->cmap->N); 32486947451fSStefano Zampini ierr = PetscUseMethod(A,"MatDenseRestoreColumnVecRead_C",(Mat,PetscInt,Vec*),(A,col,v));CHKERRQ(ierr); 32496947451fSStefano Zampini PetscFunctionReturn(0); 32506947451fSStefano Zampini } 32516947451fSStefano Zampini 32526947451fSStefano Zampini /*@C 32536947451fSStefano Zampini MatDenseGetColumnVecWrite - Gives write-only access to a column of a dense matrix, represented as a Vec. 32546947451fSStefano Zampini 32556947451fSStefano Zampini Collective 32566947451fSStefano Zampini 32575ea7661aSPierre Jolivet Input Parameters: 32586947451fSStefano Zampini + mat - the Mat object 32596947451fSStefano Zampini - col - the column index 32606947451fSStefano Zampini 32616947451fSStefano Zampini Output Parameter: 32626947451fSStefano Zampini . v - the vector 32636947451fSStefano Zampini 32646947451fSStefano Zampini Notes: 32656947451fSStefano Zampini The vector is owned by PETSc. Users need to call MatDenseRestoreColumnVecWrite() when the vector is no longer needed. 32666947451fSStefano Zampini Use MatDenseGetColumnVec() to obtain read-write access or MatDenseGetColumnVecRead() for read-only access. 32676947451fSStefano Zampini 32686947451fSStefano Zampini Level: intermediate 32696947451fSStefano Zampini 32706947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecRead(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecRead(), MatDenseRestoreColumnVecWrite() 32716947451fSStefano Zampini @*/ 32726947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVecWrite(Mat A,PetscInt col,Vec *v) 32736947451fSStefano Zampini { 32746947451fSStefano Zampini PetscErrorCode ierr; 32756947451fSStefano Zampini 32766947451fSStefano Zampini PetscFunctionBegin; 32776947451fSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 32786947451fSStefano Zampini PetscValidType(A,1); 32796947451fSStefano Zampini PetscValidLogicalCollectiveInt(A,col,2); 32806947451fSStefano Zampini PetscValidPointer(v,3); 32816947451fSStefano Zampini if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated"); 32826947451fSStefano Zampini if (col < 0 || col > A->cmap->N) SETERRQ2(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid col %D, should be in [0,%D)",col,A->cmap->N); 32836947451fSStefano Zampini ierr = PetscUseMethod(A,"MatDenseGetColumnVecWrite_C",(Mat,PetscInt,Vec*),(A,col,v));CHKERRQ(ierr); 32846947451fSStefano Zampini PetscFunctionReturn(0); 32856947451fSStefano Zampini } 32866947451fSStefano Zampini 32876947451fSStefano Zampini /*@C 32886947451fSStefano Zampini MatDenseRestoreColumnVecWrite - Returns access to a column of a dense matrix obtained from MatDenseGetColumnVecWrite(). 32896947451fSStefano Zampini 32906947451fSStefano Zampini Collective 32916947451fSStefano Zampini 32925ea7661aSPierre Jolivet Input Parameters: 32936947451fSStefano Zampini + mat - the Mat object 32946947451fSStefano Zampini . col - the column index 32956947451fSStefano Zampini - v - the Vec object 32966947451fSStefano Zampini 32976947451fSStefano Zampini Level: intermediate 32986947451fSStefano Zampini 32996947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecRead(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecRead() 33006947451fSStefano Zampini @*/ 33016947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVecWrite(Mat A,PetscInt col,Vec *v) 33026947451fSStefano Zampini { 33036947451fSStefano Zampini PetscErrorCode ierr; 33046947451fSStefano Zampini 33056947451fSStefano Zampini PetscFunctionBegin; 33066947451fSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 33076947451fSStefano Zampini PetscValidType(A,1); 33086947451fSStefano Zampini PetscValidLogicalCollectiveInt(A,col,2); 33096947451fSStefano Zampini PetscValidPointer(v,3); 33106947451fSStefano Zampini if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated"); 33116947451fSStefano Zampini if (col < 0 || col > A->cmap->N) SETERRQ2(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid col %D, should be in [0,%D)",col,A->cmap->N); 33126947451fSStefano Zampini ierr = PetscUseMethod(A,"MatDenseRestoreColumnVecWrite_C",(Mat,PetscInt,Vec*),(A,col,v));CHKERRQ(ierr); 33136947451fSStefano Zampini PetscFunctionReturn(0); 33146947451fSStefano Zampini } 33155ea7661aSPierre Jolivet 33165ea7661aSPierre Jolivet /*@C 33175ea7661aSPierre Jolivet MatDenseGetSubMatrix - Gives access to a block of columns of a dense matrix, represented as a Mat. 33185ea7661aSPierre Jolivet 33195ea7661aSPierre Jolivet Collective 33205ea7661aSPierre Jolivet 33215ea7661aSPierre Jolivet Input Parameters: 33225ea7661aSPierre Jolivet + mat - the Mat object 33235ea7661aSPierre Jolivet . cbegin - the first index in the block 33245ea7661aSPierre Jolivet - cend - the last index in the block 33255ea7661aSPierre Jolivet 33265ea7661aSPierre Jolivet Output Parameter: 33275ea7661aSPierre Jolivet . v - the matrix 33285ea7661aSPierre Jolivet 33295ea7661aSPierre Jolivet Notes: 33305ea7661aSPierre Jolivet The matrix is owned by PETSc. Users need to call MatDenseRestoreSubMatrix() when the matrix is no longer needed. 33315ea7661aSPierre Jolivet 33325ea7661aSPierre Jolivet Level: intermediate 33335ea7661aSPierre Jolivet 33345ea7661aSPierre Jolivet .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseRestoreColumnVec(), MatDenseRestoreSubMatrix() 33355ea7661aSPierre Jolivet @*/ 33365ea7661aSPierre Jolivet PetscErrorCode MatDenseGetSubMatrix(Mat A,PetscInt cbegin,PetscInt cend,Mat *v) 33375ea7661aSPierre Jolivet { 33385ea7661aSPierre Jolivet PetscErrorCode ierr; 33395ea7661aSPierre Jolivet 33405ea7661aSPierre Jolivet PetscFunctionBegin; 33415ea7661aSPierre Jolivet PetscValidHeaderSpecific(A,MAT_CLASSID,1); 33425ea7661aSPierre Jolivet PetscValidType(A,1); 33435ea7661aSPierre Jolivet PetscValidLogicalCollectiveInt(A,cbegin,2); 33445ea7661aSPierre Jolivet PetscValidLogicalCollectiveInt(A,cend,3); 33455ea7661aSPierre Jolivet PetscValidPointer(v,4); 33465ea7661aSPierre Jolivet if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated"); 33475ea7661aSPierre Jolivet if (cbegin < 0 || cbegin > A->cmap->N) SETERRQ2(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid cbegin %D, should be in [0,%D)",cbegin,A->cmap->N); 3348616b8fbbSStefano Zampini if (cend < cbegin || cend > A->cmap->N) SETERRQ3(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Invalid cend %D, should be in [%D,%D)",cend,cbegin,A->cmap->N); 33495ea7661aSPierre Jolivet ierr = PetscUseMethod(A,"MatDenseGetSubMatrix_C",(Mat,PetscInt,PetscInt,Mat*),(A,cbegin,cend,v));CHKERRQ(ierr); 33505ea7661aSPierre Jolivet PetscFunctionReturn(0); 33515ea7661aSPierre Jolivet } 33525ea7661aSPierre Jolivet 33535ea7661aSPierre Jolivet /*@C 33545ea7661aSPierre Jolivet MatDenseRestoreSubMatrix - Returns access to a block of columns of a dense matrix obtained from MatDenseGetSubMatrix(). 33555ea7661aSPierre Jolivet 33565ea7661aSPierre Jolivet Collective 33575ea7661aSPierre Jolivet 33585ea7661aSPierre Jolivet Input Parameters: 33595ea7661aSPierre Jolivet + mat - the Mat object 33605ea7661aSPierre Jolivet - v - the Mat object 33615ea7661aSPierre Jolivet 33625ea7661aSPierre Jolivet Level: intermediate 33635ea7661aSPierre Jolivet 33645ea7661aSPierre Jolivet .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseRestoreColumnVec(), MatDenseGetSubMatrix() 33655ea7661aSPierre Jolivet @*/ 33665ea7661aSPierre Jolivet PetscErrorCode MatDenseRestoreSubMatrix(Mat A,Mat *v) 33675ea7661aSPierre Jolivet { 33685ea7661aSPierre Jolivet PetscErrorCode ierr; 33695ea7661aSPierre Jolivet 33705ea7661aSPierre Jolivet PetscFunctionBegin; 33715ea7661aSPierre Jolivet PetscValidHeaderSpecific(A,MAT_CLASSID,1); 33725ea7661aSPierre Jolivet PetscValidType(A,1); 33735ea7661aSPierre Jolivet PetscValidPointer(v,2); 33745ea7661aSPierre Jolivet ierr = PetscUseMethod(A,"MatDenseRestoreSubMatrix_C",(Mat,Mat*),(A,v));CHKERRQ(ierr); 33755ea7661aSPierre Jolivet PetscFunctionReturn(0); 33765ea7661aSPierre Jolivet } 3377