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; 397b24902e0SBarry Smith PetscInt lda = (PetscInt)mat->lda,j,m; 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); 4020298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newi,NULL);CHKERRQ(ierr); 403b24902e0SBarry Smith if (cpvalues == MAT_COPY_VALUES) { 404ca15aa20SStefano Zampini const PetscScalar *av; 405ca15aa20SStefano Zampini PetscScalar *v; 406ca15aa20SStefano Zampini 407ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&av);CHKERRQ(ierr); 408ca15aa20SStefano Zampini ierr = MatDenseGetArray(newi,&v);CHKERRQ(ierr); 409d0f46423SBarry Smith if (lda>A->rmap->n) { 410d0f46423SBarry Smith m = A->rmap->n; 411d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 412ca15aa20SStefano Zampini ierr = PetscArraycpy(v+j*m,av+j*lda,m);CHKERRQ(ierr); 413b24902e0SBarry Smith } 414b24902e0SBarry Smith } else { 415ca15aa20SStefano Zampini ierr = PetscArraycpy(v,av,A->rmap->n*A->cmap->n);CHKERRQ(ierr); 416b24902e0SBarry Smith } 417ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(newi,&v);CHKERRQ(ierr); 418ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&av);CHKERRQ(ierr); 419b24902e0SBarry Smith } 420b24902e0SBarry Smith PetscFunctionReturn(0); 421b24902e0SBarry Smith } 422b24902e0SBarry Smith 423ca15aa20SStefano Zampini PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat) 42402cad45dSBarry Smith { 4256849ba73SBarry Smith PetscErrorCode ierr; 42602cad45dSBarry Smith 4273a40ed3dSBarry Smith PetscFunctionBegin; 428ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),newmat);CHKERRQ(ierr); 429d0f46423SBarry Smith ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 4305c9eb25fSBarry Smith ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 431719d5645SBarry Smith ierr = MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues);CHKERRQ(ierr); 432b24902e0SBarry Smith PetscFunctionReturn(0); 433b24902e0SBarry Smith } 434b24902e0SBarry Smith 435e0877f53SBarry Smith static PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 436289bc588SBarry Smith { 4374482741eSBarry Smith MatFactorInfo info; 438a093e273SMatthew Knepley PetscErrorCode ierr; 4393a40ed3dSBarry Smith 4403a40ed3dSBarry Smith PetscFunctionBegin; 441c3ef05f6SHong Zhang ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 442ca15aa20SStefano Zampini ierr = (*fact->ops->lufactor)(fact,0,0,&info);CHKERRQ(ierr); 4433a40ed3dSBarry Smith PetscFunctionReturn(0); 444289bc588SBarry Smith } 4456ee01492SSatish Balay 446e0877f53SBarry Smith static PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy) 447289bc588SBarry Smith { 448c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 4496849ba73SBarry Smith PetscErrorCode ierr; 450f1ceaac6SMatthew G. Knepley const PetscScalar *x; 451f1ceaac6SMatthew G. Knepley PetscScalar *y; 452c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 45367e560aaSBarry Smith 4543a40ed3dSBarry Smith PetscFunctionBegin; 455c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 456f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 4571ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 458580bdb30SBarry Smith ierr = PetscArraycpy(y,x,A->rmap->n);CHKERRQ(ierr); 459d5f3da31SBarry Smith if (A->factortype == MAT_FACTOR_LU) { 46000121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 4618b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 46200121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 463e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 464d5f3da31SBarry Smith } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 465a49dc2a2SStefano Zampini if (A->spd) { 46600121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 4678b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 46800121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 469e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 470a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX) 471a49dc2a2SStefano Zampini } else if (A->hermitian) { 47200121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 473a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKhetrs",LAPACKhetrs_("L",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 47400121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 475a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"HETRS Bad solve"); 476a49dc2a2SStefano Zampini #endif 477a49dc2a2SStefano Zampini } else { /* symmetric case */ 47800121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 479a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrs",LAPACKsytrs_("L",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 48000121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 481a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"SYTRS Bad solve"); 482a49dc2a2SStefano Zampini } 4832205254eSKarl Rupp } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 484f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 4851ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 486dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 4873a40ed3dSBarry Smith PetscFunctionReturn(0); 488289bc588SBarry Smith } 4896ee01492SSatish Balay 490e0877f53SBarry Smith static PetscErrorCode MatMatSolve_SeqDense(Mat A,Mat B,Mat X) 49185e2c93fSHong Zhang { 49285e2c93fSHong Zhang Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 49385e2c93fSHong Zhang PetscErrorCode ierr; 4941683a169SBarry Smith const PetscScalar *b; 4951683a169SBarry Smith PetscScalar *x; 496efb80c78SLisandro Dalcin PetscInt n; 497783b601eSJed Brown PetscBLASInt nrhs,info,m; 49885e2c93fSHong Zhang 49985e2c93fSHong Zhang PetscFunctionBegin; 500c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 5010298fd71SBarry Smith ierr = MatGetSize(B,NULL,&n);CHKERRQ(ierr); 502c5df96a5SBarry Smith ierr = PetscBLASIntCast(n,&nrhs);CHKERRQ(ierr); 5031683a169SBarry Smith ierr = MatDenseGetArrayRead(B,&b);CHKERRQ(ierr); 5048c778c55SBarry Smith ierr = MatDenseGetArray(X,&x);CHKERRQ(ierr); 50585e2c93fSHong Zhang 506580bdb30SBarry Smith ierr = PetscArraycpy(x,b,m*nrhs);CHKERRQ(ierr); 50785e2c93fSHong Zhang 50885e2c93fSHong Zhang if (A->factortype == MAT_FACTOR_LU) { 50900121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 5108b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info)); 51100121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 51285e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 51385e2c93fSHong Zhang } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 514a49dc2a2SStefano Zampini if (A->spd) { 51500121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 5168b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info)); 51700121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 51885e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 519a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX) 520a49dc2a2SStefano Zampini } else if (A->hermitian) { 52100121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 522a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKhetrs",LAPACKhetrs_("L",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info)); 52300121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 524a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"HETRS Bad solve"); 525a49dc2a2SStefano Zampini #endif 526a49dc2a2SStefano Zampini } else { /* symmetric case */ 52700121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 528a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrs",LAPACKsytrs_("L",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info)); 52900121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 530a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"SYTRS Bad solve"); 531a49dc2a2SStefano Zampini } 5322205254eSKarl Rupp } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 53385e2c93fSHong Zhang 5341683a169SBarry Smith ierr = MatDenseRestoreArrayRead(B,&b);CHKERRQ(ierr); 5358c778c55SBarry Smith ierr = MatDenseRestoreArray(X,&x);CHKERRQ(ierr); 53685e2c93fSHong Zhang ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr); 53785e2c93fSHong Zhang PetscFunctionReturn(0); 53885e2c93fSHong Zhang } 53985e2c93fSHong Zhang 54000121966SStefano Zampini static PetscErrorCode MatConjugate_SeqDense(Mat); 54100121966SStefano Zampini 542e0877f53SBarry Smith static PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy) 543da3a660dSBarry Smith { 544c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 545dfbe8321SBarry Smith PetscErrorCode ierr; 546f1ceaac6SMatthew G. Knepley const PetscScalar *x; 547f1ceaac6SMatthew G. Knepley PetscScalar *y; 548c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 54967e560aaSBarry Smith 5503a40ed3dSBarry Smith PetscFunctionBegin; 551c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 552f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 5531ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 554580bdb30SBarry Smith ierr = PetscArraycpy(y,x,A->rmap->n);CHKERRQ(ierr); 5558208b9aeSStefano Zampini if (A->factortype == MAT_FACTOR_LU) { 55600121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 5578b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 55800121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 559e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve"); 5608208b9aeSStefano Zampini } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 561a49dc2a2SStefano Zampini if (A->spd) { 56200121966SStefano Zampini #if defined(PETSC_USE_COMPLEX) 56300121966SStefano Zampini ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr); 56400121966SStefano Zampini #endif 56500121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 5668b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 56700121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 56800121966SStefano Zampini #if defined(PETSC_USE_COMPLEX) 56900121966SStefano Zampini ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr); 57000121966SStefano Zampini #endif 571a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 572a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX) 573a49dc2a2SStefano Zampini } else if (A->hermitian) { 57400121966SStefano Zampini ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr); 57500121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 57600121966SStefano Zampini PetscStackCallBLAS("LAPACKhetrs",LAPACKhetrs_("L",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 57700121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 57800121966SStefano Zampini ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr); 579ae7cfcebSSatish Balay #endif 580a49dc2a2SStefano Zampini } else { /* symmetric case */ 58100121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 582a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrs",LAPACKsytrs_("L",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 58300121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 584a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"SYTRS Bad solve"); 585da3a660dSBarry Smith } 586a49dc2a2SStefano Zampini } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 587f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 5881ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 589dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 5903a40ed3dSBarry Smith PetscFunctionReturn(0); 591da3a660dSBarry Smith } 5926ee01492SSatish Balay 593db4efbfdSBarry Smith /* ---------------------------------------------------------------*/ 594db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots, 595db4efbfdSBarry Smith rather than put it in the Mat->row slot.*/ 596ca15aa20SStefano Zampini PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo) 597db4efbfdSBarry Smith { 598db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 599db4efbfdSBarry Smith PetscErrorCode ierr; 600db4efbfdSBarry Smith PetscBLASInt n,m,info; 601db4efbfdSBarry Smith 602db4efbfdSBarry Smith PetscFunctionBegin; 603c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 604c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 605db4efbfdSBarry Smith if (!mat->pivots) { 6068208b9aeSStefano Zampini ierr = PetscMalloc1(A->rmap->n,&mat->pivots);CHKERRQ(ierr); 6073bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr); 608db4efbfdSBarry Smith } 609db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 6108e57ea43SSatish Balay ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 6118b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrf",LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info)); 6128e57ea43SSatish Balay ierr = PetscFPTrapPop();CHKERRQ(ierr); 6138e57ea43SSatish Balay 614e32f2f54SBarry Smith if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization"); 615e32f2f54SBarry Smith if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization"); 6168208b9aeSStefano Zampini 617db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 6188208b9aeSStefano Zampini A->ops->matsolve = MatMatSolve_SeqDense; 619db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 620d5f3da31SBarry Smith A->factortype = MAT_FACTOR_LU; 621db4efbfdSBarry Smith 622f6224b95SHong Zhang ierr = PetscFree(A->solvertype);CHKERRQ(ierr); 623f6224b95SHong Zhang ierr = PetscStrallocpy(MATSOLVERPETSC,&A->solvertype);CHKERRQ(ierr); 624f6224b95SHong Zhang 625dc0b31edSSatish Balay ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr); 626db4efbfdSBarry Smith PetscFunctionReturn(0); 627db4efbfdSBarry Smith } 628db4efbfdSBarry Smith 629a49dc2a2SStefano Zampini /* Cholesky as L*L^T or L*D*L^T and the symmetric/hermitian complex variants */ 630ca15aa20SStefano Zampini PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo) 631db4efbfdSBarry Smith { 632db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 633db4efbfdSBarry Smith PetscErrorCode ierr; 634c5df96a5SBarry Smith PetscBLASInt info,n; 635db4efbfdSBarry Smith 636db4efbfdSBarry Smith PetscFunctionBegin; 637c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 638db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 639a49dc2a2SStefano Zampini if (A->spd) { 64000121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 6418b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrf",LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info)); 64200121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 643a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX) 644a49dc2a2SStefano Zampini } else if (A->hermitian) { 645a49dc2a2SStefano Zampini if (!mat->pivots) { 646a49dc2a2SStefano Zampini ierr = PetscMalloc1(A->rmap->n,&mat->pivots);CHKERRQ(ierr); 647a49dc2a2SStefano Zampini ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr); 648a49dc2a2SStefano Zampini } 649a49dc2a2SStefano Zampini if (!mat->fwork) { 650a49dc2a2SStefano Zampini PetscScalar dummy; 651a49dc2a2SStefano Zampini 652a49dc2a2SStefano Zampini mat->lfwork = -1; 65300121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 654a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKhetrf",LAPACKhetrf_("L",&n,mat->v,&mat->lda,mat->pivots,&dummy,&mat->lfwork,&info)); 65500121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 656a49dc2a2SStefano Zampini mat->lfwork = (PetscInt)PetscRealPart(dummy); 657a49dc2a2SStefano Zampini ierr = PetscMalloc1(mat->lfwork,&mat->fwork);CHKERRQ(ierr); 658a49dc2a2SStefano Zampini ierr = PetscLogObjectMemory((PetscObject)A,mat->lfwork*sizeof(PetscBLASInt));CHKERRQ(ierr); 659a49dc2a2SStefano Zampini } 66000121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 661a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKhetrf",LAPACKhetrf_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&mat->lfwork,&info)); 66200121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 663a49dc2a2SStefano Zampini #endif 664a49dc2a2SStefano Zampini } else { /* symmetric case */ 665a49dc2a2SStefano Zampini if (!mat->pivots) { 666a49dc2a2SStefano Zampini ierr = PetscMalloc1(A->rmap->n,&mat->pivots);CHKERRQ(ierr); 667a49dc2a2SStefano Zampini ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr); 668a49dc2a2SStefano Zampini } 669a49dc2a2SStefano Zampini if (!mat->fwork) { 670a49dc2a2SStefano Zampini PetscScalar dummy; 671a49dc2a2SStefano Zampini 672a49dc2a2SStefano Zampini mat->lfwork = -1; 67300121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 674a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrf",LAPACKsytrf_("L",&n,mat->v,&mat->lda,mat->pivots,&dummy,&mat->lfwork,&info)); 67500121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 676a49dc2a2SStefano Zampini mat->lfwork = (PetscInt)PetscRealPart(dummy); 677a49dc2a2SStefano Zampini ierr = PetscMalloc1(mat->lfwork,&mat->fwork);CHKERRQ(ierr); 678a49dc2a2SStefano Zampini ierr = PetscLogObjectMemory((PetscObject)A,mat->lfwork*sizeof(PetscBLASInt));CHKERRQ(ierr); 679a49dc2a2SStefano Zampini } 68000121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 681a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrf",LAPACKsytrf_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&mat->lfwork,&info)); 68200121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 683a49dc2a2SStefano Zampini } 684e32f2f54SBarry Smith if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1); 6858208b9aeSStefano Zampini 686db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 6878208b9aeSStefano Zampini A->ops->matsolve = MatMatSolve_SeqDense; 688db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 689d5f3da31SBarry Smith A->factortype = MAT_FACTOR_CHOLESKY; 6902205254eSKarl Rupp 691f6224b95SHong Zhang ierr = PetscFree(A->solvertype);CHKERRQ(ierr); 692f6224b95SHong Zhang ierr = PetscStrallocpy(MATSOLVERPETSC,&A->solvertype);CHKERRQ(ierr); 693f6224b95SHong Zhang 694eb3f19e4SBarry Smith ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr); 695db4efbfdSBarry Smith PetscFunctionReturn(0); 696db4efbfdSBarry Smith } 697db4efbfdSBarry Smith 6980481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 699db4efbfdSBarry Smith { 700db4efbfdSBarry Smith PetscErrorCode ierr; 701db4efbfdSBarry Smith MatFactorInfo info; 702db4efbfdSBarry Smith 703db4efbfdSBarry Smith PetscFunctionBegin; 704db4efbfdSBarry Smith info.fill = 1.0; 7052205254eSKarl Rupp 706c3ef05f6SHong Zhang ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 707ca15aa20SStefano Zampini ierr = (*fact->ops->choleskyfactor)(fact,0,&info);CHKERRQ(ierr); 708db4efbfdSBarry Smith PetscFunctionReturn(0); 709db4efbfdSBarry Smith } 710db4efbfdSBarry Smith 711ca15aa20SStefano Zampini PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info) 712db4efbfdSBarry Smith { 713db4efbfdSBarry Smith PetscFunctionBegin; 714c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 7151bbcc794SSatish Balay fact->preallocated = PETSC_TRUE; 716719d5645SBarry Smith fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense; 717bd443b22SStefano Zampini fact->ops->solve = MatSolve_SeqDense; 718bd443b22SStefano Zampini fact->ops->matsolve = MatMatSolve_SeqDense; 719bd443b22SStefano Zampini fact->ops->solvetranspose = MatSolveTranspose_SeqDense; 720db4efbfdSBarry Smith PetscFunctionReturn(0); 721db4efbfdSBarry Smith } 722db4efbfdSBarry Smith 723ca15aa20SStefano Zampini PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info) 724db4efbfdSBarry Smith { 725db4efbfdSBarry Smith PetscFunctionBegin; 726b66fe19dSMatthew G Knepley fact->preallocated = PETSC_TRUE; 727c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 728719d5645SBarry Smith fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense; 729bd443b22SStefano Zampini fact->ops->solve = MatSolve_SeqDense; 730bd443b22SStefano Zampini fact->ops->matsolve = MatMatSolve_SeqDense; 731bd443b22SStefano Zampini fact->ops->solvetranspose = MatSolveTranspose_SeqDense; 732db4efbfdSBarry Smith PetscFunctionReturn(0); 733db4efbfdSBarry Smith } 734db4efbfdSBarry Smith 735ca15aa20SStefano Zampini /* uses LAPACK */ 736cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact) 737db4efbfdSBarry Smith { 738db4efbfdSBarry Smith PetscErrorCode ierr; 739db4efbfdSBarry Smith 740db4efbfdSBarry Smith PetscFunctionBegin; 741ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),fact);CHKERRQ(ierr); 742db4efbfdSBarry Smith ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 743ca15aa20SStefano Zampini ierr = MatSetType(*fact,MATDENSE);CHKERRQ(ierr); 744db4efbfdSBarry Smith if (ftype == MAT_FACTOR_LU) { 745db4efbfdSBarry Smith (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense; 746db4efbfdSBarry Smith } else { 747db4efbfdSBarry Smith (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense; 748db4efbfdSBarry Smith } 749d5f3da31SBarry Smith (*fact)->factortype = ftype; 75000c67f3bSHong Zhang 75100c67f3bSHong Zhang ierr = PetscFree((*fact)->solvertype);CHKERRQ(ierr); 75200c67f3bSHong Zhang ierr = PetscStrallocpy(MATSOLVERPETSC,&(*fact)->solvertype);CHKERRQ(ierr); 753db4efbfdSBarry Smith PetscFunctionReturn(0); 754db4efbfdSBarry Smith } 755db4efbfdSBarry Smith 756289bc588SBarry Smith /* ------------------------------------------------------------------*/ 757e0877f53SBarry Smith static PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx) 758289bc588SBarry Smith { 759c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 760d9ca1df4SBarry Smith PetscScalar *x,*v = mat->v,zero = 0.0,xt; 761d9ca1df4SBarry Smith const PetscScalar *b; 762dfbe8321SBarry Smith PetscErrorCode ierr; 763d0f46423SBarry Smith PetscInt m = A->rmap->n,i; 764c5df96a5SBarry Smith PetscBLASInt o = 1,bm; 765289bc588SBarry Smith 7663a40ed3dSBarry Smith PetscFunctionBegin; 767ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA) 768c70f7ee4SJunchao Zhang if (A->offloadmask == PETSC_OFFLOAD_GPU) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Not implemented"); 769ca15aa20SStefano Zampini #endif 770422a814eSBarry Smith if (shift == -1) shift = 0.0; /* negative shift indicates do not error on zero diagonal; this code never zeros on zero diagonal */ 771c5df96a5SBarry Smith ierr = PetscBLASIntCast(m,&bm);CHKERRQ(ierr); 772289bc588SBarry Smith if (flag & SOR_ZERO_INITIAL_GUESS) { 7733bffc371SBarry Smith /* this is a hack fix, should have another version without the second BLASdotu */ 7742dcb1b2aSMatthew Knepley ierr = VecSet(xx,zero);CHKERRQ(ierr); 775289bc588SBarry Smith } 7761ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 777d9ca1df4SBarry Smith ierr = VecGetArrayRead(bb,&b);CHKERRQ(ierr); 778b965ef7fSBarry Smith its = its*lits; 779e32f2f54SBarry 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); 780289bc588SBarry Smith while (its--) { 781fccaa45eSBarry Smith if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) { 782289bc588SBarry Smith for (i=0; i<m; i++) { 7833bffc371SBarry Smith PetscStackCallBLAS("BLASdotu",xt = b[i] - BLASdotu_(&bm,v+i,&bm,x,&o)); 78455a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 785289bc588SBarry Smith } 786289bc588SBarry Smith } 787fccaa45eSBarry Smith if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) { 788289bc588SBarry Smith for (i=m-1; i>=0; i--) { 7893bffc371SBarry Smith PetscStackCallBLAS("BLASdotu",xt = b[i] - BLASdotu_(&bm,v+i,&bm,x,&o)); 79055a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 791289bc588SBarry Smith } 792289bc588SBarry Smith } 793289bc588SBarry Smith } 794d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(bb,&b);CHKERRQ(ierr); 7951ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 7963a40ed3dSBarry Smith PetscFunctionReturn(0); 797289bc588SBarry Smith } 798289bc588SBarry Smith 799289bc588SBarry Smith /* -----------------------------------------------------------------*/ 800ca15aa20SStefano Zampini PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy) 801289bc588SBarry Smith { 802c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 803d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 804d9ca1df4SBarry Smith PetscScalar *y; 805dfbe8321SBarry Smith PetscErrorCode ierr; 8060805154bSBarry Smith PetscBLASInt m, n,_One=1; 807ea709b57SSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 8083a40ed3dSBarry Smith 8093a40ed3dSBarry Smith PetscFunctionBegin; 810c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 811c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 812d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 8132bf066beSStefano Zampini ierr = VecGetArrayWrite(yy,&y);CHKERRQ(ierr); 8145ac36cfcSBarry Smith if (!A->rmap->n || !A->cmap->n) { 8155ac36cfcSBarry Smith PetscBLASInt i; 8165ac36cfcSBarry Smith for (i=0; i<n; i++) y[i] = 0.0; 8175ac36cfcSBarry Smith } else { 8188b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One)); 8195ac36cfcSBarry Smith ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 8205ac36cfcSBarry Smith } 821d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 8222bf066beSStefano Zampini ierr = VecRestoreArrayWrite(yy,&y);CHKERRQ(ierr); 8233a40ed3dSBarry Smith PetscFunctionReturn(0); 824289bc588SBarry Smith } 825800995b7SMatthew Knepley 826ca15aa20SStefano Zampini PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy) 827289bc588SBarry Smith { 828c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 829d9ca1df4SBarry Smith PetscScalar *y,_DOne=1.0,_DZero=0.0; 830dfbe8321SBarry Smith PetscErrorCode ierr; 8310805154bSBarry Smith PetscBLASInt m, n, _One=1; 832d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 8333a40ed3dSBarry Smith 8343a40ed3dSBarry Smith PetscFunctionBegin; 835c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 836c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 837d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 8382bf066beSStefano Zampini ierr = VecGetArrayWrite(yy,&y);CHKERRQ(ierr); 8395ac36cfcSBarry Smith if (!A->rmap->n || !A->cmap->n) { 8405ac36cfcSBarry Smith PetscBLASInt i; 8415ac36cfcSBarry Smith for (i=0; i<m; i++) y[i] = 0.0; 8425ac36cfcSBarry Smith } else { 8438b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One)); 8445ac36cfcSBarry Smith ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr); 8455ac36cfcSBarry Smith } 846d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 8472bf066beSStefano Zampini ierr = VecRestoreArrayWrite(yy,&y);CHKERRQ(ierr); 8483a40ed3dSBarry Smith PetscFunctionReturn(0); 849289bc588SBarry Smith } 8506ee01492SSatish Balay 851ca15aa20SStefano Zampini PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 852289bc588SBarry Smith { 853c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 854d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 855d9ca1df4SBarry Smith PetscScalar *y,_DOne=1.0; 856dfbe8321SBarry Smith PetscErrorCode ierr; 8570805154bSBarry Smith PetscBLASInt m, n, _One=1; 8583a40ed3dSBarry Smith 8593a40ed3dSBarry Smith PetscFunctionBegin; 860c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 861c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 862d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 863600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 864d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 8651ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 8668b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One)); 867d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 8681ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 869dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 8703a40ed3dSBarry Smith PetscFunctionReturn(0); 871289bc588SBarry Smith } 8726ee01492SSatish Balay 873ca15aa20SStefano Zampini PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 874289bc588SBarry Smith { 875c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 876d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 877d9ca1df4SBarry Smith PetscScalar *y; 878dfbe8321SBarry Smith PetscErrorCode ierr; 8790805154bSBarry Smith PetscBLASInt m, n, _One=1; 88087828ca2SBarry Smith PetscScalar _DOne=1.0; 8813a40ed3dSBarry Smith 8823a40ed3dSBarry Smith PetscFunctionBegin; 883c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 884c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 885d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 886600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 887d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 8881ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 8898b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One)); 890d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 8911ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 892dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 8933a40ed3dSBarry Smith PetscFunctionReturn(0); 894289bc588SBarry Smith } 895289bc588SBarry Smith 896289bc588SBarry Smith /* -----------------------------------------------------------------*/ 897e0877f53SBarry Smith static PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 898289bc588SBarry Smith { 899c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 9006849ba73SBarry Smith PetscErrorCode ierr; 90113f74950SBarry Smith PetscInt i; 90267e560aaSBarry Smith 9033a40ed3dSBarry Smith PetscFunctionBegin; 904d0f46423SBarry Smith *ncols = A->cmap->n; 905289bc588SBarry Smith if (cols) { 906854ce69bSBarry Smith ierr = PetscMalloc1(A->cmap->n+1,cols);CHKERRQ(ierr); 907d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) (*cols)[i] = i; 908289bc588SBarry Smith } 909289bc588SBarry Smith if (vals) { 910ca15aa20SStefano Zampini const PetscScalar *v; 911ca15aa20SStefano Zampini 912ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&v);CHKERRQ(ierr); 913854ce69bSBarry Smith ierr = PetscMalloc1(A->cmap->n+1,vals);CHKERRQ(ierr); 914ca15aa20SStefano Zampini v += row; 915d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;} 916ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&v);CHKERRQ(ierr); 917289bc588SBarry Smith } 9183a40ed3dSBarry Smith PetscFunctionReturn(0); 919289bc588SBarry Smith } 9206ee01492SSatish Balay 921e0877f53SBarry Smith static PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 922289bc588SBarry Smith { 923dfbe8321SBarry Smith PetscErrorCode ierr; 9246e111a19SKarl Rupp 925606d414cSSatish Balay PetscFunctionBegin; 926606d414cSSatish Balay if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);} 927606d414cSSatish Balay if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); } 9283a40ed3dSBarry Smith PetscFunctionReturn(0); 929289bc588SBarry Smith } 930289bc588SBarry Smith /* ----------------------------------------------------------------*/ 931e0877f53SBarry Smith static PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv) 932289bc588SBarry Smith { 933c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 934ca15aa20SStefano Zampini PetscScalar *av; 93513f74950SBarry Smith PetscInt i,j,idx=0; 936ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA) 937c70f7ee4SJunchao Zhang PetscOffloadMask oldf; 938ca15aa20SStefano Zampini #endif 939ca15aa20SStefano Zampini PetscErrorCode ierr; 940d6dfbf8fSBarry Smith 9413a40ed3dSBarry Smith PetscFunctionBegin; 942ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&av);CHKERRQ(ierr); 943289bc588SBarry Smith if (!mat->roworiented) { 944dbb450caSBarry Smith if (addv == INSERT_VALUES) { 945289bc588SBarry Smith for (j=0; j<n; j++) { 946cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 947cf9c20a2SJed 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); 948289bc588SBarry Smith for (i=0; i<m; i++) { 949cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 950cf9c20a2SJed 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); 951ca15aa20SStefano Zampini av[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 952289bc588SBarry Smith } 953289bc588SBarry Smith } 9543a40ed3dSBarry Smith } else { 955289bc588SBarry Smith for (j=0; j<n; j++) { 956cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 957cf9c20a2SJed 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); 958289bc588SBarry Smith for (i=0; i<m; i++) { 959cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 960cf9c20a2SJed 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); 961ca15aa20SStefano Zampini av[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 962289bc588SBarry Smith } 963289bc588SBarry Smith } 964289bc588SBarry Smith } 9653a40ed3dSBarry Smith } else { 966dbb450caSBarry Smith if (addv == INSERT_VALUES) { 967e8d4e0b9SBarry Smith for (i=0; i<m; i++) { 968cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 969cf9c20a2SJed 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); 970e8d4e0b9SBarry Smith for (j=0; j<n; j++) { 971cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 972cf9c20a2SJed 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); 973ca15aa20SStefano Zampini av[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 974e8d4e0b9SBarry Smith } 975e8d4e0b9SBarry Smith } 9763a40ed3dSBarry Smith } else { 977289bc588SBarry Smith for (i=0; i<m; i++) { 978cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 979cf9c20a2SJed 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); 980289bc588SBarry Smith for (j=0; j<n; j++) { 981cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 982cf9c20a2SJed 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); 983ca15aa20SStefano Zampini av[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 984289bc588SBarry Smith } 985289bc588SBarry Smith } 986289bc588SBarry Smith } 987e8d4e0b9SBarry Smith } 988ca15aa20SStefano Zampini /* hack to prevent unneeded copy to the GPU while returning the array */ 989ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA) 990c70f7ee4SJunchao Zhang oldf = A->offloadmask; 991c70f7ee4SJunchao Zhang A->offloadmask = PETSC_OFFLOAD_GPU; 992ca15aa20SStefano Zampini #endif 993ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&av);CHKERRQ(ierr); 994ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA) 995c70f7ee4SJunchao Zhang A->offloadmask = (oldf == PETSC_OFFLOAD_UNALLOCATED ? PETSC_OFFLOAD_UNALLOCATED : PETSC_OFFLOAD_CPU); 996ca15aa20SStefano Zampini #endif 9973a40ed3dSBarry Smith PetscFunctionReturn(0); 998289bc588SBarry Smith } 999e8d4e0b9SBarry Smith 1000e0877f53SBarry Smith static PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[]) 1001ae80bb75SLois Curfman McInnes { 1002ae80bb75SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1003ca15aa20SStefano Zampini const PetscScalar *vv; 100413f74950SBarry Smith PetscInt i,j; 1005ca15aa20SStefano Zampini PetscErrorCode ierr; 1006ae80bb75SLois Curfman McInnes 10073a40ed3dSBarry Smith PetscFunctionBegin; 1008ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&vv);CHKERRQ(ierr); 1009ae80bb75SLois Curfman McInnes /* row-oriented output */ 1010ae80bb75SLois Curfman McInnes for (i=0; i<m; i++) { 101197e567efSBarry Smith if (indexm[i] < 0) {v += n;continue;} 1012e32f2f54SBarry 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); 1013ae80bb75SLois Curfman McInnes for (j=0; j<n; j++) { 10146f31f424SBarry Smith if (indexn[j] < 0) {v++; continue;} 1015e32f2f54SBarry 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); 1016ca15aa20SStefano Zampini *v++ = vv[indexn[j]*mat->lda + indexm[i]]; 1017ae80bb75SLois Curfman McInnes } 1018ae80bb75SLois Curfman McInnes } 1019ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&vv);CHKERRQ(ierr); 10203a40ed3dSBarry Smith PetscFunctionReturn(0); 1021ae80bb75SLois Curfman McInnes } 1022ae80bb75SLois Curfman McInnes 1023289bc588SBarry Smith /* -----------------------------------------------------------------*/ 1024289bc588SBarry Smith 10258491ab44SLisandro Dalcin PetscErrorCode MatView_Dense_Binary(Mat mat,PetscViewer viewer) 1026aabbc4fbSShri Abhyankar { 1027aabbc4fbSShri Abhyankar PetscErrorCode ierr; 10288491ab44SLisandro Dalcin PetscBool skipHeader; 10298491ab44SLisandro Dalcin PetscViewerFormat format; 10308491ab44SLisandro Dalcin PetscInt header[4],M,N,m,lda,i,j,k; 10318491ab44SLisandro Dalcin const PetscScalar *v; 10328491ab44SLisandro Dalcin PetscScalar *vwork; 1033aabbc4fbSShri Abhyankar 1034aabbc4fbSShri Abhyankar PetscFunctionBegin; 10358491ab44SLisandro Dalcin ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr); 10368491ab44SLisandro Dalcin ierr = PetscViewerBinaryGetSkipHeader(viewer,&skipHeader);CHKERRQ(ierr); 10378491ab44SLisandro Dalcin ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 10388491ab44SLisandro Dalcin if (skipHeader) format = PETSC_VIEWER_NATIVE; 1039aabbc4fbSShri Abhyankar 10408491ab44SLisandro Dalcin ierr = MatGetSize(mat,&M,&N);CHKERRQ(ierr); 10418491ab44SLisandro Dalcin 10428491ab44SLisandro Dalcin /* write matrix header */ 10438491ab44SLisandro Dalcin header[0] = MAT_FILE_CLASSID; header[1] = M; header[2] = N; 10448491ab44SLisandro Dalcin header[3] = (format == PETSC_VIEWER_NATIVE) ? MATRIX_BINARY_FORMAT_DENSE : M*N; 10458491ab44SLisandro Dalcin if (!skipHeader) {ierr = PetscViewerBinaryWrite(viewer,header,4,PETSC_INT);CHKERRQ(ierr);} 10468491ab44SLisandro Dalcin 10478491ab44SLisandro Dalcin ierr = MatGetLocalSize(mat,&m,NULL);CHKERRQ(ierr); 10488491ab44SLisandro Dalcin if (format != PETSC_VIEWER_NATIVE) { 10498491ab44SLisandro Dalcin PetscInt nnz = m*N, *iwork; 10508491ab44SLisandro Dalcin /* store row lengths for each row */ 10518491ab44SLisandro Dalcin ierr = PetscMalloc1(nnz,&iwork);CHKERRQ(ierr); 10528491ab44SLisandro Dalcin for (i=0; i<m; i++) iwork[i] = N; 10538491ab44SLisandro Dalcin ierr = PetscViewerBinaryWriteAll(viewer,iwork,m,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_INT);CHKERRQ(ierr); 10548491ab44SLisandro Dalcin /* store column indices (zero start index) */ 10558491ab44SLisandro Dalcin for (k=0, i=0; i<m; i++) 10568491ab44SLisandro Dalcin for (j=0; j<N; j++, k++) 10578491ab44SLisandro Dalcin iwork[k] = j; 10588491ab44SLisandro Dalcin ierr = PetscViewerBinaryWriteAll(viewer,iwork,nnz,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_INT);CHKERRQ(ierr); 10598491ab44SLisandro Dalcin ierr = PetscFree(iwork);CHKERRQ(ierr); 10608491ab44SLisandro Dalcin } 10618491ab44SLisandro Dalcin /* store matrix values as a dense matrix in row major order */ 10628491ab44SLisandro Dalcin ierr = PetscMalloc1(m*N,&vwork);CHKERRQ(ierr); 10638491ab44SLisandro Dalcin ierr = MatDenseGetArrayRead(mat,&v);CHKERRQ(ierr); 10648491ab44SLisandro Dalcin ierr = MatDenseGetLDA(mat,&lda);CHKERRQ(ierr); 10658491ab44SLisandro Dalcin for (k=0, i=0; i<m; i++) 10668491ab44SLisandro Dalcin for (j=0; j<N; j++, k++) 10678491ab44SLisandro Dalcin vwork[k] = v[i+lda*j]; 10688491ab44SLisandro Dalcin ierr = MatDenseRestoreArrayRead(mat,&v);CHKERRQ(ierr); 10698491ab44SLisandro Dalcin ierr = PetscViewerBinaryWriteAll(viewer,vwork,m*N,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_SCALAR);CHKERRQ(ierr); 10708491ab44SLisandro Dalcin ierr = PetscFree(vwork);CHKERRQ(ierr); 10718491ab44SLisandro Dalcin PetscFunctionReturn(0); 10728491ab44SLisandro Dalcin } 10738491ab44SLisandro Dalcin 10748491ab44SLisandro Dalcin PetscErrorCode MatLoad_Dense_Binary(Mat mat,PetscViewer viewer) 10758491ab44SLisandro Dalcin { 10768491ab44SLisandro Dalcin PetscErrorCode ierr; 10778491ab44SLisandro Dalcin PetscBool skipHeader; 10788491ab44SLisandro Dalcin PetscInt header[4],M,N,m,nz,lda,i,j,k; 10798491ab44SLisandro Dalcin PetscInt rows,cols; 10808491ab44SLisandro Dalcin PetscScalar *v,*vwork; 10818491ab44SLisandro Dalcin 10828491ab44SLisandro Dalcin PetscFunctionBegin; 10838491ab44SLisandro Dalcin ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr); 10848491ab44SLisandro Dalcin ierr = PetscViewerBinaryGetSkipHeader(viewer,&skipHeader);CHKERRQ(ierr); 10858491ab44SLisandro Dalcin 10868491ab44SLisandro Dalcin if (!skipHeader) { 10878491ab44SLisandro Dalcin ierr = PetscViewerBinaryRead(viewer,header,4,NULL,PETSC_INT);CHKERRQ(ierr); 10888491ab44SLisandro Dalcin if (header[0] != MAT_FILE_CLASSID) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"Not a matrix object in file"); 10898491ab44SLisandro Dalcin M = header[1]; N = header[2]; 10908491ab44SLisandro Dalcin if (M < 0) SETERRQ1(PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"Matrix row size (%D) in file is negative",M); 10918491ab44SLisandro Dalcin if (N < 0) SETERRQ1(PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"Matrix column size (%D) in file is negative",N); 10928491ab44SLisandro Dalcin nz = header[3]; 10938491ab44SLisandro Dalcin if (nz != MATRIX_BINARY_FORMAT_DENSE && nz < 0) SETERRQ1(PetscObjectComm((PetscObject)viewer),PETSC_ERR_FILE_UNEXPECTED,"Unknown matrix format %D in file",nz); 1094aabbc4fbSShri Abhyankar } else { 10958491ab44SLisandro Dalcin ierr = MatGetSize(mat,&M,&N);CHKERRQ(ierr); 10968491ab44SLisandro 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"); 10978491ab44SLisandro Dalcin nz = MATRIX_BINARY_FORMAT_DENSE; 1098e6324fbbSBarry Smith } 1099aabbc4fbSShri Abhyankar 11008491ab44SLisandro Dalcin /* setup global sizes if not set */ 11018491ab44SLisandro Dalcin if (mat->rmap->N < 0) mat->rmap->N = M; 11028491ab44SLisandro Dalcin if (mat->cmap->N < 0) mat->cmap->N = N; 11038491ab44SLisandro Dalcin ierr = MatSetUp(mat);CHKERRQ(ierr); 11048491ab44SLisandro Dalcin /* check if global sizes are correct */ 11058491ab44SLisandro Dalcin ierr = MatGetSize(mat,&rows,&cols);CHKERRQ(ierr); 11068491ab44SLisandro 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); 1107aabbc4fbSShri Abhyankar 11088491ab44SLisandro Dalcin ierr = MatGetSize(mat,NULL,&N);CHKERRQ(ierr); 11098491ab44SLisandro Dalcin ierr = MatGetLocalSize(mat,&m,NULL);CHKERRQ(ierr); 11108491ab44SLisandro Dalcin ierr = MatDenseGetArray(mat,&v);CHKERRQ(ierr); 11118491ab44SLisandro Dalcin ierr = MatDenseGetLDA(mat,&lda);CHKERRQ(ierr); 11128491ab44SLisandro Dalcin if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense format */ 11138491ab44SLisandro Dalcin PetscInt nnz = m*N; 11148491ab44SLisandro Dalcin /* read in matrix values */ 11158491ab44SLisandro Dalcin ierr = PetscMalloc1(nnz,&vwork);CHKERRQ(ierr); 11168491ab44SLisandro Dalcin ierr = PetscViewerBinaryReadAll(viewer,vwork,nnz,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_SCALAR);CHKERRQ(ierr); 11178491ab44SLisandro Dalcin /* store values in column major order */ 11188491ab44SLisandro Dalcin for (j=0; j<N; j++) 11198491ab44SLisandro Dalcin for (i=0; i<m; i++) 11208491ab44SLisandro Dalcin v[i+lda*j] = vwork[i*N+j]; 11218491ab44SLisandro Dalcin ierr = PetscFree(vwork);CHKERRQ(ierr); 11228491ab44SLisandro Dalcin } else { /* matrix in file is sparse format */ 11238491ab44SLisandro Dalcin PetscInt nnz = 0, *rlens, *icols; 11248491ab44SLisandro Dalcin /* read in row lengths */ 11258491ab44SLisandro Dalcin ierr = PetscMalloc1(m,&rlens);CHKERRQ(ierr); 11268491ab44SLisandro Dalcin ierr = PetscViewerBinaryReadAll(viewer,rlens,m,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_INT);CHKERRQ(ierr); 11278491ab44SLisandro Dalcin for (i=0; i<m; i++) nnz += rlens[i]; 11288491ab44SLisandro Dalcin /* read in column indices and values */ 11298491ab44SLisandro Dalcin ierr = PetscMalloc2(nnz,&icols,nnz,&vwork);CHKERRQ(ierr); 11308491ab44SLisandro Dalcin ierr = PetscViewerBinaryReadAll(viewer,icols,nnz,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_INT);CHKERRQ(ierr); 11318491ab44SLisandro Dalcin ierr = PetscViewerBinaryReadAll(viewer,vwork,nnz,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_SCALAR);CHKERRQ(ierr); 11328491ab44SLisandro Dalcin /* store values in column major order */ 11338491ab44SLisandro Dalcin for (k=0, i=0; i<m; i++) 11348491ab44SLisandro Dalcin for (j=0; j<rlens[i]; j++, k++) 11358491ab44SLisandro Dalcin v[i+lda*icols[k]] = vwork[k]; 11368491ab44SLisandro Dalcin ierr = PetscFree(rlens);CHKERRQ(ierr); 11378491ab44SLisandro Dalcin ierr = PetscFree2(icols,vwork);CHKERRQ(ierr); 1138aabbc4fbSShri Abhyankar } 11398491ab44SLisandro Dalcin ierr = MatDenseRestoreArray(mat,&v);CHKERRQ(ierr); 11408491ab44SLisandro Dalcin ierr = MatAssemblyBegin(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 11418491ab44SLisandro Dalcin ierr = MatAssemblyEnd(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1142aabbc4fbSShri Abhyankar PetscFunctionReturn(0); 1143aabbc4fbSShri Abhyankar } 1144aabbc4fbSShri Abhyankar 1145eb91f321SVaclav Hapla PetscErrorCode MatLoad_SeqDense(Mat newMat, PetscViewer viewer) 1146eb91f321SVaclav Hapla { 1147eb91f321SVaclav Hapla PetscBool isbinary, ishdf5; 1148eb91f321SVaclav Hapla PetscErrorCode ierr; 1149eb91f321SVaclav Hapla 1150eb91f321SVaclav Hapla PetscFunctionBegin; 1151eb91f321SVaclav Hapla PetscValidHeaderSpecific(newMat,MAT_CLASSID,1); 1152eb91f321SVaclav Hapla PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 1153eb91f321SVaclav Hapla /* force binary viewer to load .info file if it has not yet done so */ 1154eb91f321SVaclav Hapla ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr); 1155eb91f321SVaclav Hapla ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 1156eb91f321SVaclav Hapla ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERHDF5, &ishdf5);CHKERRQ(ierr); 1157eb91f321SVaclav Hapla if (isbinary) { 11588491ab44SLisandro Dalcin ierr = MatLoad_Dense_Binary(newMat,viewer);CHKERRQ(ierr); 1159eb91f321SVaclav Hapla } else if (ishdf5) { 1160eb91f321SVaclav Hapla #if defined(PETSC_HAVE_HDF5) 1161eb91f321SVaclav Hapla ierr = MatLoad_Dense_HDF5(newMat,viewer);CHKERRQ(ierr); 1162eb91f321SVaclav Hapla #else 1163eb91f321SVaclav Hapla SETERRQ(PetscObjectComm((PetscObject)newMat),PETSC_ERR_SUP,"HDF5 not supported in this build.\nPlease reconfigure using --download-hdf5"); 1164eb91f321SVaclav Hapla #endif 1165eb91f321SVaclav Hapla } else { 1166eb91f321SVaclav 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); 1167eb91f321SVaclav Hapla } 1168eb91f321SVaclav Hapla PetscFunctionReturn(0); 1169eb91f321SVaclav Hapla } 1170eb91f321SVaclav Hapla 11716849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer) 1172289bc588SBarry Smith { 1173932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1174dfbe8321SBarry Smith PetscErrorCode ierr; 117513f74950SBarry Smith PetscInt i,j; 11762dcb1b2aSMatthew Knepley const char *name; 1177ca15aa20SStefano Zampini PetscScalar *v,*av; 1178f3ef73ceSBarry Smith PetscViewerFormat format; 11795f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX) 1180ace3abfcSBarry Smith PetscBool allreal = PETSC_TRUE; 11815f481a85SSatish Balay #endif 1182932b0c3eSLois Curfman McInnes 11833a40ed3dSBarry Smith PetscFunctionBegin; 1184ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,(const PetscScalar**)&av);CHKERRQ(ierr); 1185b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1186456192e2SBarry Smith if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 11873a40ed3dSBarry Smith PetscFunctionReturn(0); /* do nothing for now */ 1188fb9695e5SSatish Balay } else if (format == PETSC_VIEWER_ASCII_COMMON) { 1189d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 1190d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 1191ca15aa20SStefano Zampini v = av + i; 119277431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr); 1193d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1194aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 1195329f5518SBarry Smith if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) { 119657622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g + %g i) ",j,(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr); 1197329f5518SBarry Smith } else if (PetscRealPart(*v)) { 119857622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)PetscRealPart(*v));CHKERRQ(ierr); 11996831982aSBarry Smith } 120080cd9d93SLois Curfman McInnes #else 12016831982aSBarry Smith if (*v) { 120257622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)*v);CHKERRQ(ierr); 12036831982aSBarry Smith } 120480cd9d93SLois Curfman McInnes #endif 12051b807ce4Svictorle v += a->lda; 120680cd9d93SLois Curfman McInnes } 1207b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 120880cd9d93SLois Curfman McInnes } 1209d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 12103a40ed3dSBarry Smith } else { 1211d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 1212aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 121347989497SBarry Smith /* determine if matrix has all real values */ 1214ca15aa20SStefano Zampini v = av; 1215d0f46423SBarry Smith for (i=0; i<A->rmap->n*A->cmap->n; i++) { 1216ffac6cdbSBarry Smith if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break;} 121747989497SBarry Smith } 121847989497SBarry Smith #endif 1219fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 12203a7fca6bSBarry Smith ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr); 1221d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr); 1222d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 1223fb9695e5SSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr); 1224ffac6cdbSBarry Smith } 1225ffac6cdbSBarry Smith 1226d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 1227ca15aa20SStefano Zampini v = av + i; 1228d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1229aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 123047989497SBarry Smith if (allreal) { 1231c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr); 123247989497SBarry Smith } else { 1233c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr); 123447989497SBarry Smith } 1235289bc588SBarry Smith #else 1236c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr); 1237289bc588SBarry Smith #endif 12381b807ce4Svictorle v += a->lda; 1239289bc588SBarry Smith } 1240b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 1241289bc588SBarry Smith } 1242fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 1243b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr); 1244ffac6cdbSBarry Smith } 1245d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 1246da3a660dSBarry Smith } 1247ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,(const PetscScalar**)&av);CHKERRQ(ierr); 1248b0a32e0cSBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 12493a40ed3dSBarry Smith PetscFunctionReturn(0); 1250289bc588SBarry Smith } 1251289bc588SBarry Smith 12529804daf3SBarry Smith #include <petscdraw.h> 1253e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa) 1254f1af5d2fSBarry Smith { 1255f1af5d2fSBarry Smith Mat A = (Mat) Aa; 12566849ba73SBarry Smith PetscErrorCode ierr; 1257383922c3SLisandro Dalcin PetscInt m = A->rmap->n,n = A->cmap->n,i,j; 1258383922c3SLisandro Dalcin int color = PETSC_DRAW_WHITE; 1259ca15aa20SStefano Zampini const PetscScalar *v; 1260b0a32e0cSBarry Smith PetscViewer viewer; 1261b05fc000SLisandro Dalcin PetscReal xl,yl,xr,yr,x_l,x_r,y_l,y_r; 1262f3ef73ceSBarry Smith PetscViewerFormat format; 1263f1af5d2fSBarry Smith 1264f1af5d2fSBarry Smith PetscFunctionBegin; 1265f1af5d2fSBarry Smith ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr); 1266b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1267b0a32e0cSBarry Smith ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr); 1268f1af5d2fSBarry Smith 1269f1af5d2fSBarry Smith /* Loop over matrix elements drawing boxes */ 1270ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&v);CHKERRQ(ierr); 1271fb9695e5SSatish Balay if (format != PETSC_VIEWER_DRAW_CONTOUR) { 1272383922c3SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 1273f1af5d2fSBarry Smith /* Blue for negative and Red for positive */ 1274f1af5d2fSBarry Smith for (j = 0; j < n; j++) { 1275383922c3SLisandro Dalcin x_l = j; x_r = x_l + 1.0; 1276f1af5d2fSBarry Smith for (i = 0; i < m; i++) { 1277f1af5d2fSBarry Smith y_l = m - i - 1.0; 1278f1af5d2fSBarry Smith y_r = y_l + 1.0; 1279ca15aa20SStefano Zampini if (PetscRealPart(v[j*m+i]) > 0.) color = PETSC_DRAW_RED; 1280ca15aa20SStefano Zampini else if (PetscRealPart(v[j*m+i]) < 0.) color = PETSC_DRAW_BLUE; 1281ca15aa20SStefano Zampini else continue; 1282b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1283f1af5d2fSBarry Smith } 1284f1af5d2fSBarry Smith } 1285383922c3SLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 1286f1af5d2fSBarry Smith } else { 1287f1af5d2fSBarry Smith /* use contour shading to indicate magnitude of values */ 1288f1af5d2fSBarry Smith /* first determine max of all nonzero values */ 1289b05fc000SLisandro Dalcin PetscReal minv = 0.0, maxv = 0.0; 1290b05fc000SLisandro Dalcin PetscDraw popup; 1291b05fc000SLisandro Dalcin 1292f1af5d2fSBarry Smith for (i=0; i < m*n; i++) { 1293f1af5d2fSBarry Smith if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]); 1294f1af5d2fSBarry Smith } 1295383922c3SLisandro Dalcin if (minv >= maxv) maxv = minv + PETSC_SMALL; 1296b0a32e0cSBarry Smith ierr = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr); 129745f3bb6eSLisandro Dalcin ierr = PetscDrawScalePopup(popup,minv,maxv);CHKERRQ(ierr); 1298383922c3SLisandro Dalcin 1299383922c3SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 1300f1af5d2fSBarry Smith for (j=0; j<n; j++) { 1301f1af5d2fSBarry Smith x_l = j; 1302f1af5d2fSBarry Smith x_r = x_l + 1.0; 1303f1af5d2fSBarry Smith for (i=0; i<m; i++) { 1304f1af5d2fSBarry Smith y_l = m - i - 1.0; 1305f1af5d2fSBarry Smith y_r = y_l + 1.0; 1306b05fc000SLisandro Dalcin color = PetscDrawRealToColor(PetscAbsScalar(v[j*m+i]),minv,maxv); 1307b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1308f1af5d2fSBarry Smith } 1309f1af5d2fSBarry Smith } 1310383922c3SLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 1311f1af5d2fSBarry Smith } 1312ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&v);CHKERRQ(ierr); 1313f1af5d2fSBarry Smith PetscFunctionReturn(0); 1314f1af5d2fSBarry Smith } 1315f1af5d2fSBarry Smith 1316e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer) 1317f1af5d2fSBarry Smith { 1318b0a32e0cSBarry Smith PetscDraw draw; 1319ace3abfcSBarry Smith PetscBool isnull; 1320329f5518SBarry Smith PetscReal xr,yr,xl,yl,h,w; 1321dfbe8321SBarry Smith PetscErrorCode ierr; 1322f1af5d2fSBarry Smith 1323f1af5d2fSBarry Smith PetscFunctionBegin; 1324b0a32e0cSBarry Smith ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr); 1325b0a32e0cSBarry Smith ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 1326abc0a331SBarry Smith if (isnull) PetscFunctionReturn(0); 1327f1af5d2fSBarry Smith 1328d0f46423SBarry Smith xr = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0; 1329f1af5d2fSBarry Smith xr += w; yr += h; xl = -w; yl = -h; 1330b0a32e0cSBarry Smith ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr); 1331832b7cebSLisandro Dalcin ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr); 1332b0a32e0cSBarry Smith ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr); 13330298fd71SBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr); 1334832b7cebSLisandro Dalcin ierr = PetscDrawSave(draw);CHKERRQ(ierr); 1335f1af5d2fSBarry Smith PetscFunctionReturn(0); 1336f1af5d2fSBarry Smith } 1337f1af5d2fSBarry Smith 1338dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer) 1339932b0c3eSLois Curfman McInnes { 1340dfbe8321SBarry Smith PetscErrorCode ierr; 1341ace3abfcSBarry Smith PetscBool iascii,isbinary,isdraw; 1342932b0c3eSLois Curfman McInnes 13433a40ed3dSBarry Smith PetscFunctionBegin; 1344251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 1345251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 1346251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 13470f5bd95cSBarry Smith 1348c45a1595SBarry Smith if (iascii) { 1349c45a1595SBarry Smith ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr); 13500f5bd95cSBarry Smith } else if (isbinary) { 1351637a0070SStefano Zampini ierr = MatView_Dense_Binary(A,viewer);CHKERRQ(ierr); 1352f1af5d2fSBarry Smith } else if (isdraw) { 1353f1af5d2fSBarry Smith ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr); 1354932b0c3eSLois Curfman McInnes } 13553a40ed3dSBarry Smith PetscFunctionReturn(0); 1356932b0c3eSLois Curfman McInnes } 1357289bc588SBarry Smith 1358637a0070SStefano Zampini static PetscErrorCode MatDensePlaceArray_SeqDense(Mat A,const PetscScalar *array) 1359d3042a70SBarry Smith { 1360d3042a70SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1361d3042a70SBarry Smith 1362d3042a70SBarry Smith PetscFunctionBegin; 13636947451fSStefano Zampini if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec first"); 1364*d5ea218eSStefano Zampini if (a->unplacedarray) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreArray first"); 1365d3042a70SBarry Smith a->unplacedarray = a->v; 1366d3042a70SBarry Smith a->unplaced_user_alloc = a->user_alloc; 1367d3042a70SBarry Smith a->v = (PetscScalar*) array; 1368637a0070SStefano Zampini a->user_alloc = PETSC_TRUE; 1369ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA) 1370c70f7ee4SJunchao Zhang A->offloadmask = PETSC_OFFLOAD_CPU; 1371ca15aa20SStefano Zampini #endif 1372d3042a70SBarry Smith PetscFunctionReturn(0); 1373d3042a70SBarry Smith } 1374d3042a70SBarry Smith 1375d3042a70SBarry Smith static PetscErrorCode MatDenseResetArray_SeqDense(Mat A) 1376d3042a70SBarry Smith { 1377d3042a70SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1378d3042a70SBarry Smith 1379d3042a70SBarry Smith PetscFunctionBegin; 13806947451fSStefano Zampini if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec first"); 1381d3042a70SBarry Smith a->v = a->unplacedarray; 1382d3042a70SBarry Smith a->user_alloc = a->unplaced_user_alloc; 1383d3042a70SBarry Smith a->unplacedarray = NULL; 1384ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA) 1385c70f7ee4SJunchao Zhang A->offloadmask = PETSC_OFFLOAD_CPU; 1386ca15aa20SStefano Zampini #endif 1387d3042a70SBarry Smith PetscFunctionReturn(0); 1388d3042a70SBarry Smith } 1389d3042a70SBarry Smith 1390*d5ea218eSStefano Zampini static PetscErrorCode MatDenseReplaceArray_SeqDense(Mat A,const PetscScalar *array) 1391*d5ea218eSStefano Zampini { 1392*d5ea218eSStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1393*d5ea218eSStefano Zampini PetscErrorCode ierr; 1394*d5ea218eSStefano Zampini 1395*d5ea218eSStefano Zampini PetscFunctionBegin; 1396*d5ea218eSStefano Zampini if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec first"); 1397*d5ea218eSStefano Zampini if (!a->user_alloc) { ierr = PetscFree(a->v);CHKERRQ(ierr); } 1398*d5ea218eSStefano Zampini a->v = (PetscScalar*) array; 1399*d5ea218eSStefano Zampini a->user_alloc = PETSC_FALSE; 1400*d5ea218eSStefano Zampini #if defined(PETSC_HAVE_CUDA) 1401*d5ea218eSStefano Zampini A->offloadmask = PETSC_OFFLOAD_CPU; 1402*d5ea218eSStefano Zampini #endif 1403*d5ea218eSStefano Zampini PetscFunctionReturn(0); 1404*d5ea218eSStefano Zampini } 1405*d5ea218eSStefano Zampini 1406ca15aa20SStefano Zampini PetscErrorCode MatDestroy_SeqDense(Mat mat) 1407289bc588SBarry Smith { 1408ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)mat->data; 1409dfbe8321SBarry Smith PetscErrorCode ierr; 141090f02eecSBarry Smith 14113a40ed3dSBarry Smith PetscFunctionBegin; 1412aa482453SBarry Smith #if defined(PETSC_USE_LOG) 1413d0f46423SBarry Smith PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n); 1414a5a9c739SBarry Smith #endif 141505b42c5fSBarry Smith ierr = PetscFree(l->pivots);CHKERRQ(ierr); 1416a49dc2a2SStefano Zampini ierr = PetscFree(l->fwork);CHKERRQ(ierr); 1417abc3b08eSStefano Zampini ierr = MatDestroy(&l->ptapwork);CHKERRQ(ierr); 14186857c123SSatish Balay if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);} 1419637a0070SStefano Zampini if (!l->unplaced_user_alloc) {ierr = PetscFree(l->unplacedarray);CHKERRQ(ierr);} 14206947451fSStefano Zampini ierr = VecDestroy(&l->cvec);CHKERRQ(ierr); 1421bf0cc555SLisandro Dalcin ierr = PetscFree(mat->data);CHKERRQ(ierr); 1422dbd8c25aSHong Zhang 1423dbd8c25aSHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr); 142449a6ff4bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetLDA_C",NULL);CHKERRQ(ierr); 1425bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL);CHKERRQ(ierr); 142652c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL);CHKERRQ(ierr); 1427d3042a70SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDensePlaceArray_C",NULL);CHKERRQ(ierr); 1428d3042a70SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseResetArray_C",NULL);CHKERRQ(ierr); 1429*d5ea218eSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseReplaceArray_C",NULL);CHKERRQ(ierr); 143052c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArrayRead_C",NULL);CHKERRQ(ierr); 143152c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArrayRead_C",NULL);CHKERRQ(ierr); 14326947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArrayWrite_C",NULL);CHKERRQ(ierr); 14336947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArrayWrite_C",NULL);CHKERRQ(ierr); 14348baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL);CHKERRQ(ierr); 14358baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 14368baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL);CHKERRQ(ierr); 14378baccfbdSHong Zhang #endif 14382bf066beSStefano Zampini #if defined(PETSC_HAVE_CUDA) 14392bf066beSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqdensecuda_C",NULL);CHKERRQ(ierr); 14404222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqdensecuda_seqdensecuda_C",NULL);CHKERRQ(ierr); 14414222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqdensecuda_seqdense_C",NULL);CHKERRQ(ierr); 14424222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqaijcusparse_seqdense_C",NULL);CHKERRQ(ierr); 14432bf066beSStefano Zampini #endif 1444bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL);CHKERRQ(ierr); 14454222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 14464222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqdense_seqdense_C",NULL);CHKERRQ(ierr); 1447bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1448bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 14494222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqbaij_seqdense_C",NULL);CHKERRQ(ierr); 1450a001520aSPierre Jolivet ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqbaij_seqdense_C",NULL);CHKERRQ(ierr); 1451a001520aSPierre Jolivet ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqbaij_seqdense_C",NULL);CHKERRQ(ierr); 14524222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatProductSetFromOptions_seqsbaij_seqdense_C",NULL);CHKERRQ(ierr); 1453c2916339SPierre Jolivet ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqsbaij_seqdense_C",NULL);CHKERRQ(ierr); 1454c2916339SPierre Jolivet ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqsbaij_seqdense_C",NULL);CHKERRQ(ierr); 145552c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaijperm_seqdense_C",NULL);CHKERRQ(ierr); 145652c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaijperm_seqdense_C",NULL);CHKERRQ(ierr); 145752c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaijsell_seqdense_C",NULL);CHKERRQ(ierr); 145852c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaijsell_seqdense_C",NULL);CHKERRQ(ierr); 145952c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaijmkl_seqdense_C",NULL);CHKERRQ(ierr); 146052c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaijmkl_seqdense_C",NULL);CHKERRQ(ierr); 146152c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_nest_seqdense_C",NULL);CHKERRQ(ierr); 146252c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_nest_seqdense_C",NULL);CHKERRQ(ierr); 146352c5f739Sprj- 14643bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 14653bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 146652c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaijperm_seqdense_C",NULL);CHKERRQ(ierr); 146752c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaijperm_seqdense_C",NULL);CHKERRQ(ierr); 146852c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaijsell_seqdense_C",NULL);CHKERRQ(ierr); 146952c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaijsell_seqdense_C",NULL);CHKERRQ(ierr); 147052c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaijmkl_seqdense_C",NULL);CHKERRQ(ierr); 147152c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaijmkl_seqdense_C",NULL);CHKERRQ(ierr); 147286aefd0dSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumn_C",NULL);CHKERRQ(ierr); 147386aefd0dSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumn_C",NULL);CHKERRQ(ierr); 14746947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumnVec_C",NULL);CHKERRQ(ierr); 14756947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumnVec_C",NULL);CHKERRQ(ierr); 14766947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumnVecRead_C",NULL);CHKERRQ(ierr); 14776947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumnVecRead_C",NULL);CHKERRQ(ierr); 14786947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumnVecWrite_C",NULL);CHKERRQ(ierr); 14796947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumnVecWrite_C",NULL);CHKERRQ(ierr); 14803a40ed3dSBarry Smith PetscFunctionReturn(0); 1481289bc588SBarry Smith } 1482289bc588SBarry Smith 1483e0877f53SBarry Smith static PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout) 1484289bc588SBarry Smith { 1485c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 14866849ba73SBarry Smith PetscErrorCode ierr; 148713f74950SBarry Smith PetscInt k,j,m,n,M; 148887828ca2SBarry Smith PetscScalar *v,tmp; 148948b35521SBarry Smith 14903a40ed3dSBarry Smith PetscFunctionBegin; 1491ca15aa20SStefano Zampini m = A->rmap->n; M = mat->lda; n = A->cmap->n; 14922847e3fdSStefano Zampini if (reuse == MAT_INPLACE_MATRIX && m == n) { /* in place transpose */ 1493ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr); 1494d3e5ee88SLois Curfman McInnes for (j=0; j<m; j++) { 1495289bc588SBarry Smith for (k=0; k<j; k++) { 14961b807ce4Svictorle tmp = v[j + k*M]; 14971b807ce4Svictorle v[j + k*M] = v[k + j*M]; 14981b807ce4Svictorle v[k + j*M] = tmp; 1499289bc588SBarry Smith } 1500289bc588SBarry Smith } 1501ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr); 15023a40ed3dSBarry Smith } else { /* out-of-place transpose */ 1503d3e5ee88SLois Curfman McInnes Mat tmat; 1504ec8511deSBarry Smith Mat_SeqDense *tmatd; 150587828ca2SBarry Smith PetscScalar *v2; 1506af36a384SStefano Zampini PetscInt M2; 1507ea709b57SSatish Balay 15082847e3fdSStefano Zampini if (reuse != MAT_REUSE_MATRIX) { 1509ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr); 1510d0f46423SBarry Smith ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr); 15117adad957SLisandro Dalcin ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 15120298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr); 1513ca15aa20SStefano Zampini } else tmat = *matout; 1514ca15aa20SStefano Zampini 1515ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,(const PetscScalar**)&v);CHKERRQ(ierr); 1516ca15aa20SStefano Zampini ierr = MatDenseGetArray(tmat,&v2);CHKERRQ(ierr); 1517ec8511deSBarry Smith tmatd = (Mat_SeqDense*)tmat->data; 1518ca15aa20SStefano Zampini M2 = tmatd->lda; 1519d3e5ee88SLois Curfman McInnes for (j=0; j<n; j++) { 1520af36a384SStefano Zampini for (k=0; k<m; k++) v2[j + k*M2] = v[k + j*M]; 1521d3e5ee88SLois Curfman McInnes } 1522ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(tmat,&v2);CHKERRQ(ierr); 1523ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,(const PetscScalar**)&v);CHKERRQ(ierr); 15246d4a8577SBarry Smith ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 15256d4a8577SBarry Smith ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 15262847e3fdSStefano Zampini if (reuse == MAT_INITIAL_MATRIX || reuse == MAT_REUSE_MATRIX) *matout = tmat; 15272847e3fdSStefano Zampini else { 15282847e3fdSStefano Zampini ierr = MatHeaderMerge(A,&tmat);CHKERRQ(ierr); 15292847e3fdSStefano Zampini } 153048b35521SBarry Smith } 15313a40ed3dSBarry Smith PetscFunctionReturn(0); 1532289bc588SBarry Smith } 1533289bc588SBarry Smith 1534e0877f53SBarry Smith static PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool *flg) 1535289bc588SBarry Smith { 1536c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data; 1537c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data; 1538ca15aa20SStefano Zampini PetscInt i; 1539ca15aa20SStefano Zampini const PetscScalar *v1,*v2; 1540ca15aa20SStefano Zampini PetscErrorCode ierr; 15419ea5d5aeSSatish Balay 15423a40ed3dSBarry Smith PetscFunctionBegin; 1543d0f46423SBarry Smith if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1544d0f46423SBarry Smith if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1545ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A1,&v1);CHKERRQ(ierr); 1546ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A2,&v2);CHKERRQ(ierr); 1547ca15aa20SStefano Zampini for (i=0; i<A1->cmap->n; i++) { 1548ca15aa20SStefano Zampini ierr = PetscArraycmp(v1,v2,A1->rmap->n,flg);CHKERRQ(ierr); 1549ca15aa20SStefano Zampini if (*flg == PETSC_FALSE) PetscFunctionReturn(0); 1550ca15aa20SStefano Zampini v1 += mat1->lda; 1551ca15aa20SStefano Zampini v2 += mat2->lda; 15521b807ce4Svictorle } 1553ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A1,&v1);CHKERRQ(ierr); 1554ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A2,&v2);CHKERRQ(ierr); 155577c4ece6SBarry Smith *flg = PETSC_TRUE; 15563a40ed3dSBarry Smith PetscFunctionReturn(0); 1557289bc588SBarry Smith } 1558289bc588SBarry Smith 1559e0877f53SBarry Smith static PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v) 1560289bc588SBarry Smith { 1561c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 156213f74950SBarry Smith PetscInt i,n,len; 1563ca15aa20SStefano Zampini PetscScalar *x; 1564ca15aa20SStefano Zampini const PetscScalar *vv; 1565ca15aa20SStefano Zampini PetscErrorCode ierr; 156644cd7ae7SLois Curfman McInnes 15673a40ed3dSBarry Smith PetscFunctionBegin; 15687a97a34bSBarry Smith ierr = VecGetSize(v,&n);CHKERRQ(ierr); 15691ebc52fbSHong Zhang ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1570d0f46423SBarry Smith len = PetscMin(A->rmap->n,A->cmap->n); 1571ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&vv);CHKERRQ(ierr); 1572e32f2f54SBarry Smith if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec"); 157344cd7ae7SLois Curfman McInnes for (i=0; i<len; i++) { 1574ca15aa20SStefano Zampini x[i] = vv[i*mat->lda + i]; 1575289bc588SBarry Smith } 1576ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&vv);CHKERRQ(ierr); 15771ebc52fbSHong Zhang ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 15783a40ed3dSBarry Smith PetscFunctionReturn(0); 1579289bc588SBarry Smith } 1580289bc588SBarry Smith 1581e0877f53SBarry Smith static PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr) 1582289bc588SBarry Smith { 1583c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1584f1ceaac6SMatthew G. Knepley const PetscScalar *l,*r; 1585ca15aa20SStefano Zampini PetscScalar x,*v,*vv; 1586dfbe8321SBarry Smith PetscErrorCode ierr; 1587d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n; 158855659b69SBarry Smith 15893a40ed3dSBarry Smith PetscFunctionBegin; 1590ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&vv);CHKERRQ(ierr); 159128988994SBarry Smith if (ll) { 15927a97a34bSBarry Smith ierr = VecGetSize(ll,&m);CHKERRQ(ierr); 1593f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(ll,&l);CHKERRQ(ierr); 1594e32f2f54SBarry Smith if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size"); 1595da3a660dSBarry Smith for (i=0; i<m; i++) { 1596da3a660dSBarry Smith x = l[i]; 1597ca15aa20SStefano Zampini v = vv + i; 1598b43bac26SStefano Zampini for (j=0; j<n; j++) { (*v) *= x; v+= mat->lda;} 1599da3a660dSBarry Smith } 1600f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(ll,&l);CHKERRQ(ierr); 1601eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr); 1602da3a660dSBarry Smith } 160328988994SBarry Smith if (rr) { 16047a97a34bSBarry Smith ierr = VecGetSize(rr,&n);CHKERRQ(ierr); 1605f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(rr,&r);CHKERRQ(ierr); 1606e32f2f54SBarry Smith if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size"); 1607da3a660dSBarry Smith for (i=0; i<n; i++) { 1608da3a660dSBarry Smith x = r[i]; 1609ca15aa20SStefano Zampini v = vv + i*mat->lda; 16102205254eSKarl Rupp for (j=0; j<m; j++) (*v++) *= x; 1611da3a660dSBarry Smith } 1612f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(rr,&r);CHKERRQ(ierr); 1613eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr); 1614da3a660dSBarry Smith } 1615ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&vv);CHKERRQ(ierr); 16163a40ed3dSBarry Smith PetscFunctionReturn(0); 1617289bc588SBarry Smith } 1618289bc588SBarry Smith 1619ca15aa20SStefano Zampini PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm) 1620289bc588SBarry Smith { 1621c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1622ca15aa20SStefano Zampini PetscScalar *v,*vv; 1623329f5518SBarry Smith PetscReal sum = 0.0; 1624d0f46423SBarry Smith PetscInt lda =mat->lda,m=A->rmap->n,i,j; 1625efee365bSSatish Balay PetscErrorCode ierr; 162655659b69SBarry Smith 16273a40ed3dSBarry Smith PetscFunctionBegin; 1628ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,(const PetscScalar**)&vv);CHKERRQ(ierr); 1629ca15aa20SStefano Zampini v = vv; 1630289bc588SBarry Smith if (type == NORM_FROBENIUS) { 1631a5ce6ee0Svictorle if (lda>m) { 1632d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1633ca15aa20SStefano Zampini v = vv+j*lda; 1634a5ce6ee0Svictorle for (i=0; i<m; i++) { 1635a5ce6ee0Svictorle sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1636a5ce6ee0Svictorle } 1637a5ce6ee0Svictorle } 1638a5ce6ee0Svictorle } else { 1639570b7f6dSBarry Smith #if defined(PETSC_USE_REAL___FP16) 1640570b7f6dSBarry Smith PetscBLASInt one = 1,cnt = A->cmap->n*A->rmap->n; 1641570b7f6dSBarry Smith *nrm = BLASnrm2_(&cnt,v,&one); 1642570b7f6dSBarry Smith } 1643570b7f6dSBarry Smith #else 1644d0f46423SBarry Smith for (i=0; i<A->cmap->n*A->rmap->n; i++) { 1645329f5518SBarry Smith sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1646289bc588SBarry Smith } 1647a5ce6ee0Svictorle } 16488f1a2a5eSBarry Smith *nrm = PetscSqrtReal(sum); 1649570b7f6dSBarry Smith #endif 1650dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 16513a40ed3dSBarry Smith } else if (type == NORM_1) { 1652064f8208SBarry Smith *nrm = 0.0; 1653d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1654ca15aa20SStefano Zampini v = vv + j*mat->lda; 1655289bc588SBarry Smith sum = 0.0; 1656d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 165733a8263dSBarry Smith sum += PetscAbsScalar(*v); v++; 1658289bc588SBarry Smith } 1659064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1660289bc588SBarry Smith } 1661eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 16623a40ed3dSBarry Smith } else if (type == NORM_INFINITY) { 1663064f8208SBarry Smith *nrm = 0.0; 1664d0f46423SBarry Smith for (j=0; j<A->rmap->n; j++) { 1665ca15aa20SStefano Zampini v = vv + j; 1666289bc588SBarry Smith sum = 0.0; 1667d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) { 16681b807ce4Svictorle sum += PetscAbsScalar(*v); v += mat->lda; 1669289bc588SBarry Smith } 1670064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1671289bc588SBarry Smith } 1672eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 1673e7e72b3dSBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm"); 1674ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,(const PetscScalar**)&vv);CHKERRQ(ierr); 16753a40ed3dSBarry Smith PetscFunctionReturn(0); 1676289bc588SBarry Smith } 1677289bc588SBarry Smith 1678e0877f53SBarry Smith static PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg) 1679289bc588SBarry Smith { 1680c0bbcb79SLois Curfman McInnes Mat_SeqDense *aij = (Mat_SeqDense*)A->data; 168163ba0a88SBarry Smith PetscErrorCode ierr; 168267e560aaSBarry Smith 16833a40ed3dSBarry Smith PetscFunctionBegin; 1684b5a2b587SKris Buschelman switch (op) { 1685b5a2b587SKris Buschelman case MAT_ROW_ORIENTED: 16864e0d8c25SBarry Smith aij->roworiented = flg; 1687b5a2b587SKris Buschelman break; 1688512a5fc5SBarry Smith case MAT_NEW_NONZERO_LOCATIONS: 1689b5a2b587SKris Buschelman case MAT_NEW_NONZERO_LOCATION_ERR: 16903971808eSMatthew Knepley case MAT_NEW_NONZERO_ALLOCATION_ERR: 16914e0d8c25SBarry Smith case MAT_NEW_DIAGONALS: 169213fa8e87SLisandro Dalcin case MAT_KEEP_NONZERO_PATTERN: 1693b5a2b587SKris Buschelman case MAT_IGNORE_OFF_PROC_ENTRIES: 1694b5a2b587SKris Buschelman case MAT_USE_HASH_TABLE: 16950f8fb01aSBarry Smith case MAT_IGNORE_ZERO_ENTRIES: 16965021d80fSJed Brown case MAT_IGNORE_LOWER_TRIANGULAR: 1697071fcb05SBarry Smith case MAT_SORTED_FULL: 16985021d80fSJed Brown ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr); 16995021d80fSJed Brown break; 17005021d80fSJed Brown case MAT_SPD: 170177e54ba9SKris Buschelman case MAT_SYMMETRIC: 170277e54ba9SKris Buschelman case MAT_STRUCTURALLY_SYMMETRIC: 17039a4540c5SBarry Smith case MAT_HERMITIAN: 17049a4540c5SBarry Smith case MAT_SYMMETRY_ETERNAL: 17055021d80fSJed Brown /* These options are handled directly by MatSetOption() */ 170677e54ba9SKris Buschelman break; 1707b5a2b587SKris Buschelman default: 1708e32f2f54SBarry Smith SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]); 17093a40ed3dSBarry Smith } 17103a40ed3dSBarry Smith PetscFunctionReturn(0); 1711289bc588SBarry Smith } 1712289bc588SBarry Smith 1713e0877f53SBarry Smith static PetscErrorCode MatZeroEntries_SeqDense(Mat A) 17146f0a148fSBarry Smith { 1715ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 17166849ba73SBarry Smith PetscErrorCode ierr; 1717d0f46423SBarry Smith PetscInt lda=l->lda,m=A->rmap->n,j; 1718ca15aa20SStefano Zampini PetscScalar *v; 17193a40ed3dSBarry Smith 17203a40ed3dSBarry Smith PetscFunctionBegin; 1721ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr); 1722a5ce6ee0Svictorle if (lda>m) { 1723d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1724ca15aa20SStefano Zampini ierr = PetscArrayzero(v+j*lda,m);CHKERRQ(ierr); 1725a5ce6ee0Svictorle } 1726a5ce6ee0Svictorle } else { 1727ca15aa20SStefano Zampini ierr = PetscArrayzero(v,A->rmap->n*A->cmap->n);CHKERRQ(ierr); 1728a5ce6ee0Svictorle } 1729ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr); 17303a40ed3dSBarry Smith PetscFunctionReturn(0); 17316f0a148fSBarry Smith } 17326f0a148fSBarry Smith 1733e0877f53SBarry Smith static PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b) 17346f0a148fSBarry Smith { 173597b48c8fSBarry Smith PetscErrorCode ierr; 1736ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 1737b9679d65SBarry Smith PetscInt m = l->lda, n = A->cmap->n, i,j; 1738ca15aa20SStefano Zampini PetscScalar *slot,*bb,*v; 173997b48c8fSBarry Smith const PetscScalar *xx; 174055659b69SBarry Smith 17413a40ed3dSBarry Smith PetscFunctionBegin; 174276bd3646SJed Brown if (PetscDefined(USE_DEBUG)) { 1743b9679d65SBarry Smith for (i=0; i<N; i++) { 1744b9679d65SBarry Smith if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed"); 1745b9679d65SBarry 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); 1746b9679d65SBarry Smith } 174776bd3646SJed Brown } 1748ca15aa20SStefano Zampini if (!N) PetscFunctionReturn(0); 1749b9679d65SBarry Smith 175097b48c8fSBarry Smith /* fix right hand side if needed */ 175197b48c8fSBarry Smith if (x && b) { 175297b48c8fSBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 175397b48c8fSBarry Smith ierr = VecGetArray(b,&bb);CHKERRQ(ierr); 17542205254eSKarl Rupp for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]]; 175597b48c8fSBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 175697b48c8fSBarry Smith ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr); 175797b48c8fSBarry Smith } 175897b48c8fSBarry Smith 1759ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr); 17606f0a148fSBarry Smith for (i=0; i<N; i++) { 1761ca15aa20SStefano Zampini slot = v + rows[i]; 1762b9679d65SBarry Smith for (j=0; j<n; j++) { *slot = 0.0; slot += m;} 17636f0a148fSBarry Smith } 1764f4df32b1SMatthew Knepley if (diag != 0.0) { 1765b9679d65SBarry Smith if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 17666f0a148fSBarry Smith for (i=0; i<N; i++) { 1767ca15aa20SStefano Zampini slot = v + (m+1)*rows[i]; 1768f4df32b1SMatthew Knepley *slot = diag; 17696f0a148fSBarry Smith } 17706f0a148fSBarry Smith } 1771ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr); 17723a40ed3dSBarry Smith PetscFunctionReturn(0); 17736f0a148fSBarry Smith } 1774557bce09SLois Curfman McInnes 177549a6ff4bSBarry Smith static PetscErrorCode MatDenseGetLDA_SeqDense(Mat A,PetscInt *lda) 177649a6ff4bSBarry Smith { 177749a6ff4bSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 177849a6ff4bSBarry Smith 177949a6ff4bSBarry Smith PetscFunctionBegin; 178049a6ff4bSBarry Smith *lda = mat->lda; 178149a6ff4bSBarry Smith PetscFunctionReturn(0); 178249a6ff4bSBarry Smith } 178349a6ff4bSBarry Smith 1784637a0070SStefano Zampini PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar **array) 178564e87e97SBarry Smith { 1786c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 17873a40ed3dSBarry Smith 17883a40ed3dSBarry Smith PetscFunctionBegin; 178964e87e97SBarry Smith *array = mat->v; 17903a40ed3dSBarry Smith PetscFunctionReturn(0); 179164e87e97SBarry Smith } 17920754003eSLois Curfman McInnes 1793637a0070SStefano Zampini PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar **array) 1794ff14e315SSatish Balay { 17953a40ed3dSBarry Smith PetscFunctionBegin; 1796637a0070SStefano Zampini *array = NULL; 17973a40ed3dSBarry Smith PetscFunctionReturn(0); 1798ff14e315SSatish Balay } 17990754003eSLois Curfman McInnes 1800dec5eb66SMatthew G Knepley /*@C 180149a6ff4bSBarry Smith MatDenseGetLDA - gets the leading dimension of the array returned from MatDenseGetArray() 180249a6ff4bSBarry Smith 180349a6ff4bSBarry Smith Logically Collective on Mat 180449a6ff4bSBarry Smith 180549a6ff4bSBarry Smith Input Parameter: 180649a6ff4bSBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 180749a6ff4bSBarry Smith 180849a6ff4bSBarry Smith Output Parameter: 180949a6ff4bSBarry Smith . lda - the leading dimension 181049a6ff4bSBarry Smith 181149a6ff4bSBarry Smith Level: intermediate 181249a6ff4bSBarry Smith 181349a6ff4bSBarry Smith .seealso: MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead(), MatSeqDenseSetLDA() 181449a6ff4bSBarry Smith @*/ 181549a6ff4bSBarry Smith PetscErrorCode MatDenseGetLDA(Mat A,PetscInt *lda) 181649a6ff4bSBarry Smith { 181749a6ff4bSBarry Smith PetscErrorCode ierr; 181849a6ff4bSBarry Smith 181949a6ff4bSBarry Smith PetscFunctionBegin; 1820*d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 1821*d5ea218eSStefano Zampini PetscValidPointer(lda,2); 182249a6ff4bSBarry Smith ierr = PetscUseMethod(A,"MatDenseGetLDA_C",(Mat,PetscInt*),(A,lda));CHKERRQ(ierr); 182349a6ff4bSBarry Smith PetscFunctionReturn(0); 182449a6ff4bSBarry Smith } 182549a6ff4bSBarry Smith 182649a6ff4bSBarry Smith /*@C 18276947451fSStefano Zampini MatDenseGetArray - gives read-write access to the array where the data for a dense matrix is stored 182873a71a0fSBarry Smith 18298572280aSBarry Smith Logically Collective on Mat 183073a71a0fSBarry Smith 183173a71a0fSBarry Smith Input Parameter: 18326947451fSStefano Zampini . mat - a dense matrix 183373a71a0fSBarry Smith 183473a71a0fSBarry Smith Output Parameter: 183573a71a0fSBarry Smith . array - pointer to the data 183673a71a0fSBarry Smith 183773a71a0fSBarry Smith Level: intermediate 183873a71a0fSBarry Smith 18396947451fSStefano Zampini .seealso: MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead(), MatDenseGetArrayWrite(), MatDenseRestoreArrayWrite() 184073a71a0fSBarry Smith @*/ 18418c778c55SBarry Smith PetscErrorCode MatDenseGetArray(Mat A,PetscScalar **array) 184273a71a0fSBarry Smith { 184373a71a0fSBarry Smith PetscErrorCode ierr; 184473a71a0fSBarry Smith 184573a71a0fSBarry Smith PetscFunctionBegin; 1846*d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 1847*d5ea218eSStefano Zampini PetscValidPointer(array,2); 18488c778c55SBarry Smith ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 184973a71a0fSBarry Smith PetscFunctionReturn(0); 185073a71a0fSBarry Smith } 185173a71a0fSBarry Smith 1852dec5eb66SMatthew G Knepley /*@C 1853579dbff0SBarry Smith MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray() 185473a71a0fSBarry Smith 18558572280aSBarry Smith Logically Collective on Mat 18568572280aSBarry Smith 18578572280aSBarry Smith Input Parameters: 18586947451fSStefano Zampini + mat - a dense matrix 1859a2b725a8SWilliam Gropp - array - pointer to the data 18608572280aSBarry Smith 18618572280aSBarry Smith Level: intermediate 18628572280aSBarry Smith 18636947451fSStefano Zampini .seealso: MatDenseGetArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead(), MatDenseGetArrayWrite(), MatDenseRestoreArrayWrite() 18648572280aSBarry Smith @*/ 18658572280aSBarry Smith PetscErrorCode MatDenseRestoreArray(Mat A,PetscScalar **array) 18668572280aSBarry Smith { 18678572280aSBarry Smith PetscErrorCode ierr; 18688572280aSBarry Smith 18698572280aSBarry Smith PetscFunctionBegin; 1870*d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 1871*d5ea218eSStefano Zampini PetscValidPointer(array,2); 18728572280aSBarry Smith ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 18738572280aSBarry Smith ierr = PetscObjectStateIncrease((PetscObject)A);CHKERRQ(ierr); 1874637a0070SStefano Zampini #if defined(PETSC_HAVE_CUDA) 1875637a0070SStefano Zampini A->offloadmask = PETSC_OFFLOAD_CPU; 1876637a0070SStefano Zampini #endif 18778572280aSBarry Smith PetscFunctionReturn(0); 18788572280aSBarry Smith } 18798572280aSBarry Smith 18808572280aSBarry Smith /*@C 18816947451fSStefano Zampini MatDenseGetArrayRead - gives read-only access to the array where the data for a dense matrix is stored 18828572280aSBarry Smith 18838572280aSBarry Smith Not Collective 18848572280aSBarry Smith 18858572280aSBarry Smith Input Parameter: 18866947451fSStefano Zampini . mat - a dense matrix 18878572280aSBarry Smith 18888572280aSBarry Smith Output Parameter: 18898572280aSBarry Smith . array - pointer to the data 18908572280aSBarry Smith 18918572280aSBarry Smith Level: intermediate 18928572280aSBarry Smith 18936947451fSStefano Zampini .seealso: MatDenseRestoreArrayRead(), MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayWrite(), MatDenseRestoreArrayWrite() 18948572280aSBarry Smith @*/ 18958572280aSBarry Smith PetscErrorCode MatDenseGetArrayRead(Mat A,const PetscScalar **array) 18968572280aSBarry Smith { 18978572280aSBarry Smith PetscErrorCode ierr; 18988572280aSBarry Smith 18998572280aSBarry Smith PetscFunctionBegin; 1900*d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 1901*d5ea218eSStefano Zampini PetscValidPointer(array,2); 19028572280aSBarry Smith ierr = PetscUseMethod(A,"MatDenseGetArrayRead_C",(Mat,const PetscScalar**),(A,array));CHKERRQ(ierr); 19038572280aSBarry Smith PetscFunctionReturn(0); 19048572280aSBarry Smith } 19058572280aSBarry Smith 19068572280aSBarry Smith /*@C 19076947451fSStefano Zampini MatDenseRestoreArrayRead - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArrayRead() 19088572280aSBarry Smith 190973a71a0fSBarry Smith Not Collective 191073a71a0fSBarry Smith 191173a71a0fSBarry Smith Input Parameters: 19126947451fSStefano Zampini + mat - a dense matrix 1913a2b725a8SWilliam Gropp - array - pointer to the data 191473a71a0fSBarry Smith 191573a71a0fSBarry Smith Level: intermediate 191673a71a0fSBarry Smith 19176947451fSStefano Zampini .seealso: MatDenseGetArrayRead(), MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayWrite(), MatDenseRestoreArrayWrite() 191873a71a0fSBarry Smith @*/ 19198572280aSBarry Smith PetscErrorCode MatDenseRestoreArrayRead(Mat A,const PetscScalar **array) 192073a71a0fSBarry Smith { 192173a71a0fSBarry Smith PetscErrorCode ierr; 192273a71a0fSBarry Smith 192373a71a0fSBarry Smith PetscFunctionBegin; 1924*d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 1925*d5ea218eSStefano Zampini PetscValidPointer(array,2); 19268572280aSBarry Smith ierr = PetscUseMethod(A,"MatDenseRestoreArrayRead_C",(Mat,const PetscScalar**),(A,array));CHKERRQ(ierr); 192773a71a0fSBarry Smith PetscFunctionReturn(0); 192873a71a0fSBarry Smith } 192973a71a0fSBarry Smith 19306947451fSStefano Zampini /*@C 19316947451fSStefano Zampini MatDenseGetArrayWrite - gives write-only access to the array where the data for a dense matrix is stored 19326947451fSStefano Zampini 19336947451fSStefano Zampini Not Collective 19346947451fSStefano Zampini 19356947451fSStefano Zampini Input Parameter: 19366947451fSStefano Zampini . mat - a dense matrix 19376947451fSStefano Zampini 19386947451fSStefano Zampini Output Parameter: 19396947451fSStefano Zampini . array - pointer to the data 19406947451fSStefano Zampini 19416947451fSStefano Zampini Level: intermediate 19426947451fSStefano Zampini 19436947451fSStefano Zampini .seealso: MatDenseRestoreArrayWrite(), MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead() 19446947451fSStefano Zampini @*/ 19456947451fSStefano Zampini PetscErrorCode MatDenseGetArrayWrite(Mat A,PetscScalar **array) 19466947451fSStefano Zampini { 19476947451fSStefano Zampini PetscErrorCode ierr; 19486947451fSStefano Zampini 19496947451fSStefano Zampini PetscFunctionBegin; 1950*d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 1951*d5ea218eSStefano Zampini PetscValidPointer(array,2); 19526947451fSStefano Zampini ierr = PetscUseMethod(A,"MatDenseGetArrayWrite_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 19536947451fSStefano Zampini PetscFunctionReturn(0); 19546947451fSStefano Zampini } 19556947451fSStefano Zampini 19566947451fSStefano Zampini /*@C 19576947451fSStefano Zampini MatDenseRestoreArrayWrite - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArrayWrite() 19586947451fSStefano Zampini 19596947451fSStefano Zampini Not Collective 19606947451fSStefano Zampini 19616947451fSStefano Zampini Input Parameters: 19626947451fSStefano Zampini + mat - a dense matrix 19636947451fSStefano Zampini - array - pointer to the data 19646947451fSStefano Zampini 19656947451fSStefano Zampini Level: intermediate 19666947451fSStefano Zampini 19676947451fSStefano Zampini .seealso: MatDenseGetArrayWrite(), MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead() 19686947451fSStefano Zampini @*/ 19696947451fSStefano Zampini PetscErrorCode MatDenseRestoreArrayWrite(Mat A,PetscScalar **array) 19706947451fSStefano Zampini { 19716947451fSStefano Zampini PetscErrorCode ierr; 19726947451fSStefano Zampini 19736947451fSStefano Zampini PetscFunctionBegin; 1974*d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 1975*d5ea218eSStefano Zampini PetscValidPointer(array,2); 19766947451fSStefano Zampini ierr = PetscUseMethod(A,"MatDenseRestoreArrayWrite_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 19776947451fSStefano Zampini ierr = PetscObjectStateIncrease((PetscObject)A);CHKERRQ(ierr); 19786947451fSStefano Zampini #if defined(PETSC_HAVE_CUDA) 19796947451fSStefano Zampini A->offloadmask = PETSC_OFFLOAD_CPU; 19806947451fSStefano Zampini #endif 19816947451fSStefano Zampini PetscFunctionReturn(0); 19826947451fSStefano Zampini } 19836947451fSStefano Zampini 19847dae84e0SHong Zhang static PetscErrorCode MatCreateSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B) 19850754003eSLois Curfman McInnes { 1986c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 19876849ba73SBarry Smith PetscErrorCode ierr; 1988ca15aa20SStefano Zampini PetscInt i,j,nrows,ncols,blda; 19895d0c19d7SBarry Smith const PetscInt *irow,*icol; 199087828ca2SBarry Smith PetscScalar *av,*bv,*v = mat->v; 19910754003eSLois Curfman McInnes Mat newmat; 19920754003eSLois Curfman McInnes 19933a40ed3dSBarry Smith PetscFunctionBegin; 199478b31e54SBarry Smith ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr); 199578b31e54SBarry Smith ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr); 1996e03a110bSBarry Smith ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr); 1997e03a110bSBarry Smith ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr); 19980754003eSLois Curfman McInnes 1999182d2002SSatish Balay /* Check submatrixcall */ 2000182d2002SSatish Balay if (scall == MAT_REUSE_MATRIX) { 200113f74950SBarry Smith PetscInt n_cols,n_rows; 2002182d2002SSatish Balay ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr); 200321a2c019SBarry Smith if (n_rows != nrows || n_cols != ncols) { 2004f746d493SDmitry Karpeev /* resize the result matrix to match number of requested rows/columns */ 2005c61587bbSBarry Smith ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 200621a2c019SBarry Smith } 2007182d2002SSatish Balay newmat = *B; 2008182d2002SSatish Balay } else { 20090754003eSLois Curfman McInnes /* Create and fill new matrix */ 2010ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr); 2011f69a0ea3SMatthew Knepley ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 20127adad957SLisandro Dalcin ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 20130298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr); 2014182d2002SSatish Balay } 2015182d2002SSatish Balay 2016182d2002SSatish Balay /* Now extract the data pointers and do the copy,column at a time */ 2017ca15aa20SStefano Zampini ierr = MatDenseGetArray(newmat,&bv);CHKERRQ(ierr); 2018ca15aa20SStefano Zampini ierr = MatDenseGetLDA(newmat,&blda);CHKERRQ(ierr); 2019182d2002SSatish Balay for (i=0; i<ncols; i++) { 20206de62eeeSBarry Smith av = v + mat->lda*icol[i]; 2021ca15aa20SStefano Zampini for (j=0; j<nrows; j++) bv[j] = av[irow[j]]; 2022ca15aa20SStefano Zampini bv += blda; 20230754003eSLois Curfman McInnes } 2024ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(newmat,&bv);CHKERRQ(ierr); 2025182d2002SSatish Balay 2026182d2002SSatish Balay /* Assemble the matrices so that the correct flags are set */ 20276d4a8577SBarry Smith ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 20286d4a8577SBarry Smith ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 20290754003eSLois Curfman McInnes 20300754003eSLois Curfman McInnes /* Free work space */ 203178b31e54SBarry Smith ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr); 203278b31e54SBarry Smith ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr); 2033182d2002SSatish Balay *B = newmat; 20343a40ed3dSBarry Smith PetscFunctionReturn(0); 20350754003eSLois Curfman McInnes } 20360754003eSLois Curfman McInnes 20377dae84e0SHong Zhang static PetscErrorCode MatCreateSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[]) 2038905e6a2fSBarry Smith { 20396849ba73SBarry Smith PetscErrorCode ierr; 204013f74950SBarry Smith PetscInt i; 2041905e6a2fSBarry Smith 20423a40ed3dSBarry Smith PetscFunctionBegin; 2043905e6a2fSBarry Smith if (scall == MAT_INITIAL_MATRIX) { 2044df750dc8SHong Zhang ierr = PetscCalloc1(n+1,B);CHKERRQ(ierr); 2045905e6a2fSBarry Smith } 2046905e6a2fSBarry Smith 2047905e6a2fSBarry Smith for (i=0; i<n; i++) { 20487dae84e0SHong Zhang ierr = MatCreateSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr); 2049905e6a2fSBarry Smith } 20503a40ed3dSBarry Smith PetscFunctionReturn(0); 2051905e6a2fSBarry Smith } 2052905e6a2fSBarry Smith 2053e0877f53SBarry Smith static PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode) 2054c0aa2d19SHong Zhang { 2055c0aa2d19SHong Zhang PetscFunctionBegin; 2056c0aa2d19SHong Zhang PetscFunctionReturn(0); 2057c0aa2d19SHong Zhang } 2058c0aa2d19SHong Zhang 2059e0877f53SBarry Smith static PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode) 2060c0aa2d19SHong Zhang { 2061c0aa2d19SHong Zhang PetscFunctionBegin; 2062c0aa2d19SHong Zhang PetscFunctionReturn(0); 2063c0aa2d19SHong Zhang } 2064c0aa2d19SHong Zhang 2065e0877f53SBarry Smith static PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str) 20664b0e389bSBarry Smith { 20674b0e389bSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data; 20686849ba73SBarry Smith PetscErrorCode ierr; 2069ca15aa20SStefano Zampini const PetscScalar *va; 2070ca15aa20SStefano Zampini PetscScalar *vb; 2071d0f46423SBarry Smith PetscInt lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j; 20723a40ed3dSBarry Smith 20733a40ed3dSBarry Smith PetscFunctionBegin; 207433f4a19fSKris Buschelman /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */ 207533f4a19fSKris Buschelman if (A->ops->copy != B->ops->copy) { 2076cb5b572fSBarry Smith ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr); 20773a40ed3dSBarry Smith PetscFunctionReturn(0); 20783a40ed3dSBarry Smith } 2079e32f2f54SBarry Smith if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)"); 2080ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&va);CHKERRQ(ierr); 2081ca15aa20SStefano Zampini ierr = MatDenseGetArray(B,&vb);CHKERRQ(ierr); 2082a5ce6ee0Svictorle if (lda1>m || lda2>m) { 20830dbb7854Svictorle for (j=0; j<n; j++) { 2084ca15aa20SStefano Zampini ierr = PetscArraycpy(vb+j*lda2,va+j*lda1,m);CHKERRQ(ierr); 2085a5ce6ee0Svictorle } 2086a5ce6ee0Svictorle } else { 2087ca15aa20SStefano Zampini ierr = PetscArraycpy(vb,va,A->rmap->n*A->cmap->n);CHKERRQ(ierr); 2088a5ce6ee0Svictorle } 2089ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(B,&vb);CHKERRQ(ierr); 2090ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&va);CHKERRQ(ierr); 2091ca15aa20SStefano Zampini ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2092ca15aa20SStefano Zampini ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2093273d9f13SBarry Smith PetscFunctionReturn(0); 2094273d9f13SBarry Smith } 2095273d9f13SBarry Smith 2096e0877f53SBarry Smith static PetscErrorCode MatSetUp_SeqDense(Mat A) 2097273d9f13SBarry Smith { 2098dfbe8321SBarry Smith PetscErrorCode ierr; 2099273d9f13SBarry Smith 2100273d9f13SBarry Smith PetscFunctionBegin; 210118992e5dSStefano Zampini ierr = PetscLayoutSetUp(A->rmap);CHKERRQ(ierr); 210218992e5dSStefano Zampini ierr = PetscLayoutSetUp(A->cmap);CHKERRQ(ierr); 210318992e5dSStefano Zampini if (!A->preallocated) { 2104273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr); 210518992e5dSStefano Zampini } 21063a40ed3dSBarry Smith PetscFunctionReturn(0); 21074b0e389bSBarry Smith } 21084b0e389bSBarry Smith 2109ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A) 2110ba337c44SJed Brown { 2111ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 2112ca15aa20SStefano Zampini PetscScalar *aa; 2113ca15aa20SStefano Zampini PetscErrorCode ierr; 2114ba337c44SJed Brown 2115ba337c44SJed Brown PetscFunctionBegin; 2116ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&aa);CHKERRQ(ierr); 2117ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]); 2118ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&aa);CHKERRQ(ierr); 2119ba337c44SJed Brown PetscFunctionReturn(0); 2120ba337c44SJed Brown } 2121ba337c44SJed Brown 2122ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A) 2123ba337c44SJed Brown { 2124ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 2125ca15aa20SStefano Zampini PetscScalar *aa; 2126ca15aa20SStefano Zampini PetscErrorCode ierr; 2127ba337c44SJed Brown 2128ba337c44SJed Brown PetscFunctionBegin; 2129ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&aa);CHKERRQ(ierr); 2130ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]); 2131ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&aa);CHKERRQ(ierr); 2132ba337c44SJed Brown PetscFunctionReturn(0); 2133ba337c44SJed Brown } 2134ba337c44SJed Brown 2135ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A) 2136ba337c44SJed Brown { 2137ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 2138ca15aa20SStefano Zampini PetscScalar *aa; 2139ca15aa20SStefano Zampini PetscErrorCode ierr; 2140ba337c44SJed Brown 2141ba337c44SJed Brown PetscFunctionBegin; 2142ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&aa);CHKERRQ(ierr); 2143ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]); 2144ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&aa);CHKERRQ(ierr); 2145ba337c44SJed Brown PetscFunctionReturn(0); 2146ba337c44SJed Brown } 2147284134d9SBarry Smith 2148a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/ 21494222ddf1SHong Zhang PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat C) 2150a9fe9ddaSSatish Balay { 2151ee16a9a1SHong Zhang PetscErrorCode ierr; 2152d0f46423SBarry Smith PetscInt m=A->rmap->n,n=B->cmap->n; 21537a3c3d58SStefano Zampini PetscBool cisdense; 2154a9fe9ddaSSatish Balay 2155ee16a9a1SHong Zhang PetscFunctionBegin; 21564222ddf1SHong Zhang ierr = MatSetSizes(C,m,n,m,n);CHKERRQ(ierr); 21577a3c3d58SStefano Zampini ierr = PetscObjectTypeCompareAny((PetscObject)C,&cisdense,MATSEQDENSE,MATSEQDENSECUDA,"");CHKERRQ(ierr); 21587a3c3d58SStefano Zampini if (!cisdense) { 21597a3c3d58SStefano Zampini PetscBool flg; 21607a3c3d58SStefano Zampini 2161ca15aa20SStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)B,((PetscObject)A)->type_name,&flg);CHKERRQ(ierr); 21624222ddf1SHong Zhang ierr = MatSetType(C,flg ? ((PetscObject)A)->type_name : MATDENSE);CHKERRQ(ierr); 21637a3c3d58SStefano Zampini } 216418992e5dSStefano Zampini ierr = MatSetUp(C);CHKERRQ(ierr); 2165ee16a9a1SHong Zhang PetscFunctionReturn(0); 2166ee16a9a1SHong Zhang } 2167a9fe9ddaSSatish Balay 2168a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 2169a9fe9ddaSSatish Balay { 217052c5f739Sprj- Mat_SeqDense *a,*b=(Mat_SeqDense*)B->data,*c=(Mat_SeqDense*)C->data; 21710805154bSBarry Smith PetscBLASInt m,n,k; 2172ca15aa20SStefano Zampini const PetscScalar *av,*bv; 2173ca15aa20SStefano Zampini PetscScalar *cv; 2174a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 2175fd4e9aacSBarry Smith PetscBool flg; 2176c2916339SPierre Jolivet PetscErrorCode (*numeric)(Mat,Mat,Mat)=NULL; 2177c2916339SPierre Jolivet PetscErrorCode ierr; 2178a9fe9ddaSSatish Balay 2179a9fe9ddaSSatish Balay PetscFunctionBegin; 2180fd4e9aacSBarry Smith /* Handle case where where user provided the final C matrix rather than calling MatMatMult() with MAT_INITIAL_MATRIX*/ 2181fd4e9aacSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&flg);CHKERRQ(ierr); 2182c2916339SPierre Jolivet if (flg) numeric = MatMatMultNumeric_SeqAIJ_SeqDense; 2183a001520aSPierre Jolivet ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQBAIJ,&flg);CHKERRQ(ierr); 2184c2916339SPierre Jolivet if (flg) numeric = MatMatMultNumeric_SeqBAIJ_SeqDense; 2185c2916339SPierre Jolivet ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQSBAIJ,&flg);CHKERRQ(ierr); 2186c2916339SPierre Jolivet if (flg) numeric = MatMatMultNumeric_SeqSBAIJ_SeqDense; 218752c5f739Sprj- ierr = PetscObjectTypeCompare((PetscObject)A,MATNEST,&flg);CHKERRQ(ierr); 2188c2916339SPierre Jolivet if (flg) numeric = MatMatMultNumeric_Nest_Dense; 2189c2916339SPierre Jolivet if (numeric) { 2190c2916339SPierre Jolivet C->ops->matmultnumeric = numeric; 2191c2916339SPierre Jolivet ierr = (*numeric)(A,B,C);CHKERRQ(ierr); 219252c5f739Sprj- PetscFunctionReturn(0); 219352c5f739Sprj- } 219452c5f739Sprj- a = (Mat_SeqDense*)A->data; 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); 2201ca15aa20SStefano Zampini ierr = MatDenseGetArray(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); 2206ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(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; 223469f65d41SStefano Zampini PetscBLASInt m,n,k; 223569f65d41SStefano Zampini PetscScalar _DOne=1.0,_DZero=0.0; 223669f65d41SStefano Zampini PetscErrorCode ierr; 223769f65d41SStefano Zampini 223869f65d41SStefano Zampini PetscFunctionBegin; 223949d0e964SStefano Zampini ierr = PetscBLASIntCast(C->rmap->n,&m);CHKERRQ(ierr); 224049d0e964SStefano Zampini ierr = PetscBLASIntCast(C->cmap->n,&n);CHKERRQ(ierr); 224169f65d41SStefano Zampini ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr); 224249d0e964SStefano Zampini if (!m || !n || !k) PetscFunctionReturn(0); 224369f65d41SStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("N","T",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda)); 2244ca15aa20SStefano Zampini ierr = PetscLogFlops(1.0*m*n*k + 1.0*m*n*(k-1));CHKERRQ(ierr); 224569f65d41SStefano Zampini PetscFunctionReturn(0); 224669f65d41SStefano Zampini } 224769f65d41SStefano Zampini 22484222ddf1SHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat C) 2249a9fe9ddaSSatish Balay { 2250ee16a9a1SHong Zhang PetscErrorCode ierr; 2251d0f46423SBarry Smith PetscInt m=A->cmap->n,n=B->cmap->n; 22527a3c3d58SStefano Zampini PetscBool cisdense; 2253a9fe9ddaSSatish Balay 2254ee16a9a1SHong Zhang PetscFunctionBegin; 22554222ddf1SHong Zhang ierr = MatSetSizes(C,m,n,m,n);CHKERRQ(ierr); 22567a3c3d58SStefano Zampini ierr = PetscObjectTypeCompareAny((PetscObject)C,&cisdense,MATSEQDENSE,MATSEQDENSECUDA,"");CHKERRQ(ierr); 22577a3c3d58SStefano Zampini if (!cisdense) { 22587a3c3d58SStefano Zampini PetscBool flg; 22597a3c3d58SStefano Zampini 2260ca15aa20SStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)B,((PetscObject)A)->type_name,&flg);CHKERRQ(ierr); 22614222ddf1SHong Zhang ierr = MatSetType(C,flg ? ((PetscObject)A)->type_name : MATDENSE);CHKERRQ(ierr); 22627a3c3d58SStefano Zampini } 226318992e5dSStefano Zampini ierr = MatSetUp(C);CHKERRQ(ierr); 2264ee16a9a1SHong Zhang PetscFunctionReturn(0); 2265ee16a9a1SHong Zhang } 2266a9fe9ddaSSatish Balay 226775648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 2268a9fe9ddaSSatish Balay { 2269a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2270a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 2271a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 22720805154bSBarry Smith PetscBLASInt m,n,k; 2273a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 2274c5df96a5SBarry Smith PetscErrorCode ierr; 2275a9fe9ddaSSatish Balay 2276a9fe9ddaSSatish Balay PetscFunctionBegin; 22778208b9aeSStefano Zampini ierr = PetscBLASIntCast(C->rmap->n,&m);CHKERRQ(ierr); 22788208b9aeSStefano Zampini ierr = PetscBLASIntCast(C->cmap->n,&n);CHKERRQ(ierr); 2279c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr); 228049d0e964SStefano Zampini if (!m || !n || !k) PetscFunctionReturn(0); 22815ca1cc5dSStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda)); 2282ca15aa20SStefano Zampini ierr = PetscLogFlops(1.0*m*n*k + 1.0*m*n*(k-1));CHKERRQ(ierr); 2283a9fe9ddaSSatish Balay PetscFunctionReturn(0); 2284a9fe9ddaSSatish Balay } 2285985db425SBarry Smith 22864222ddf1SHong Zhang /* ----------------------------------------------- */ 22874222ddf1SHong Zhang static PetscErrorCode MatProductSetFromOptions_SeqDense_AB(Mat C) 22884222ddf1SHong Zhang { 22894222ddf1SHong Zhang PetscFunctionBegin; 22904222ddf1SHong Zhang C->ops->matmultsymbolic = MatMatMultSymbolic_SeqDense_SeqDense; 22914222ddf1SHong Zhang C->ops->productsymbolic = MatProductSymbolic_AB; 22924222ddf1SHong Zhang /* dense mat may not call MatProductSymbolic(), thus set C->ops->productnumeric here */ 22934222ddf1SHong Zhang C->ops->productnumeric = MatProductNumeric_AB; 22944222ddf1SHong Zhang PetscFunctionReturn(0); 22954222ddf1SHong Zhang } 22964222ddf1SHong Zhang 22974222ddf1SHong Zhang static PetscErrorCode MatProductSetFromOptions_SeqDense_AtB(Mat C) 22984222ddf1SHong Zhang { 22994222ddf1SHong Zhang PetscFunctionBegin; 23004222ddf1SHong Zhang C->ops->transposematmultsymbolic = MatTransposeMatMultSymbolic_SeqDense_SeqDense; 23014222ddf1SHong Zhang C->ops->productsymbolic = MatProductSymbolic_AtB; 23024222ddf1SHong Zhang C->ops->productnumeric = MatProductNumeric_AtB; 23034222ddf1SHong Zhang PetscFunctionReturn(0); 23044222ddf1SHong Zhang } 23054222ddf1SHong Zhang 23064222ddf1SHong Zhang static PetscErrorCode MatProductSetFromOptions_SeqDense_ABt(Mat C) 23074222ddf1SHong Zhang { 23084222ddf1SHong Zhang PetscFunctionBegin; 23094222ddf1SHong Zhang C->ops->mattransposemultsymbolic = MatMatTransposeMultSymbolic_SeqDense_SeqDense; 23104222ddf1SHong Zhang C->ops->productsymbolic = MatProductSymbolic_ABt; 23114222ddf1SHong Zhang C->ops->productnumeric = MatProductNumeric_ABt; 23124222ddf1SHong Zhang PetscFunctionReturn(0); 23134222ddf1SHong Zhang } 23144222ddf1SHong Zhang 23154222ddf1SHong Zhang static PetscErrorCode MatProductSetFromOptions_SeqDense_PtAP(Mat C) 23164222ddf1SHong Zhang { 23174222ddf1SHong Zhang PetscFunctionBegin; 23184222ddf1SHong Zhang C->ops->productsymbolic = MatProductSymbolic_Basic; 23194222ddf1SHong Zhang PetscFunctionReturn(0); 23204222ddf1SHong Zhang } 23214222ddf1SHong Zhang 23224222ddf1SHong Zhang PETSC_INTERN PetscErrorCode MatProductSetFromOptions_SeqDense(Mat C) 23234222ddf1SHong Zhang { 23244222ddf1SHong Zhang PetscErrorCode ierr; 23254222ddf1SHong Zhang Mat_Product *product = C->product; 23264222ddf1SHong Zhang 23274222ddf1SHong Zhang PetscFunctionBegin; 23284222ddf1SHong Zhang switch (product->type) { 23294222ddf1SHong Zhang case MATPRODUCT_AB: 23304222ddf1SHong Zhang ierr = MatProductSetFromOptions_SeqDense_AB(C);CHKERRQ(ierr); 23314222ddf1SHong Zhang break; 23324222ddf1SHong Zhang case MATPRODUCT_AtB: 23334222ddf1SHong Zhang ierr = MatProductSetFromOptions_SeqDense_AtB(C);CHKERRQ(ierr); 23344222ddf1SHong Zhang break; 23354222ddf1SHong Zhang case MATPRODUCT_ABt: 23364222ddf1SHong Zhang ierr = MatProductSetFromOptions_SeqDense_ABt(C);CHKERRQ(ierr); 23374222ddf1SHong Zhang break; 23384222ddf1SHong Zhang case MATPRODUCT_PtAP: 23395aae2c7aSStefano Zampini case MATPRODUCT_RARt: 23404222ddf1SHong Zhang ierr = MatProductSetFromOptions_SeqDense_PtAP(C);CHKERRQ(ierr); 23414222ddf1SHong Zhang break; 2342544a5e07SHong Zhang default: SETERRQ1(PetscObjectComm((PetscObject)C),PETSC_ERR_SUP,"MatProduct type %s is not supported for SeqDense and SeqDense matrices",MatProductTypes[product->type]); 23434222ddf1SHong Zhang } 23444222ddf1SHong Zhang PetscFunctionReturn(0); 23454222ddf1SHong Zhang } 23464222ddf1SHong Zhang /* ----------------------------------------------- */ 23474222ddf1SHong Zhang 2348e0877f53SBarry Smith static PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[]) 2349985db425SBarry Smith { 2350985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2351985db425SBarry Smith PetscErrorCode ierr; 2352d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 2353985db425SBarry Smith PetscScalar *x; 2354ca15aa20SStefano Zampini const PetscScalar *aa; 2355985db425SBarry Smith 2356985db425SBarry Smith PetscFunctionBegin; 2357e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2358985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2359985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 2360ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&aa);CHKERRQ(ierr); 2361e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2362985db425SBarry Smith for (i=0; i<m; i++) { 2363985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 2364985db425SBarry Smith for (j=1; j<n; j++) { 2365ca15aa20SStefano Zampini if (PetscRealPart(x[i]) < PetscRealPart(aa[i+a->lda*j])) {x[i] = aa[i + a->lda*j]; if (idx) idx[i] = j;} 2366985db425SBarry Smith } 2367985db425SBarry Smith } 2368ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&aa);CHKERRQ(ierr); 2369985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2370985db425SBarry Smith PetscFunctionReturn(0); 2371985db425SBarry Smith } 2372985db425SBarry Smith 2373e0877f53SBarry Smith static PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[]) 2374985db425SBarry Smith { 2375985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2376985db425SBarry Smith PetscErrorCode ierr; 2377d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 2378985db425SBarry Smith PetscScalar *x; 2379985db425SBarry Smith PetscReal atmp; 2380ca15aa20SStefano Zampini const PetscScalar *aa; 2381985db425SBarry Smith 2382985db425SBarry Smith PetscFunctionBegin; 2383e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2384985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2385985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 2386ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&aa);CHKERRQ(ierr); 2387e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2388985db425SBarry Smith for (i=0; i<m; i++) { 23899189402eSHong Zhang x[i] = PetscAbsScalar(aa[i]); 2390985db425SBarry Smith for (j=1; j<n; j++) { 2391ca15aa20SStefano Zampini atmp = PetscAbsScalar(aa[i+a->lda*j]); 2392985db425SBarry Smith if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;} 2393985db425SBarry Smith } 2394985db425SBarry Smith } 2395ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&aa);CHKERRQ(ierr); 2396985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2397985db425SBarry Smith PetscFunctionReturn(0); 2398985db425SBarry Smith } 2399985db425SBarry Smith 2400e0877f53SBarry Smith static PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[]) 2401985db425SBarry Smith { 2402985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2403985db425SBarry Smith PetscErrorCode ierr; 2404d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 2405985db425SBarry Smith PetscScalar *x; 2406ca15aa20SStefano Zampini const PetscScalar *aa; 2407985db425SBarry Smith 2408985db425SBarry Smith PetscFunctionBegin; 2409e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2410ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&aa);CHKERRQ(ierr); 2411985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2412985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 2413e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2414985db425SBarry Smith for (i=0; i<m; i++) { 2415985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 2416985db425SBarry Smith for (j=1; j<n; j++) { 2417ca15aa20SStefano Zampini if (PetscRealPart(x[i]) > PetscRealPart(aa[i+a->lda*j])) {x[i] = aa[i + a->lda*j]; if (idx) idx[i] = j;} 2418985db425SBarry Smith } 2419985db425SBarry Smith } 2420985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2421ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&aa);CHKERRQ(ierr); 2422985db425SBarry Smith PetscFunctionReturn(0); 2423985db425SBarry Smith } 2424985db425SBarry Smith 2425637a0070SStefano Zampini PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col) 24268d0534beSBarry Smith { 24278d0534beSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 24288d0534beSBarry Smith PetscErrorCode ierr; 24298d0534beSBarry Smith PetscScalar *x; 2430ca15aa20SStefano Zampini const PetscScalar *aa; 24318d0534beSBarry Smith 24328d0534beSBarry Smith PetscFunctionBegin; 2433e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2434ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&aa);CHKERRQ(ierr); 24358d0534beSBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2436ca15aa20SStefano Zampini ierr = PetscArraycpy(x,aa+col*a->lda,A->rmap->n);CHKERRQ(ierr); 24378d0534beSBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2438ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&aa);CHKERRQ(ierr); 24398d0534beSBarry Smith PetscFunctionReturn(0); 24408d0534beSBarry Smith } 24418d0534beSBarry Smith 244252c5f739Sprj- PETSC_INTERN PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms) 24430716a85fSBarry Smith { 24440716a85fSBarry Smith PetscErrorCode ierr; 24450716a85fSBarry Smith PetscInt i,j,m,n; 24461683a169SBarry Smith const PetscScalar *a; 24470716a85fSBarry Smith 24480716a85fSBarry Smith PetscFunctionBegin; 24490716a85fSBarry Smith ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr); 2450580bdb30SBarry Smith ierr = PetscArrayzero(norms,n);CHKERRQ(ierr); 24511683a169SBarry Smith ierr = MatDenseGetArrayRead(A,&a);CHKERRQ(ierr); 24520716a85fSBarry Smith if (type == NORM_2) { 24530716a85fSBarry Smith for (i=0; i<n; i++) { 24540716a85fSBarry Smith for (j=0; j<m; j++) { 24550716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]*a[j]); 24560716a85fSBarry Smith } 24570716a85fSBarry Smith a += m; 24580716a85fSBarry Smith } 24590716a85fSBarry Smith } else if (type == NORM_1) { 24600716a85fSBarry Smith for (i=0; i<n; i++) { 24610716a85fSBarry Smith for (j=0; j<m; j++) { 24620716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]); 24630716a85fSBarry Smith } 24640716a85fSBarry Smith a += m; 24650716a85fSBarry Smith } 24660716a85fSBarry Smith } else if (type == NORM_INFINITY) { 24670716a85fSBarry Smith for (i=0; i<n; i++) { 24680716a85fSBarry Smith for (j=0; j<m; j++) { 24690716a85fSBarry Smith norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]); 24700716a85fSBarry Smith } 24710716a85fSBarry Smith a += m; 24720716a85fSBarry Smith } 2473ce94432eSBarry Smith } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType"); 24741683a169SBarry Smith ierr = MatDenseRestoreArrayRead(A,&a);CHKERRQ(ierr); 24750716a85fSBarry Smith if (type == NORM_2) { 24768f1a2a5eSBarry Smith for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]); 24770716a85fSBarry Smith } 24780716a85fSBarry Smith PetscFunctionReturn(0); 24790716a85fSBarry Smith } 24800716a85fSBarry Smith 248173a71a0fSBarry Smith static PetscErrorCode MatSetRandom_SeqDense(Mat x,PetscRandom rctx) 248273a71a0fSBarry Smith { 248373a71a0fSBarry Smith PetscErrorCode ierr; 248473a71a0fSBarry Smith PetscScalar *a; 2485637a0070SStefano Zampini PetscInt lda,m,n,i,j; 248673a71a0fSBarry Smith 248773a71a0fSBarry Smith PetscFunctionBegin; 248873a71a0fSBarry Smith ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr); 2489637a0070SStefano Zampini ierr = MatDenseGetLDA(x,&lda);CHKERRQ(ierr); 24908c778c55SBarry Smith ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr); 2491637a0070SStefano Zampini for (j=0; j<n; j++) { 2492637a0070SStefano Zampini for (i=0; i<m; i++) { 2493637a0070SStefano Zampini ierr = PetscRandomGetValue(rctx,a+j*lda+i);CHKERRQ(ierr); 2494637a0070SStefano Zampini } 249573a71a0fSBarry Smith } 24968c778c55SBarry Smith ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr); 249773a71a0fSBarry Smith PetscFunctionReturn(0); 249873a71a0fSBarry Smith } 249973a71a0fSBarry Smith 25003b49f96aSBarry Smith static PetscErrorCode MatMissingDiagonal_SeqDense(Mat A,PetscBool *missing,PetscInt *d) 25013b49f96aSBarry Smith { 25023b49f96aSBarry Smith PetscFunctionBegin; 25033b49f96aSBarry Smith *missing = PETSC_FALSE; 25043b49f96aSBarry Smith PetscFunctionReturn(0); 25053b49f96aSBarry Smith } 250673a71a0fSBarry Smith 2507ca15aa20SStefano Zampini /* vals is not const */ 2508af53bab2SHong Zhang static PetscErrorCode MatDenseGetColumn_SeqDense(Mat A,PetscInt col,PetscScalar **vals) 250986aefd0dSHong Zhang { 2510ca15aa20SStefano Zampini PetscErrorCode ierr; 251186aefd0dSHong Zhang Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2512ca15aa20SStefano Zampini PetscScalar *v; 251386aefd0dSHong Zhang 251486aefd0dSHong Zhang PetscFunctionBegin; 251586aefd0dSHong Zhang if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2516ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr); 2517ca15aa20SStefano Zampini *vals = v+col*a->lda; 2518ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr); 251986aefd0dSHong Zhang PetscFunctionReturn(0); 252086aefd0dSHong Zhang } 252186aefd0dSHong Zhang 2522af53bab2SHong Zhang static PetscErrorCode MatDenseRestoreColumn_SeqDense(Mat A,PetscScalar **vals) 252386aefd0dSHong Zhang { 252486aefd0dSHong Zhang PetscFunctionBegin; 252586aefd0dSHong Zhang *vals = 0; /* user cannot accidently use the array later */ 252686aefd0dSHong Zhang PetscFunctionReturn(0); 252786aefd0dSHong Zhang } 2528abc3b08eSStefano Zampini 2529289bc588SBarry Smith /* -------------------------------------------------------------------*/ 2530a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense, 2531905e6a2fSBarry Smith MatGetRow_SeqDense, 2532905e6a2fSBarry Smith MatRestoreRow_SeqDense, 2533905e6a2fSBarry Smith MatMult_SeqDense, 253497304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense, 25357c922b88SBarry Smith MatMultTranspose_SeqDense, 25367c922b88SBarry Smith MatMultTransposeAdd_SeqDense, 2537db4efbfdSBarry Smith 0, 2538db4efbfdSBarry Smith 0, 2539db4efbfdSBarry Smith 0, 2540db4efbfdSBarry Smith /* 10*/ 0, 2541905e6a2fSBarry Smith MatLUFactor_SeqDense, 2542905e6a2fSBarry Smith MatCholeskyFactor_SeqDense, 254341f059aeSBarry Smith MatSOR_SeqDense, 2544ec8511deSBarry Smith MatTranspose_SeqDense, 254597304618SKris Buschelman /* 15*/ MatGetInfo_SeqDense, 2546905e6a2fSBarry Smith MatEqual_SeqDense, 2547905e6a2fSBarry Smith MatGetDiagonal_SeqDense, 2548905e6a2fSBarry Smith MatDiagonalScale_SeqDense, 2549905e6a2fSBarry Smith MatNorm_SeqDense, 2550c0aa2d19SHong Zhang /* 20*/ MatAssemblyBegin_SeqDense, 2551c0aa2d19SHong Zhang MatAssemblyEnd_SeqDense, 2552905e6a2fSBarry Smith MatSetOption_SeqDense, 2553905e6a2fSBarry Smith MatZeroEntries_SeqDense, 2554d519adbfSMatthew Knepley /* 24*/ MatZeroRows_SeqDense, 2555db4efbfdSBarry Smith 0, 2556db4efbfdSBarry Smith 0, 2557db4efbfdSBarry Smith 0, 2558db4efbfdSBarry Smith 0, 25594994cf47SJed Brown /* 29*/ MatSetUp_SeqDense, 2560273d9f13SBarry Smith 0, 2561905e6a2fSBarry Smith 0, 256273a71a0fSBarry Smith 0, 256373a71a0fSBarry Smith 0, 2564d519adbfSMatthew Knepley /* 34*/ MatDuplicate_SeqDense, 2565a5ae1ecdSBarry Smith 0, 2566a5ae1ecdSBarry Smith 0, 2567a5ae1ecdSBarry Smith 0, 2568a5ae1ecdSBarry Smith 0, 2569d519adbfSMatthew Knepley /* 39*/ MatAXPY_SeqDense, 25707dae84e0SHong Zhang MatCreateSubMatrices_SeqDense, 2571a5ae1ecdSBarry Smith 0, 25724b0e389bSBarry Smith MatGetValues_SeqDense, 2573a5ae1ecdSBarry Smith MatCopy_SeqDense, 2574d519adbfSMatthew Knepley /* 44*/ MatGetRowMax_SeqDense, 2575a5ae1ecdSBarry Smith MatScale_SeqDense, 25767d68702bSBarry Smith MatShift_Basic, 2577a5ae1ecdSBarry Smith 0, 25783f49a652SStefano Zampini MatZeroRowsColumns_SeqDense, 257973a71a0fSBarry Smith /* 49*/ MatSetRandom_SeqDense, 2580a5ae1ecdSBarry Smith 0, 2581a5ae1ecdSBarry Smith 0, 2582a5ae1ecdSBarry Smith 0, 2583a5ae1ecdSBarry Smith 0, 2584d519adbfSMatthew Knepley /* 54*/ 0, 2585a5ae1ecdSBarry Smith 0, 2586a5ae1ecdSBarry Smith 0, 2587a5ae1ecdSBarry Smith 0, 2588a5ae1ecdSBarry Smith 0, 2589d519adbfSMatthew Knepley /* 59*/ 0, 2590e03a110bSBarry Smith MatDestroy_SeqDense, 2591e03a110bSBarry Smith MatView_SeqDense, 2592357abbc8SBarry Smith 0, 259397304618SKris Buschelman 0, 2594d519adbfSMatthew Knepley /* 64*/ 0, 259597304618SKris Buschelman 0, 259697304618SKris Buschelman 0, 259797304618SKris Buschelman 0, 259897304618SKris Buschelman 0, 2599d519adbfSMatthew Knepley /* 69*/ MatGetRowMaxAbs_SeqDense, 260097304618SKris Buschelman 0, 260197304618SKris Buschelman 0, 260297304618SKris Buschelman 0, 260397304618SKris Buschelman 0, 2604d519adbfSMatthew Knepley /* 74*/ 0, 260597304618SKris Buschelman 0, 260697304618SKris Buschelman 0, 260797304618SKris Buschelman 0, 260897304618SKris Buschelman 0, 2609d519adbfSMatthew Knepley /* 79*/ 0, 261097304618SKris Buschelman 0, 261197304618SKris Buschelman 0, 261297304618SKris Buschelman 0, 26135bba2384SShri Abhyankar /* 83*/ MatLoad_SeqDense, 2614637a0070SStefano Zampini MatIsSymmetric_SeqDense, 26151cbb95d3SBarry Smith MatIsHermitian_SeqDense, 2616865e5f61SKris Buschelman 0, 2617865e5f61SKris Buschelman 0, 2618865e5f61SKris Buschelman 0, 26194222ddf1SHong Zhang /* 89*/ 0, 26204222ddf1SHong Zhang 0, 2621a9fe9ddaSSatish Balay MatMatMultNumeric_SeqDense_SeqDense, 26224222ddf1SHong Zhang 0, 26234222ddf1SHong Zhang 0, 26244222ddf1SHong Zhang /* 94*/ 0, 26254222ddf1SHong Zhang 0, 26264222ddf1SHong Zhang 0, 262769f65d41SStefano Zampini MatMatTransposeMultNumeric_SeqDense_SeqDense, 2628284134d9SBarry Smith 0, 26294222ddf1SHong Zhang /* 99*/ MatProductSetFromOptions_SeqDense, 2630284134d9SBarry Smith 0, 2631284134d9SBarry Smith 0, 2632ba337c44SJed Brown MatConjugate_SeqDense, 2633f73d5cc4SBarry Smith 0, 2634ba337c44SJed Brown /*104*/ 0, 2635ba337c44SJed Brown MatRealPart_SeqDense, 2636ba337c44SJed Brown MatImaginaryPart_SeqDense, 2637985db425SBarry Smith 0, 2638985db425SBarry Smith 0, 26398208b9aeSStefano Zampini /*109*/ 0, 2640985db425SBarry Smith 0, 26418d0534beSBarry Smith MatGetRowMin_SeqDense, 2642aabbc4fbSShri Abhyankar MatGetColumnVector_SeqDense, 26433b49f96aSBarry Smith MatMissingDiagonal_SeqDense, 2644aabbc4fbSShri Abhyankar /*114*/ 0, 2645aabbc4fbSShri Abhyankar 0, 2646aabbc4fbSShri Abhyankar 0, 2647aabbc4fbSShri Abhyankar 0, 2648aabbc4fbSShri Abhyankar 0, 2649aabbc4fbSShri Abhyankar /*119*/ 0, 2650aabbc4fbSShri Abhyankar 0, 2651aabbc4fbSShri Abhyankar 0, 26520716a85fSBarry Smith 0, 26530716a85fSBarry Smith 0, 26540716a85fSBarry Smith /*124*/ 0, 26555df89d91SHong Zhang MatGetColumnNorms_SeqDense, 26565df89d91SHong Zhang 0, 26575df89d91SHong Zhang 0, 26585df89d91SHong Zhang 0, 26595df89d91SHong Zhang /*129*/ 0, 26604222ddf1SHong Zhang 0, 26614222ddf1SHong Zhang 0, 266275648e8dSHong Zhang MatTransposeMatMultNumeric_SeqDense_SeqDense, 26633964eb88SJed Brown 0, 26643964eb88SJed Brown /*134*/ 0, 26653964eb88SJed Brown 0, 26663964eb88SJed Brown 0, 26673964eb88SJed Brown 0, 26683964eb88SJed Brown 0, 26693964eb88SJed Brown /*139*/ 0, 2670f9426fe0SMark Adams 0, 2671d528f656SJakub Kruzik 0, 2672d528f656SJakub Kruzik 0, 2673d528f656SJakub Kruzik 0, 26744222ddf1SHong Zhang MatCreateMPIMatConcatenateSeqMat_SeqDense, 26754222ddf1SHong Zhang /*145*/ 0, 26764222ddf1SHong Zhang 0, 26774222ddf1SHong Zhang 0 2678985db425SBarry Smith }; 267990ace30eSBarry Smith 26804b828684SBarry Smith /*@C 2681fafbff53SBarry Smith MatCreateSeqDense - Creates a sequential dense matrix that 2682d65003e9SLois Curfman McInnes is stored in column major order (the usual Fortran 77 manner). Many 2683d65003e9SLois Curfman McInnes of the matrix operations use the BLAS and LAPACK routines. 2684289bc588SBarry Smith 2685d083f849SBarry Smith Collective 2686db81eaa0SLois Curfman McInnes 268720563c6bSBarry Smith Input Parameters: 2688db81eaa0SLois Curfman McInnes + comm - MPI communicator, set to PETSC_COMM_SELF 26890c775827SLois Curfman McInnes . m - number of rows 269018f449edSLois Curfman McInnes . n - number of columns 26910298fd71SBarry Smith - data - optional location of matrix data in column major order. Set data=NULL for PETSc 2692dfc5480cSLois Curfman McInnes to control all matrix memory allocation. 269320563c6bSBarry Smith 269420563c6bSBarry Smith Output Parameter: 269544cd7ae7SLois Curfman McInnes . A - the matrix 269620563c6bSBarry Smith 2697b259b22eSLois Curfman McInnes Notes: 269818f449edSLois Curfman McInnes The data input variable is intended primarily for Fortran programmers 269918f449edSLois Curfman McInnes who wish to allocate their own matrix memory space. Most users should 27000298fd71SBarry Smith set data=NULL. 270118f449edSLois Curfman McInnes 2702027ccd11SLois Curfman McInnes Level: intermediate 2703027ccd11SLois Curfman McInnes 270469b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues() 270520563c6bSBarry Smith @*/ 27067087cfbeSBarry Smith PetscErrorCode MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A) 2707289bc588SBarry Smith { 2708dfbe8321SBarry Smith PetscErrorCode ierr; 27093b2fbd54SBarry Smith 27103a40ed3dSBarry Smith PetscFunctionBegin; 2711f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 2712f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr); 2713273d9f13SBarry Smith ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr); 2714273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr); 2715273d9f13SBarry Smith PetscFunctionReturn(0); 2716273d9f13SBarry Smith } 2717273d9f13SBarry Smith 2718273d9f13SBarry Smith /*@C 2719273d9f13SBarry Smith MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements 2720273d9f13SBarry Smith 2721d083f849SBarry Smith Collective 2722273d9f13SBarry Smith 2723273d9f13SBarry Smith Input Parameters: 27241c4f3114SJed Brown + B - the matrix 27250298fd71SBarry Smith - data - the array (or NULL) 2726273d9f13SBarry Smith 2727273d9f13SBarry Smith Notes: 2728273d9f13SBarry Smith The data input variable is intended primarily for Fortran programmers 2729273d9f13SBarry Smith who wish to allocate their own matrix memory space. Most users should 2730284134d9SBarry Smith need not call this routine. 2731273d9f13SBarry Smith 2732273d9f13SBarry Smith Level: intermediate 2733273d9f13SBarry Smith 273469b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA() 2735867c911aSBarry Smith 2736273d9f13SBarry Smith @*/ 27377087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation(Mat B,PetscScalar data[]) 2738273d9f13SBarry Smith { 27394ac538c5SBarry Smith PetscErrorCode ierr; 2740a23d5eceSKris Buschelman 2741a23d5eceSKris Buschelman PetscFunctionBegin; 2742*d5ea218eSStefano Zampini PetscValidHeaderSpecific(B,MAT_CLASSID,1); 27434ac538c5SBarry Smith ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr); 2744a23d5eceSKris Buschelman PetscFunctionReturn(0); 2745a23d5eceSKris Buschelman } 2746a23d5eceSKris Buschelman 27477087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data) 2748a23d5eceSKris Buschelman { 2749273d9f13SBarry Smith Mat_SeqDense *b; 2750dfbe8321SBarry Smith PetscErrorCode ierr; 2751273d9f13SBarry Smith 2752273d9f13SBarry Smith PetscFunctionBegin; 2753273d9f13SBarry Smith B->preallocated = PETSC_TRUE; 2754a868139aSShri Abhyankar 275534ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr); 275634ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr); 275734ef9618SShri Abhyankar 2758273d9f13SBarry Smith b = (Mat_SeqDense*)B->data; 275986d161a7SShri Abhyankar b->Mmax = B->rmap->n; 276086d161a7SShri Abhyankar b->Nmax = B->cmap->n; 276186d161a7SShri Abhyankar if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n; 276286d161a7SShri Abhyankar 2763220afb94SBarry Smith ierr = PetscIntMultError(b->lda,b->Nmax,NULL);CHKERRQ(ierr); 27649e8f95c4SLisandro Dalcin if (!data) { /* petsc-allocated storage */ 27659e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2766e92229d0SSatish Balay ierr = PetscCalloc1((size_t)b->lda*b->Nmax,&b->v);CHKERRQ(ierr); 27673bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)B,b->lda*b->Nmax*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 28241b807ce4Svictorle /*@C 28251b807ce4Svictorle MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array 28261b807ce4Svictorle 28271b807ce4Svictorle Input parameter: 28281b807ce4Svictorle + A - the matrix 28291b807ce4Svictorle - lda - the leading dimension 28301b807ce4Svictorle 28311b807ce4Svictorle Notes: 2832867c911aSBarry Smith This routine is to be used in conjunction with MatSeqDenseSetPreallocation(); 28331b807ce4Svictorle it asserts that the preallocation has a leading dimension (the LDA parameter 28341b807ce4Svictorle of Blas and Lapack fame) larger than M, the first dimension of the matrix. 28351b807ce4Svictorle 28361b807ce4Svictorle Level: intermediate 28371b807ce4Svictorle 2838284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize() 2839867c911aSBarry Smith 28401b807ce4Svictorle @*/ 28417087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetLDA(Mat B,PetscInt lda) 28421b807ce4Svictorle { 28431b807ce4Svictorle Mat_SeqDense *b = (Mat_SeqDense*)B->data; 2844*d5ea218eSStefano Zampini PetscBool flg; 2845*d5ea218eSStefano Zampini PetscErrorCode ierr; 284621a2c019SBarry Smith 28471b807ce4Svictorle PetscFunctionBegin; 2848*d5ea218eSStefano Zampini PetscValidHeaderSpecific(B,MAT_CLASSID,1); 2849*d5ea218eSStefano Zampini ierr = PetscObjectTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATSEQDENSECUDA,"");CHKERRQ(ierr); 2850*d5ea218eSStefano Zampini if (!flg) PetscFunctionReturn(0); 2851e32f2f54SBarry 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); 28521b807ce4Svictorle b->lda = lda; 285321a2c019SBarry Smith b->changelda = PETSC_FALSE; 285421a2c019SBarry Smith b->Mmax = PetscMax(b->Mmax,lda); 28551b807ce4Svictorle PetscFunctionReturn(0); 28561b807ce4Svictorle } 28571b807ce4Svictorle 2858d528f656SJakub Kruzik PetscErrorCode MatCreateMPIMatConcatenateSeqMat_SeqDense(MPI_Comm comm,Mat inmat,PetscInt n,MatReuse scall,Mat *outmat) 2859d528f656SJakub Kruzik { 2860d528f656SJakub Kruzik PetscErrorCode ierr; 2861d528f656SJakub Kruzik PetscMPIInt size; 2862d528f656SJakub Kruzik 2863d528f656SJakub Kruzik PetscFunctionBegin; 2864d528f656SJakub Kruzik ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 2865d528f656SJakub Kruzik if (size == 1) { 2866d528f656SJakub Kruzik if (scall == MAT_INITIAL_MATRIX) { 2867d528f656SJakub Kruzik ierr = MatDuplicate(inmat,MAT_COPY_VALUES,outmat);CHKERRQ(ierr); 2868d528f656SJakub Kruzik } else { 2869d528f656SJakub Kruzik ierr = MatCopy(inmat,*outmat,SAME_NONZERO_PATTERN);CHKERRQ(ierr); 2870d528f656SJakub Kruzik } 2871d528f656SJakub Kruzik } else { 2872d528f656SJakub Kruzik ierr = MatCreateMPIMatConcatenateSeqMat_MPIDense(comm,inmat,n,scall,outmat);CHKERRQ(ierr); 2873d528f656SJakub Kruzik } 2874d528f656SJakub Kruzik PetscFunctionReturn(0); 2875d528f656SJakub Kruzik } 2876d528f656SJakub Kruzik 28776947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVec_SeqDense(Mat A,PetscInt col,Vec *v) 28786947451fSStefano Zampini { 28796947451fSStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 28806947451fSStefano Zampini PetscErrorCode ierr; 28816947451fSStefano Zampini 28826947451fSStefano Zampini PetscFunctionBegin; 28836947451fSStefano Zampini if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec first"); 28846947451fSStefano Zampini if (!a->cvec) { 28856947451fSStefano Zampini ierr = VecCreateSeqWithArray(PetscObjectComm((PetscObject)A),A->rmap->bs,A->rmap->n,NULL,&a->cvec);CHKERRQ(ierr); 28866947451fSStefano Zampini } 28876947451fSStefano Zampini a->vecinuse = col + 1; 28886947451fSStefano Zampini ierr = MatDenseGetArray(A,(PetscScalar**)&a->ptrinuse);CHKERRQ(ierr); 28896947451fSStefano Zampini ierr = VecPlaceArray(a->cvec,a->ptrinuse + (size_t)col * (size_t)a->lda);CHKERRQ(ierr); 28906947451fSStefano Zampini *v = a->cvec; 28916947451fSStefano Zampini PetscFunctionReturn(0); 28926947451fSStefano Zampini } 28936947451fSStefano Zampini 28946947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVec_SeqDense(Mat A,PetscInt col,Vec *v) 28956947451fSStefano Zampini { 28966947451fSStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 28976947451fSStefano Zampini PetscErrorCode ierr; 28986947451fSStefano Zampini 28996947451fSStefano Zampini PetscFunctionBegin; 29006947451fSStefano Zampini if (!a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseGetColumnVec first"); 29016947451fSStefano Zampini if (!a->cvec) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing internal column vector"); 29026947451fSStefano Zampini a->vecinuse = 0; 29036947451fSStefano Zampini ierr = MatDenseRestoreArray(A,(PetscScalar**)&a->ptrinuse);CHKERRQ(ierr); 29046947451fSStefano Zampini ierr = VecResetArray(a->cvec);CHKERRQ(ierr); 29056947451fSStefano Zampini *v = NULL; 29066947451fSStefano Zampini PetscFunctionReturn(0); 29076947451fSStefano Zampini } 29086947451fSStefano Zampini 29096947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVecRead_SeqDense(Mat A,PetscInt col,Vec *v) 29106947451fSStefano Zampini { 29116947451fSStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 29126947451fSStefano Zampini PetscErrorCode ierr; 29136947451fSStefano Zampini 29146947451fSStefano Zampini PetscFunctionBegin; 29156947451fSStefano Zampini if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec first"); 29166947451fSStefano Zampini if (!a->cvec) { 29176947451fSStefano Zampini ierr = VecCreateSeqWithArray(PetscObjectComm((PetscObject)A),A->rmap->bs,A->rmap->n,NULL,&a->cvec);CHKERRQ(ierr); 29186947451fSStefano Zampini } 29196947451fSStefano Zampini a->vecinuse = col + 1; 29206947451fSStefano Zampini ierr = MatDenseGetArrayRead(A,&a->ptrinuse);CHKERRQ(ierr); 29216947451fSStefano Zampini ierr = VecPlaceArray(a->cvec,a->ptrinuse + (size_t)col * (size_t)a->lda);CHKERRQ(ierr); 29226947451fSStefano Zampini ierr = VecLockReadPush(a->cvec);CHKERRQ(ierr); 29236947451fSStefano Zampini *v = a->cvec; 29246947451fSStefano Zampini PetscFunctionReturn(0); 29256947451fSStefano Zampini } 29266947451fSStefano Zampini 29276947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVecRead_SeqDense(Mat A,PetscInt col,Vec *v) 29286947451fSStefano Zampini { 29296947451fSStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 29306947451fSStefano Zampini PetscErrorCode ierr; 29316947451fSStefano Zampini 29326947451fSStefano Zampini PetscFunctionBegin; 29336947451fSStefano Zampini if (!a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseGetColumnVec first"); 29346947451fSStefano Zampini if (!a->cvec) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing internal column vector"); 29356947451fSStefano Zampini a->vecinuse = 0; 29366947451fSStefano Zampini ierr = MatDenseRestoreArrayRead(A,&a->ptrinuse);CHKERRQ(ierr); 29376947451fSStefano Zampini ierr = VecLockReadPop(a->cvec);CHKERRQ(ierr); 29386947451fSStefano Zampini ierr = VecResetArray(a->cvec);CHKERRQ(ierr); 29396947451fSStefano Zampini *v = NULL; 29406947451fSStefano Zampini PetscFunctionReturn(0); 29416947451fSStefano Zampini } 29426947451fSStefano Zampini 29436947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVecWrite_SeqDense(Mat A,PetscInt col,Vec *v) 29446947451fSStefano Zampini { 29456947451fSStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 29466947451fSStefano Zampini PetscErrorCode ierr; 29476947451fSStefano Zampini 29486947451fSStefano Zampini PetscFunctionBegin; 29496947451fSStefano Zampini if (a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseRestoreColumnVec first"); 29506947451fSStefano Zampini if (!a->cvec) { 29516947451fSStefano Zampini ierr = VecCreateSeqWithArray(PetscObjectComm((PetscObject)A),A->rmap->bs,A->rmap->n,NULL,&a->cvec);CHKERRQ(ierr); 29526947451fSStefano Zampini } 29536947451fSStefano Zampini a->vecinuse = col + 1; 29546947451fSStefano Zampini ierr = MatDenseGetArrayWrite(A,(PetscScalar**)&a->ptrinuse);CHKERRQ(ierr); 29556947451fSStefano Zampini ierr = VecPlaceArray(a->cvec,a->ptrinuse + (size_t)col * (size_t)a->lda);CHKERRQ(ierr); 29566947451fSStefano Zampini *v = a->cvec; 29576947451fSStefano Zampini PetscFunctionReturn(0); 29586947451fSStefano Zampini } 29596947451fSStefano Zampini 29606947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVecWrite_SeqDense(Mat A,PetscInt col,Vec *v) 29616947451fSStefano Zampini { 29626947451fSStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 29636947451fSStefano Zampini PetscErrorCode ierr; 29646947451fSStefano Zampini 29656947451fSStefano Zampini PetscFunctionBegin; 29666947451fSStefano Zampini if (!a->vecinuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Need to call MatDenseGetColumnVec first"); 29676947451fSStefano Zampini if (!a->cvec) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing internal column vector"); 29686947451fSStefano Zampini a->vecinuse = 0; 29696947451fSStefano Zampini ierr = MatDenseRestoreArrayWrite(A,(PetscScalar**)&a->ptrinuse);CHKERRQ(ierr); 29706947451fSStefano Zampini ierr = VecResetArray(a->cvec);CHKERRQ(ierr); 29716947451fSStefano Zampini *v = NULL; 29726947451fSStefano Zampini PetscFunctionReturn(0); 29736947451fSStefano Zampini } 29746947451fSStefano Zampini 29750bad9183SKris Buschelman /*MC 2976fafad747SKris Buschelman MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices. 29770bad9183SKris Buschelman 29780bad9183SKris Buschelman Options Database Keys: 29790bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions() 29800bad9183SKris Buschelman 29810bad9183SKris Buschelman Level: beginner 29820bad9183SKris Buschelman 298389665df3SBarry Smith .seealso: MatCreateSeqDense() 298489665df3SBarry Smith 29850bad9183SKris Buschelman M*/ 2986ca15aa20SStefano Zampini PetscErrorCode MatCreate_SeqDense(Mat B) 2987273d9f13SBarry Smith { 2988273d9f13SBarry Smith Mat_SeqDense *b; 2989dfbe8321SBarry Smith PetscErrorCode ierr; 29907c334f02SBarry Smith PetscMPIInt size; 2991273d9f13SBarry Smith 2992273d9f13SBarry Smith PetscFunctionBegin; 2993ce94432eSBarry Smith ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr); 2994e32f2f54SBarry Smith if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1"); 299555659b69SBarry Smith 2996b00a9115SJed Brown ierr = PetscNewLog(B,&b);CHKERRQ(ierr); 2997549d3d68SSatish Balay ierr = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr); 299844cd7ae7SLois Curfman McInnes B->data = (void*)b; 299918f449edSLois Curfman McInnes 3000273d9f13SBarry Smith b->roworiented = PETSC_TRUE; 30014e220ebcSLois Curfman McInnes 300249a6ff4bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetLDA_C",MatDenseGetLDA_SeqDense);CHKERRQ(ierr); 3003bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr); 30048572280aSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr); 3005d3042a70SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDensePlaceArray_C",MatDensePlaceArray_SeqDense);CHKERRQ(ierr); 3006d3042a70SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseResetArray_C",MatDenseResetArray_SeqDense);CHKERRQ(ierr); 3007*d5ea218eSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseReplaceArray_C",MatDenseReplaceArray_SeqDense);CHKERRQ(ierr); 30088572280aSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArrayRead_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr); 3009715b7558SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArrayRead_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr); 30106947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArrayWrite_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr); 30116947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArrayWrite_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr); 3012bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr); 30138baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 30148baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr); 30158baccfbdSHong Zhang #endif 30162bf066beSStefano Zampini #if defined(PETSC_HAVE_CUDA) 30172bf066beSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqdensecuda_C",MatConvert_SeqDense_SeqDenseCUDA);CHKERRQ(ierr); 30184222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqdensecuda_seqdensecuda_C",MatProductSetFromOptions_SeqDense);CHKERRQ(ierr); 30194222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqdensecuda_seqdense_C",MatProductSetFromOptions_SeqDense);CHKERRQ(ierr); 3020637a0070SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqdense_seqdensecuda_C",MatProductSetFromOptions_SeqDense);CHKERRQ(ierr); 30214222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqaijcusparse_seqdense_C",MatProductSetFromOptions_SeqAIJ_SeqDense);CHKERRQ(ierr); 30222bf066beSStefano Zampini #endif 3023bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr); 30244222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqaij_seqdense_C",MatProductSetFromOptions_SeqAIJ_SeqDense);CHKERRQ(ierr); 30254222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqdense_seqdense_C",MatProductSetFromOptions_SeqDense);CHKERRQ(ierr); 3026bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 3027bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 30284222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqbaij_seqdense_C",MatProductSetFromOptions_SeqXBAIJ_SeqDense);CHKERRQ(ierr); 3029a001520aSPierre Jolivet ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqbaij_seqdense_C",MatMatMultSymbolic_SeqBAIJ_SeqDense);CHKERRQ(ierr); 3030a001520aSPierre Jolivet ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqbaij_seqdense_C",MatMatMultNumeric_SeqBAIJ_SeqDense);CHKERRQ(ierr); 30314222ddf1SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatProductSetFromOptions_seqsbaij_seqdense_C",MatProductSetFromOptions_SeqXBAIJ_SeqDense);CHKERRQ(ierr); 3032c2916339SPierre Jolivet ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqsbaij_seqdense_C",MatMatMultSymbolic_SeqSBAIJ_SeqDense);CHKERRQ(ierr); 3033c2916339SPierre Jolivet ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqsbaij_seqdense_C",MatMatMultNumeric_SeqSBAIJ_SeqDense);CHKERRQ(ierr); 30344099cc6bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaijperm_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 30354099cc6bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaijperm_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 3036e9e4f4a6SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaijsell_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 3037e9e4f4a6SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaijsell_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 303896e6d5c4SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaijmkl_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 303996e6d5c4SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaijmkl_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 304052c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_nest_seqdense_C",MatMatMultSymbolic_Nest_Dense);CHKERRQ(ierr); 304152c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_nest_seqdense_C",MatMatMultNumeric_Nest_Dense);CHKERRQ(ierr); 304296e6d5c4SRichard Tran Mills 30433bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 30443bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaij_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 30454099cc6bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaijperm_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 30464099cc6bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaijperm_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 3047e9e4f4a6SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaijsell_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 3048e9e4f4a6SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaijsell_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 304996e6d5c4SRichard Tran Mills 305096e6d5c4SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaijmkl_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 305196e6d5c4SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaijmkl_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 3052af53bab2SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumn_C",MatDenseGetColumn_SeqDense);CHKERRQ(ierr); 3053af53bab2SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumn_C",MatDenseRestoreColumn_SeqDense);CHKERRQ(ierr); 30546947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumnVec_C",MatDenseGetColumnVec_SeqDense);CHKERRQ(ierr); 30556947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumnVec_C",MatDenseRestoreColumnVec_SeqDense);CHKERRQ(ierr); 30566947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumnVecRead_C",MatDenseGetColumnVecRead_SeqDense);CHKERRQ(ierr); 30576947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumnVecRead_C",MatDenseRestoreColumnVecRead_SeqDense);CHKERRQ(ierr); 30586947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumnVecWrite_C",MatDenseGetColumnVecWrite_SeqDense);CHKERRQ(ierr); 30596947451fSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumnVecWrite_C",MatDenseRestoreColumnVecWrite_SeqDense);CHKERRQ(ierr); 306017667f90SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr); 30613a40ed3dSBarry Smith PetscFunctionReturn(0); 3062289bc588SBarry Smith } 306386aefd0dSHong Zhang 306486aefd0dSHong Zhang /*@C 3065af53bab2SHong 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. 306686aefd0dSHong Zhang 306786aefd0dSHong Zhang Not Collective 306886aefd0dSHong Zhang 306986aefd0dSHong Zhang Input Parameter: 307086aefd0dSHong Zhang + mat - a MATSEQDENSE or MATMPIDENSE matrix 307186aefd0dSHong Zhang - col - column index 307286aefd0dSHong Zhang 307386aefd0dSHong Zhang Output Parameter: 307486aefd0dSHong Zhang . vals - pointer to the data 307586aefd0dSHong Zhang 307686aefd0dSHong Zhang Level: intermediate 307786aefd0dSHong Zhang 307886aefd0dSHong Zhang .seealso: MatDenseRestoreColumn() 307986aefd0dSHong Zhang @*/ 308086aefd0dSHong Zhang PetscErrorCode MatDenseGetColumn(Mat A,PetscInt col,PetscScalar **vals) 308186aefd0dSHong Zhang { 308286aefd0dSHong Zhang PetscErrorCode ierr; 308386aefd0dSHong Zhang 308486aefd0dSHong Zhang PetscFunctionBegin; 3085*d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 3086*d5ea218eSStefano Zampini PetscValidLogicalCollectiveInt(A,col,2); 3087*d5ea218eSStefano Zampini PetscValidPointer(vals,3); 308886aefd0dSHong Zhang ierr = PetscUseMethod(A,"MatDenseGetColumn_C",(Mat,PetscInt,PetscScalar**),(A,col,vals));CHKERRQ(ierr); 308986aefd0dSHong Zhang PetscFunctionReturn(0); 309086aefd0dSHong Zhang } 309186aefd0dSHong Zhang 309286aefd0dSHong Zhang /*@C 309386aefd0dSHong Zhang MatDenseRestoreColumn - returns access to a column of a dense matrix which is returned by MatDenseGetColumn(). 309486aefd0dSHong Zhang 309586aefd0dSHong Zhang Not Collective 309686aefd0dSHong Zhang 309786aefd0dSHong Zhang Input Parameter: 309886aefd0dSHong Zhang . mat - a MATSEQDENSE or MATMPIDENSE matrix 309986aefd0dSHong Zhang 310086aefd0dSHong Zhang Output Parameter: 310186aefd0dSHong Zhang . vals - pointer to the data 310286aefd0dSHong Zhang 310386aefd0dSHong Zhang Level: intermediate 310486aefd0dSHong Zhang 310586aefd0dSHong Zhang .seealso: MatDenseGetColumn() 310686aefd0dSHong Zhang @*/ 310786aefd0dSHong Zhang PetscErrorCode MatDenseRestoreColumn(Mat A,PetscScalar **vals) 310886aefd0dSHong Zhang { 310986aefd0dSHong Zhang PetscErrorCode ierr; 311086aefd0dSHong Zhang 311186aefd0dSHong Zhang PetscFunctionBegin; 3112*d5ea218eSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 3113*d5ea218eSStefano Zampini PetscValidPointer(vals,2); 311486aefd0dSHong Zhang ierr = PetscUseMethod(A,"MatDenseRestoreColumn_C",(Mat,PetscScalar**),(A,vals));CHKERRQ(ierr); 311586aefd0dSHong Zhang PetscFunctionReturn(0); 311686aefd0dSHong Zhang } 31176947451fSStefano Zampini 31186947451fSStefano Zampini /*@C 31196947451fSStefano Zampini MatDenseGetColumnVec - Gives read-write access to a column of a dense matrix, represented as a Vec. 31206947451fSStefano Zampini 31216947451fSStefano Zampini Collective 31226947451fSStefano Zampini 31236947451fSStefano Zampini Input Parameter: 31246947451fSStefano Zampini + mat - the Mat object 31256947451fSStefano Zampini - col - the column index 31266947451fSStefano Zampini 31276947451fSStefano Zampini Output Parameter: 31286947451fSStefano Zampini . v - the vector 31296947451fSStefano Zampini 31306947451fSStefano Zampini Notes: 31316947451fSStefano Zampini The vector is owned by PETSc. Users need to call MatDenseRestoreColumnVec() when the vector is no longer needed. 31326947451fSStefano Zampini Use MatDenseGetColumnVecRead() to obtain read-only access or MatDenseGetColumnVecWrite() for write-only access. 31336947451fSStefano Zampini 31346947451fSStefano Zampini Level: intermediate 31356947451fSStefano Zampini 31366947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVecRead(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecRead(), MatDenseRestoreColumnVecWrite() 31376947451fSStefano Zampini @*/ 31386947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVec(Mat A,PetscInt col,Vec *v) 31396947451fSStefano Zampini { 31406947451fSStefano Zampini PetscErrorCode ierr; 31416947451fSStefano Zampini 31426947451fSStefano Zampini PetscFunctionBegin; 31436947451fSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 31446947451fSStefano Zampini PetscValidType(A,1); 31456947451fSStefano Zampini PetscValidLogicalCollectiveInt(A,col,2); 31466947451fSStefano Zampini PetscValidPointer(v,3); 31476947451fSStefano Zampini if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated"); 31486947451fSStefano 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); 31496947451fSStefano Zampini ierr = PetscUseMethod(A,"MatDenseGetColumnVec_C",(Mat,PetscInt,Vec*),(A,col,v));CHKERRQ(ierr); 31506947451fSStefano Zampini PetscFunctionReturn(0); 31516947451fSStefano Zampini } 31526947451fSStefano Zampini 31536947451fSStefano Zampini /*@C 31546947451fSStefano Zampini MatDenseRestoreColumnVec - Returns access to a column of a dense matrix obtained from MatDenseGetColumnVec(). 31556947451fSStefano Zampini 31566947451fSStefano Zampini Collective 31576947451fSStefano Zampini 31586947451fSStefano Zampini Input Parameter: 31596947451fSStefano Zampini + mat - the Mat object 31606947451fSStefano Zampini . col - the column index 31616947451fSStefano Zampini - v - the Vec object 31626947451fSStefano Zampini 31636947451fSStefano Zampini Level: intermediate 31646947451fSStefano Zampini 31656947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecRead(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVecRead(), MatDenseRestoreColumnVecWrite() 31666947451fSStefano Zampini @*/ 31676947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVec(Mat A,PetscInt col,Vec *v) 31686947451fSStefano Zampini { 31696947451fSStefano Zampini PetscErrorCode ierr; 31706947451fSStefano Zampini 31716947451fSStefano Zampini PetscFunctionBegin; 31726947451fSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 31736947451fSStefano Zampini PetscValidType(A,1); 31746947451fSStefano Zampini PetscValidLogicalCollectiveInt(A,col,2); 31756947451fSStefano Zampini PetscValidPointer(v,3); 31766947451fSStefano Zampini if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated"); 31776947451fSStefano 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); 31786947451fSStefano Zampini ierr = PetscUseMethod(A,"MatDenseRestoreColumnVec_C",(Mat,PetscInt,Vec*),(A,col,v));CHKERRQ(ierr); 31796947451fSStefano Zampini PetscFunctionReturn(0); 31806947451fSStefano Zampini } 31816947451fSStefano Zampini 31826947451fSStefano Zampini /*@C 31836947451fSStefano Zampini MatDenseGetColumnVecRead - Gives read-only access to a column of a dense matrix, represented as a Vec. 31846947451fSStefano Zampini 31856947451fSStefano Zampini Collective 31866947451fSStefano Zampini 31876947451fSStefano Zampini Input Parameter: 31886947451fSStefano Zampini + mat - the Mat object 31896947451fSStefano Zampini - col - the column index 31906947451fSStefano Zampini 31916947451fSStefano Zampini Output Parameter: 31926947451fSStefano Zampini . v - the vector 31936947451fSStefano Zampini 31946947451fSStefano Zampini Notes: 31956947451fSStefano Zampini The vector is owned by PETSc and users cannot modify it. 31966947451fSStefano Zampini Users need to call MatDenseRestoreColumnVecRead() when the vector is no longer needed. 31976947451fSStefano Zampini Use MatDenseGetColumnVec() to obtain read-write access or MatDenseGetColumnVecWrite() for write-only access. 31986947451fSStefano Zampini 31996947451fSStefano Zampini Level: intermediate 32006947451fSStefano Zampini 32016947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecRead(), MatDenseRestoreColumnVecWrite() 32026947451fSStefano Zampini @*/ 32036947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVecRead(Mat A,PetscInt col,Vec *v) 32046947451fSStefano Zampini { 32056947451fSStefano Zampini PetscErrorCode ierr; 32066947451fSStefano Zampini 32076947451fSStefano Zampini PetscFunctionBegin; 32086947451fSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 32096947451fSStefano Zampini PetscValidType(A,1); 32106947451fSStefano Zampini PetscValidLogicalCollectiveInt(A,col,2); 32116947451fSStefano Zampini PetscValidPointer(v,3); 32126947451fSStefano Zampini if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated"); 32136947451fSStefano 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); 32146947451fSStefano Zampini ierr = PetscUseMethod(A,"MatDenseGetColumnVecRead_C",(Mat,PetscInt,Vec*),(A,col,v));CHKERRQ(ierr); 32156947451fSStefano Zampini PetscFunctionReturn(0); 32166947451fSStefano Zampini } 32176947451fSStefano Zampini 32186947451fSStefano Zampini /*@C 32196947451fSStefano Zampini MatDenseRestoreColumnVecRead - Returns access to a column of a dense matrix obtained from MatDenseGetColumnVecRead(). 32206947451fSStefano Zampini 32216947451fSStefano Zampini Collective 32226947451fSStefano Zampini 32236947451fSStefano Zampini Input Parameter: 32246947451fSStefano Zampini + mat - the Mat object 32256947451fSStefano Zampini . col - the column index 32266947451fSStefano Zampini - v - the Vec object 32276947451fSStefano Zampini 32286947451fSStefano Zampini Level: intermediate 32296947451fSStefano Zampini 32306947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecRead(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecWrite() 32316947451fSStefano Zampini @*/ 32326947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVecRead(Mat A,PetscInt col,Vec *v) 32336947451fSStefano Zampini { 32346947451fSStefano Zampini PetscErrorCode ierr; 32356947451fSStefano Zampini 32366947451fSStefano Zampini PetscFunctionBegin; 32376947451fSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 32386947451fSStefano Zampini PetscValidType(A,1); 32396947451fSStefano Zampini PetscValidLogicalCollectiveInt(A,col,2); 32406947451fSStefano Zampini PetscValidPointer(v,3); 32416947451fSStefano Zampini if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated"); 32426947451fSStefano 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); 32436947451fSStefano Zampini ierr = PetscUseMethod(A,"MatDenseRestoreColumnVecRead_C",(Mat,PetscInt,Vec*),(A,col,v));CHKERRQ(ierr); 32446947451fSStefano Zampini PetscFunctionReturn(0); 32456947451fSStefano Zampini } 32466947451fSStefano Zampini 32476947451fSStefano Zampini /*@C 32486947451fSStefano Zampini MatDenseGetColumnVecWrite - Gives write-only access to a column of a dense matrix, represented as a Vec. 32496947451fSStefano Zampini 32506947451fSStefano Zampini Collective 32516947451fSStefano Zampini 32526947451fSStefano Zampini Input Parameter: 32536947451fSStefano Zampini + mat - the Mat object 32546947451fSStefano Zampini - col - the column index 32556947451fSStefano Zampini 32566947451fSStefano Zampini Output Parameter: 32576947451fSStefano Zampini . v - the vector 32586947451fSStefano Zampini 32596947451fSStefano Zampini Notes: 32606947451fSStefano Zampini The vector is owned by PETSc. Users need to call MatDenseRestoreColumnVecWrite() when the vector is no longer needed. 32616947451fSStefano Zampini Use MatDenseGetColumnVec() to obtain read-write access or MatDenseGetColumnVecRead() for read-only access. 32626947451fSStefano Zampini 32636947451fSStefano Zampini Level: intermediate 32646947451fSStefano Zampini 32656947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecRead(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecRead(), MatDenseRestoreColumnVecWrite() 32666947451fSStefano Zampini @*/ 32676947451fSStefano Zampini PetscErrorCode MatDenseGetColumnVecWrite(Mat A,PetscInt col,Vec *v) 32686947451fSStefano Zampini { 32696947451fSStefano Zampini PetscErrorCode ierr; 32706947451fSStefano Zampini 32716947451fSStefano Zampini PetscFunctionBegin; 32726947451fSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 32736947451fSStefano Zampini PetscValidType(A,1); 32746947451fSStefano Zampini PetscValidLogicalCollectiveInt(A,col,2); 32756947451fSStefano Zampini PetscValidPointer(v,3); 32766947451fSStefano Zampini if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated"); 32776947451fSStefano 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); 32786947451fSStefano Zampini ierr = PetscUseMethod(A,"MatDenseGetColumnVecWrite_C",(Mat,PetscInt,Vec*),(A,col,v));CHKERRQ(ierr); 32796947451fSStefano Zampini PetscFunctionReturn(0); 32806947451fSStefano Zampini } 32816947451fSStefano Zampini 32826947451fSStefano Zampini /*@C 32836947451fSStefano Zampini MatDenseRestoreColumnVecWrite - Returns access to a column of a dense matrix obtained from MatDenseGetColumnVecWrite(). 32846947451fSStefano Zampini 32856947451fSStefano Zampini Collective 32866947451fSStefano Zampini 32876947451fSStefano Zampini Input Parameter: 32886947451fSStefano Zampini + mat - the Mat object 32896947451fSStefano Zampini . col - the column index 32906947451fSStefano Zampini - v - the Vec object 32916947451fSStefano Zampini 32926947451fSStefano Zampini Level: intermediate 32936947451fSStefano Zampini 32946947451fSStefano Zampini .seealso: MATDENSE, MATDENSECUDA, MatDenseGetColumnVec(), MatDenseGetColumnVecRead(), MatDenseGetColumnVecWrite(), MatDenseRestoreColumnVec(), MatDenseRestoreColumnVecRead() 32956947451fSStefano Zampini @*/ 32966947451fSStefano Zampini PetscErrorCode MatDenseRestoreColumnVecWrite(Mat A,PetscInt col,Vec *v) 32976947451fSStefano Zampini { 32986947451fSStefano Zampini PetscErrorCode ierr; 32996947451fSStefano Zampini 33006947451fSStefano Zampini PetscFunctionBegin; 33016947451fSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,1); 33026947451fSStefano Zampini PetscValidType(A,1); 33036947451fSStefano Zampini PetscValidLogicalCollectiveInt(A,col,2); 33046947451fSStefano Zampini PetscValidPointer(v,3); 33056947451fSStefano Zampini if (!A->preallocated) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ORDER,"Matrix not preallocated"); 33066947451fSStefano 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); 33076947451fSStefano Zampini ierr = PetscUseMethod(A,"MatDenseRestoreColumnVecWrite_C",(Mat,PetscInt,Vec*),(A,col,v));CHKERRQ(ierr); 33086947451fSStefano Zampini PetscFunctionReturn(0); 33096947451fSStefano Zampini } 3310