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 118c178816SStefano Zampini static 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; 158c178816SStefano Zampini 168c178816SStefano Zampini PetscFunctionBegin; 178c178816SStefano Zampini if (A->rmap->n != A->cmap->n) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_SUP,"Cannot symmetrize a rectangular matrix"); 188c178816SStefano Zampini if (!hermitian) { 198c178816SStefano Zampini for (k=0;k<n;k++) { 208c178816SStefano Zampini for (j=k;j<n;j++) { 218c178816SStefano Zampini mat->v[j*mat->lda + k] = mat->v[k*mat->lda + j]; 228c178816SStefano Zampini } 238c178816SStefano Zampini } 248c178816SStefano Zampini } else { 258c178816SStefano Zampini for (k=0;k<n;k++) { 268c178816SStefano Zampini for (j=k;j<n;j++) { 278c178816SStefano Zampini mat->v[j*mat->lda + k] = PetscConj(mat->v[k*mat->lda + j]); 288c178816SStefano Zampini } 298c178816SStefano Zampini } 308c178816SStefano Zampini } 318c178816SStefano Zampini PetscFunctionReturn(0); 328c178816SStefano Zampini } 338c178816SStefano Zampini 3405709791SSatish Balay PETSC_EXTERN PetscErrorCode MatSeqDenseInvertFactors_Private(Mat A) 358c178816SStefano Zampini { 368c178816SStefano Zampini #if defined(PETSC_MISSING_LAPACK_POTRF) 378c178816SStefano Zampini PetscFunctionBegin; 388c178816SStefano Zampini SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable."); 398c178816SStefano Zampini #else 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); 578c178816SStefano Zampini ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr); /* TODO CHECK FLOPS */ 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); 828c178816SStefano Zampini ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr); /* TODO CHECK FLOPS */ 838c178816SStefano Zampini } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 848c178816SStefano Zampini #endif 858c178816SStefano Zampini 868c178816SStefano Zampini A->ops->solve = NULL; 878c178816SStefano Zampini A->ops->matsolve = NULL; 888c178816SStefano Zampini A->ops->solvetranspose = NULL; 898c178816SStefano Zampini A->ops->matsolvetranspose = NULL; 908c178816SStefano Zampini A->ops->solveadd = NULL; 918c178816SStefano Zampini A->ops->solvetransposeadd = NULL; 928c178816SStefano Zampini A->factortype = MAT_FACTOR_NONE; 938c178816SStefano Zampini ierr = PetscFree(A->solvertype);CHKERRQ(ierr); 948c178816SStefano Zampini PetscFunctionReturn(0); 958c178816SStefano Zampini } 968c178816SStefano Zampini 973f49a652SStefano Zampini PetscErrorCode MatZeroRowsColumns_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b) 983f49a652SStefano Zampini { 993f49a652SStefano Zampini PetscErrorCode ierr; 1003f49a652SStefano Zampini Mat_SeqDense *l = (Mat_SeqDense*)A->data; 1013f49a652SStefano Zampini PetscInt m = l->lda, n = A->cmap->n,r = A->rmap->n, i,j; 1023f49a652SStefano Zampini PetscScalar *slot,*bb; 1033f49a652SStefano Zampini const PetscScalar *xx; 1043f49a652SStefano Zampini 1053f49a652SStefano Zampini PetscFunctionBegin; 1063f49a652SStefano Zampini #if defined(PETSC_USE_DEBUG) 1073f49a652SStefano Zampini for (i=0; i<N; i++) { 1083f49a652SStefano Zampini if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed"); 1093f49a652SStefano 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); 1103f49a652SStefano 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); 1113f49a652SStefano Zampini } 1123f49a652SStefano Zampini #endif 1133f49a652SStefano Zampini 1143f49a652SStefano Zampini /* fix right hand side if needed */ 1153f49a652SStefano Zampini if (x && b) { 1163f49a652SStefano Zampini ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 1173f49a652SStefano Zampini ierr = VecGetArray(b,&bb);CHKERRQ(ierr); 1183f49a652SStefano Zampini for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]]; 1193f49a652SStefano Zampini ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 1203f49a652SStefano Zampini ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr); 1213f49a652SStefano Zampini } 1223f49a652SStefano Zampini 1233f49a652SStefano Zampini for (i=0; i<N; i++) { 1243f49a652SStefano Zampini slot = l->v + rows[i]*m; 1253f49a652SStefano Zampini ierr = PetscMemzero(slot,r*sizeof(PetscScalar));CHKERRQ(ierr); 1263f49a652SStefano Zampini } 1273f49a652SStefano Zampini for (i=0; i<N; i++) { 1283f49a652SStefano Zampini slot = l->v + rows[i]; 1293f49a652SStefano Zampini for (j=0; j<n; j++) { *slot = 0.0; slot += m;} 1303f49a652SStefano Zampini } 1313f49a652SStefano Zampini if (diag != 0.0) { 1323f49a652SStefano Zampini if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 1333f49a652SStefano Zampini for (i=0; i<N; i++) { 1343f49a652SStefano Zampini slot = l->v + (m+1)*rows[i]; 1353f49a652SStefano Zampini *slot = diag; 1363f49a652SStefano Zampini } 1373f49a652SStefano Zampini } 1383f49a652SStefano Zampini PetscFunctionReturn(0); 1393f49a652SStefano Zampini } 1403f49a652SStefano Zampini 141abc3b08eSStefano Zampini PetscErrorCode MatPtAPNumeric_SeqDense_SeqDense(Mat A,Mat P,Mat C) 142abc3b08eSStefano Zampini { 143abc3b08eSStefano Zampini Mat_SeqDense *c = (Mat_SeqDense*)(C->data); 144abc3b08eSStefano Zampini PetscErrorCode ierr; 145abc3b08eSStefano Zampini 146abc3b08eSStefano Zampini PetscFunctionBegin; 147abc3b08eSStefano Zampini ierr = MatMatMultNumeric_SeqDense_SeqDense(A,P,c->ptapwork);CHKERRQ(ierr); 148abc3b08eSStefano Zampini ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(P,c->ptapwork,C);CHKERRQ(ierr); 149abc3b08eSStefano Zampini PetscFunctionReturn(0); 150abc3b08eSStefano Zampini } 151abc3b08eSStefano Zampini 152abc3b08eSStefano Zampini PetscErrorCode MatPtAPSymbolic_SeqDense_SeqDense(Mat A,Mat P,PetscReal fill,Mat *C) 153abc3b08eSStefano Zampini { 154abc3b08eSStefano Zampini Mat_SeqDense *c; 155abc3b08eSStefano Zampini PetscErrorCode ierr; 156abc3b08eSStefano Zampini 157abc3b08eSStefano Zampini PetscFunctionBegin; 158abc3b08eSStefano Zampini ierr = MatCreateSeqDense(PetscObjectComm((PetscObject)A),P->cmap->N,P->cmap->N,NULL,C);CHKERRQ(ierr); 159abc3b08eSStefano Zampini c = (Mat_SeqDense*)((*C)->data); 160abc3b08eSStefano Zampini ierr = MatCreateSeqDense(PetscObjectComm((PetscObject)A),A->rmap->N,P->cmap->N,NULL,&c->ptapwork);CHKERRQ(ierr); 161abc3b08eSStefano Zampini PetscFunctionReturn(0); 162abc3b08eSStefano Zampini } 163abc3b08eSStefano Zampini 164150d2497SBarry Smith PETSC_INTERN PetscErrorCode MatPtAP_SeqDense_SeqDense(Mat A,Mat P,MatReuse reuse,PetscReal fill,Mat *C) 165abc3b08eSStefano Zampini { 166abc3b08eSStefano Zampini PetscErrorCode ierr; 167abc3b08eSStefano Zampini 168abc3b08eSStefano Zampini PetscFunctionBegin; 169abc3b08eSStefano Zampini if (reuse == MAT_INITIAL_MATRIX) { 170abc3b08eSStefano Zampini ierr = MatPtAPSymbolic_SeqDense_SeqDense(A,P,fill,C);CHKERRQ(ierr); 171abc3b08eSStefano Zampini } 172abc3b08eSStefano Zampini ierr = PetscLogEventBegin(MAT_PtAPNumeric,A,P,0,0);CHKERRQ(ierr); 173abc3b08eSStefano Zampini ierr = (*(*C)->ops->ptapnumeric)(A,P,*C);CHKERRQ(ierr); 174abc3b08eSStefano Zampini ierr = PetscLogEventEnd(MAT_PtAPNumeric,A,P,0,0);CHKERRQ(ierr); 175abc3b08eSStefano Zampini PetscFunctionReturn(0); 176abc3b08eSStefano Zampini } 177abc3b08eSStefano Zampini 178cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqAIJ_SeqDense(Mat A,MatType newtype,MatReuse reuse,Mat *newmat) 179b49cda9fSStefano Zampini { 180a13144ffSStefano Zampini Mat B = NULL; 181b49cda9fSStefano Zampini Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 182b49cda9fSStefano Zampini Mat_SeqDense *b; 183b49cda9fSStefano Zampini PetscErrorCode ierr; 184b49cda9fSStefano Zampini PetscInt *ai=a->i,*aj=a->j,m=A->rmap->N,n=A->cmap->N,i; 185b49cda9fSStefano Zampini MatScalar *av=a->a; 186a13144ffSStefano Zampini PetscBool isseqdense; 187b49cda9fSStefano Zampini 188b49cda9fSStefano Zampini PetscFunctionBegin; 189a13144ffSStefano Zampini if (reuse == MAT_REUSE_MATRIX) { 190a13144ffSStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)*newmat,MATSEQDENSE,&isseqdense);CHKERRQ(ierr); 191a13144ffSStefano Zampini if (!isseqdense) SETERRQ1(PetscObjectComm((PetscObject)*newmat),PETSC_ERR_USER,"Cannot reuse matrix of type %s",((PetscObject)(*newmat))->type); 192a13144ffSStefano Zampini } 193a13144ffSStefano Zampini if (reuse != MAT_REUSE_MATRIX) { 194b49cda9fSStefano Zampini ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); 195b49cda9fSStefano Zampini ierr = MatSetSizes(B,m,n,m,n);CHKERRQ(ierr); 196b49cda9fSStefano Zampini ierr = MatSetType(B,MATSEQDENSE);CHKERRQ(ierr); 197b49cda9fSStefano Zampini ierr = MatSeqDenseSetPreallocation(B,NULL);CHKERRQ(ierr); 198b49cda9fSStefano Zampini b = (Mat_SeqDense*)(B->data); 199a13144ffSStefano Zampini } else { 200a13144ffSStefano Zampini b = (Mat_SeqDense*)((*newmat)->data); 201a13144ffSStefano Zampini ierr = PetscMemzero(b->v,m*n*sizeof(PetscScalar));CHKERRQ(ierr); 202a13144ffSStefano Zampini } 203b49cda9fSStefano Zampini for (i=0; i<m; i++) { 204b49cda9fSStefano Zampini PetscInt j; 205b49cda9fSStefano Zampini for (j=0;j<ai[1]-ai[0];j++) { 206b49cda9fSStefano Zampini b->v[*aj*m+i] = *av; 207b49cda9fSStefano Zampini aj++; 208b49cda9fSStefano Zampini av++; 209b49cda9fSStefano Zampini } 210b49cda9fSStefano Zampini ai++; 211b49cda9fSStefano Zampini } 212b49cda9fSStefano Zampini 213511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 214a13144ffSStefano Zampini ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 215a13144ffSStefano Zampini ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 21628be2f97SBarry Smith ierr = MatHeaderReplace(A,&B);CHKERRQ(ierr); 217b49cda9fSStefano Zampini } else { 218a13144ffSStefano Zampini if (B) *newmat = B; 219a13144ffSStefano Zampini ierr = MatAssemblyBegin(*newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 220a13144ffSStefano Zampini ierr = MatAssemblyEnd(*newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 221b49cda9fSStefano Zampini } 222b49cda9fSStefano Zampini PetscFunctionReturn(0); 223b49cda9fSStefano Zampini } 224b49cda9fSStefano Zampini 225cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqDense_SeqAIJ(Mat A, MatType newtype,MatReuse reuse,Mat *newmat) 2266a63e612SBarry Smith { 2276a63e612SBarry Smith Mat B; 2286a63e612SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2296a63e612SBarry Smith PetscErrorCode ierr; 2309399e1b8SMatthew G. Knepley PetscInt i, j; 2319399e1b8SMatthew G. Knepley PetscInt *rows, *nnz; 2329399e1b8SMatthew G. Knepley MatScalar *aa = a->v, *vals; 2336a63e612SBarry Smith 2346a63e612SBarry Smith PetscFunctionBegin; 235ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); 2366a63e612SBarry Smith ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 2376a63e612SBarry Smith ierr = MatSetType(B,MATSEQAIJ);CHKERRQ(ierr); 2389399e1b8SMatthew G. Knepley ierr = PetscCalloc3(A->rmap->n,&rows,A->rmap->n,&nnz,A->rmap->n,&vals);CHKERRQ(ierr); 2399399e1b8SMatthew G. Knepley for (j=0; j<A->cmap->n; j++) { 2409399e1b8SMatthew G. Knepley for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) ++nnz[i]; 2416a63e612SBarry Smith aa += a->lda; 2426a63e612SBarry Smith } 2439399e1b8SMatthew G. Knepley ierr = MatSeqAIJSetPreallocation(B,PETSC_DETERMINE,nnz);CHKERRQ(ierr); 2449399e1b8SMatthew G. Knepley aa = a->v; 2459399e1b8SMatthew G. Knepley for (j=0; j<A->cmap->n; j++) { 2469399e1b8SMatthew G. Knepley PetscInt numRows = 0; 2479399e1b8SMatthew G. Knepley for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) {rows[numRows] = i; vals[numRows++] = aa[i];} 2489399e1b8SMatthew G. Knepley ierr = MatSetValues(B,numRows,rows,1,&j,vals,INSERT_VALUES);CHKERRQ(ierr); 2499399e1b8SMatthew G. Knepley aa += a->lda; 2509399e1b8SMatthew G. Knepley } 2519399e1b8SMatthew G. Knepley ierr = PetscFree3(rows,nnz,vals);CHKERRQ(ierr); 2526a63e612SBarry Smith ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2536a63e612SBarry Smith ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2546a63e612SBarry Smith 255511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 25628be2f97SBarry Smith ierr = MatHeaderReplace(A,&B);CHKERRQ(ierr); 2576a63e612SBarry Smith } else { 2586a63e612SBarry Smith *newmat = B; 2596a63e612SBarry Smith } 2606a63e612SBarry Smith PetscFunctionReturn(0); 2616a63e612SBarry Smith } 2626a63e612SBarry Smith 263e0877f53SBarry Smith static PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str) 2641987afe7SBarry Smith { 2651987afe7SBarry Smith Mat_SeqDense *x = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data; 266f4df32b1SMatthew Knepley PetscScalar oalpha = alpha; 26713f74950SBarry Smith PetscInt j; 2680805154bSBarry Smith PetscBLASInt N,m,ldax,lday,one = 1; 269efee365bSSatish Balay PetscErrorCode ierr; 2703a40ed3dSBarry Smith 2713a40ed3dSBarry Smith PetscFunctionBegin; 272c5df96a5SBarry Smith ierr = PetscBLASIntCast(X->rmap->n*X->cmap->n,&N);CHKERRQ(ierr); 273c5df96a5SBarry Smith ierr = PetscBLASIntCast(X->rmap->n,&m);CHKERRQ(ierr); 274c5df96a5SBarry Smith ierr = PetscBLASIntCast(x->lda,&ldax);CHKERRQ(ierr); 275c5df96a5SBarry Smith ierr = PetscBLASIntCast(y->lda,&lday);CHKERRQ(ierr); 276a5ce6ee0Svictorle if (ldax>m || lday>m) { 277d0f46423SBarry Smith for (j=0; j<X->cmap->n; j++) { 2788b83055fSJed Brown PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&m,&oalpha,x->v+j*ldax,&one,y->v+j*lday,&one)); 279a5ce6ee0Svictorle } 280a5ce6ee0Svictorle } else { 2818b83055fSJed Brown PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&N,&oalpha,x->v,&one,y->v,&one)); 282a5ce6ee0Svictorle } 283a3fa217bSJose E. Roman ierr = PetscObjectStateIncrease((PetscObject)Y);CHKERRQ(ierr); 2840450473dSBarry Smith ierr = PetscLogFlops(PetscMax(2*N-1,0));CHKERRQ(ierr); 2853a40ed3dSBarry Smith PetscFunctionReturn(0); 2861987afe7SBarry Smith } 2871987afe7SBarry Smith 288e0877f53SBarry Smith static PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info) 289289bc588SBarry Smith { 290d0f46423SBarry Smith PetscInt N = A->rmap->n*A->cmap->n; 2913a40ed3dSBarry Smith 2923a40ed3dSBarry Smith PetscFunctionBegin; 2934e220ebcSLois Curfman McInnes info->block_size = 1.0; 2944e220ebcSLois Curfman McInnes info->nz_allocated = (double)N; 2956de62eeeSBarry Smith info->nz_used = (double)N; 2966de62eeeSBarry Smith info->nz_unneeded = (double)0; 2974e220ebcSLois Curfman McInnes info->assemblies = (double)A->num_ass; 2984e220ebcSLois Curfman McInnes info->mallocs = 0; 2997adad957SLisandro Dalcin info->memory = ((PetscObject)A)->mem; 3004e220ebcSLois Curfman McInnes info->fill_ratio_given = 0; 3014e220ebcSLois Curfman McInnes info->fill_ratio_needed = 0; 3024e220ebcSLois Curfman McInnes info->factor_mallocs = 0; 3033a40ed3dSBarry Smith PetscFunctionReturn(0); 304289bc588SBarry Smith } 305289bc588SBarry Smith 306e0877f53SBarry Smith static PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha) 30780cd9d93SLois Curfman McInnes { 308273d9f13SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 309f4df32b1SMatthew Knepley PetscScalar oalpha = alpha; 310efee365bSSatish Balay PetscErrorCode ierr; 311c5df96a5SBarry Smith PetscBLASInt one = 1,j,nz,lda; 31280cd9d93SLois Curfman McInnes 3133a40ed3dSBarry Smith PetscFunctionBegin; 314c5df96a5SBarry Smith ierr = PetscBLASIntCast(a->lda,&lda);CHKERRQ(ierr); 315d0f46423SBarry Smith if (lda>A->rmap->n) { 316c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&nz);CHKERRQ(ierr); 317d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 3188b83055fSJed Brown PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v+j*lda,&one)); 319a5ce6ee0Svictorle } 320a5ce6ee0Svictorle } else { 321c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n*A->cmap->n,&nz);CHKERRQ(ierr); 3228b83055fSJed Brown PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v,&one)); 323a5ce6ee0Svictorle } 324efee365bSSatish Balay ierr = PetscLogFlops(nz);CHKERRQ(ierr); 3253a40ed3dSBarry Smith PetscFunctionReturn(0); 32680cd9d93SLois Curfman McInnes } 32780cd9d93SLois Curfman McInnes 328e0877f53SBarry Smith static PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscBool *fl) 3291cbb95d3SBarry Smith { 3301cbb95d3SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 331d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,N; 3321cbb95d3SBarry Smith PetscScalar *v = a->v; 3331cbb95d3SBarry Smith 3341cbb95d3SBarry Smith PetscFunctionBegin; 3351cbb95d3SBarry Smith *fl = PETSC_FALSE; 336d0f46423SBarry Smith if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0); 3371cbb95d3SBarry Smith N = a->lda; 3381cbb95d3SBarry Smith 3391cbb95d3SBarry Smith for (i=0; i<m; i++) { 3401cbb95d3SBarry Smith for (j=i+1; j<m; j++) { 3411cbb95d3SBarry Smith if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) PetscFunctionReturn(0); 3421cbb95d3SBarry Smith } 3431cbb95d3SBarry Smith } 3441cbb95d3SBarry Smith *fl = PETSC_TRUE; 3451cbb95d3SBarry Smith PetscFunctionReturn(0); 3461cbb95d3SBarry Smith } 3471cbb95d3SBarry Smith 348e0877f53SBarry Smith static PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat newi,Mat A,MatDuplicateOption cpvalues) 349b24902e0SBarry Smith { 350b24902e0SBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data,*l; 351b24902e0SBarry Smith PetscErrorCode ierr; 352b24902e0SBarry Smith PetscInt lda = (PetscInt)mat->lda,j,m; 353b24902e0SBarry Smith 354b24902e0SBarry Smith PetscFunctionBegin; 355aa5ea44dSBarry Smith ierr = PetscLayoutReference(A->rmap,&newi->rmap);CHKERRQ(ierr); 356aa5ea44dSBarry Smith ierr = PetscLayoutReference(A->cmap,&newi->cmap);CHKERRQ(ierr); 3570298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newi,NULL);CHKERRQ(ierr); 358b24902e0SBarry Smith if (cpvalues == MAT_COPY_VALUES) { 359b24902e0SBarry Smith l = (Mat_SeqDense*)newi->data; 360d0f46423SBarry Smith if (lda>A->rmap->n) { 361d0f46423SBarry Smith m = A->rmap->n; 362d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 363b24902e0SBarry Smith ierr = PetscMemcpy(l->v+j*m,mat->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 364b24902e0SBarry Smith } 365b24902e0SBarry Smith } else { 366d0f46423SBarry Smith ierr = PetscMemcpy(l->v,mat->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 367b24902e0SBarry Smith } 368b24902e0SBarry Smith } 369b24902e0SBarry Smith newi->assembled = PETSC_TRUE; 370b24902e0SBarry Smith PetscFunctionReturn(0); 371b24902e0SBarry Smith } 372b24902e0SBarry Smith 373e0877f53SBarry Smith static PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat) 37402cad45dSBarry Smith { 3756849ba73SBarry Smith PetscErrorCode ierr; 37602cad45dSBarry Smith 3773a40ed3dSBarry Smith PetscFunctionBegin; 378ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),newmat);CHKERRQ(ierr); 379d0f46423SBarry Smith ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 3805c9eb25fSBarry Smith ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 381719d5645SBarry Smith ierr = MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues);CHKERRQ(ierr); 382b24902e0SBarry Smith PetscFunctionReturn(0); 383b24902e0SBarry Smith } 384b24902e0SBarry Smith 3856ee01492SSatish Balay 386e0877f53SBarry Smith static PetscErrorCode MatLUFactor_SeqDense(Mat,IS,IS,const MatFactorInfo*); 387719d5645SBarry Smith 388e0877f53SBarry Smith static PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 389289bc588SBarry Smith { 3904482741eSBarry Smith MatFactorInfo info; 391a093e273SMatthew Knepley PetscErrorCode ierr; 3923a40ed3dSBarry Smith 3933a40ed3dSBarry Smith PetscFunctionBegin; 394c3ef05f6SHong Zhang ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 395719d5645SBarry Smith ierr = MatLUFactor_SeqDense(fact,0,0,&info);CHKERRQ(ierr); 3963a40ed3dSBarry Smith PetscFunctionReturn(0); 397289bc588SBarry Smith } 3986ee01492SSatish Balay 399e0877f53SBarry Smith static PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy) 400289bc588SBarry Smith { 401c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 4026849ba73SBarry Smith PetscErrorCode ierr; 403f1ceaac6SMatthew G. Knepley const PetscScalar *x; 404f1ceaac6SMatthew G. Knepley PetscScalar *y; 405c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 40667e560aaSBarry Smith 4073a40ed3dSBarry Smith PetscFunctionBegin; 408c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 409f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 4101ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 411d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 412d5f3da31SBarry Smith if (A->factortype == MAT_FACTOR_LU) { 413ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 414e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 415ae7cfcebSSatish Balay #else 41600121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 4178b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 41800121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 419e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 420ae7cfcebSSatish Balay #endif 421d5f3da31SBarry Smith } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 422ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 423e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 424ae7cfcebSSatish Balay #else 425a49dc2a2SStefano Zampini if (A->spd) { 42600121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 4278b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 42800121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 429e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 430a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX) 431a49dc2a2SStefano Zampini } else if (A->hermitian) { 43200121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 433a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKhetrs",LAPACKhetrs_("L",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 43400121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 435a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"HETRS Bad solve"); 436a49dc2a2SStefano Zampini #endif 437a49dc2a2SStefano Zampini } else { /* symmetric case */ 43800121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 439a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrs",LAPACKsytrs_("L",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 44000121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 441a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"SYTRS Bad solve"); 442a49dc2a2SStefano Zampini } 443ae7cfcebSSatish Balay #endif 4442205254eSKarl Rupp } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 445f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 4461ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 447dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 4483a40ed3dSBarry Smith PetscFunctionReturn(0); 449289bc588SBarry Smith } 4506ee01492SSatish Balay 451e0877f53SBarry Smith static PetscErrorCode MatMatSolve_SeqDense(Mat A,Mat B,Mat X) 45285e2c93fSHong Zhang { 45385e2c93fSHong Zhang Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 45485e2c93fSHong Zhang PetscErrorCode ierr; 45585e2c93fSHong Zhang PetscScalar *b,*x; 456efb80c78SLisandro Dalcin PetscInt n; 457783b601eSJed Brown PetscBLASInt nrhs,info,m; 458bda8bf91SBarry Smith PetscBool flg; 45985e2c93fSHong Zhang 46085e2c93fSHong Zhang PetscFunctionBegin; 461c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 4620298fd71SBarry Smith ierr = PetscObjectTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr); 463ce94432eSBarry Smith if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix B must be MATDENSE matrix"); 4640298fd71SBarry Smith ierr = PetscObjectTypeCompareAny((PetscObject)X,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr); 465ce94432eSBarry Smith if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix X must be MATDENSE matrix"); 466bda8bf91SBarry Smith 4670298fd71SBarry Smith ierr = MatGetSize(B,NULL,&n);CHKERRQ(ierr); 468c5df96a5SBarry Smith ierr = PetscBLASIntCast(n,&nrhs);CHKERRQ(ierr); 4698c778c55SBarry Smith ierr = MatDenseGetArray(B,&b);CHKERRQ(ierr); 4708c778c55SBarry Smith ierr = MatDenseGetArray(X,&x);CHKERRQ(ierr); 47185e2c93fSHong Zhang 472f272c775SHong Zhang ierr = PetscMemcpy(x,b,m*nrhs*sizeof(PetscScalar));CHKERRQ(ierr); 47385e2c93fSHong Zhang 47485e2c93fSHong Zhang if (A->factortype == MAT_FACTOR_LU) { 47585e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_GETRS) 47685e2c93fSHong Zhang SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 47785e2c93fSHong Zhang #else 47800121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 4798b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info)); 48000121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 48185e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 48285e2c93fSHong Zhang #endif 48385e2c93fSHong Zhang } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 48485e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_POTRS) 48585e2c93fSHong Zhang SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 48685e2c93fSHong Zhang #else 487a49dc2a2SStefano Zampini if (A->spd) { 48800121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 4898b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info)); 49000121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 49185e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 492a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX) 493a49dc2a2SStefano Zampini } else if (A->hermitian) { 49400121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 495a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKhetrs",LAPACKhetrs_("L",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info)); 49600121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 497a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"HETRS Bad solve"); 498a49dc2a2SStefano Zampini #endif 499a49dc2a2SStefano Zampini } else { /* symmetric case */ 50000121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 501a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrs",LAPACKsytrs_("L",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info)); 50200121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 503a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"SYTRS Bad solve"); 504a49dc2a2SStefano Zampini } 50585e2c93fSHong Zhang #endif 5062205254eSKarl Rupp } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 50785e2c93fSHong Zhang 5088c778c55SBarry Smith ierr = MatDenseRestoreArray(B,&b);CHKERRQ(ierr); 5098c778c55SBarry Smith ierr = MatDenseRestoreArray(X,&x);CHKERRQ(ierr); 51085e2c93fSHong Zhang ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr); 51185e2c93fSHong Zhang PetscFunctionReturn(0); 51285e2c93fSHong Zhang } 51385e2c93fSHong Zhang 51400121966SStefano Zampini static PetscErrorCode MatConjugate_SeqDense(Mat); 51500121966SStefano Zampini 516e0877f53SBarry Smith static PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy) 517da3a660dSBarry Smith { 518c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 519dfbe8321SBarry Smith PetscErrorCode ierr; 520f1ceaac6SMatthew G. Knepley const PetscScalar *x; 521f1ceaac6SMatthew G. Knepley PetscScalar *y; 522c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 52367e560aaSBarry Smith 5243a40ed3dSBarry Smith PetscFunctionBegin; 525c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 526f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 5271ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 528d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 5298208b9aeSStefano Zampini if (A->factortype == MAT_FACTOR_LU) { 530ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 531e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 532ae7cfcebSSatish Balay #else 53300121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 5348b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 53500121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 536e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve"); 537ae7cfcebSSatish Balay #endif 5388208b9aeSStefano Zampini } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 539ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 540e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 541ae7cfcebSSatish Balay #else 542a49dc2a2SStefano Zampini if (A->spd) { 54300121966SStefano Zampini #if defined(PETSC_USE_COMPLEX) 54400121966SStefano Zampini ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr); 54500121966SStefano Zampini #endif 54600121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 5478b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 54800121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 54900121966SStefano Zampini #if defined(PETSC_USE_COMPLEX) 55000121966SStefano Zampini ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr); 55100121966SStefano Zampini #endif 552a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 553a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX) 554a49dc2a2SStefano Zampini } else if (A->hermitian) { 55500121966SStefano Zampini ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr); 55600121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 55700121966SStefano Zampini PetscStackCallBLAS("LAPACKhetrs",LAPACKhetrs_("L",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 55800121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 55900121966SStefano Zampini ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr); 560ae7cfcebSSatish Balay #endif 561a49dc2a2SStefano Zampini } else { /* symmetric case */ 56200121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 563a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrs",LAPACKsytrs_("L",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 56400121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 565a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"SYTRS Bad solve"); 566da3a660dSBarry Smith } 567a49dc2a2SStefano Zampini #endif 568a49dc2a2SStefano Zampini } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 569f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 5701ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 571dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 5723a40ed3dSBarry Smith PetscFunctionReturn(0); 573da3a660dSBarry Smith } 5746ee01492SSatish Balay 575e0877f53SBarry Smith static PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 576da3a660dSBarry Smith { 577dfbe8321SBarry Smith PetscErrorCode ierr; 578f1ceaac6SMatthew G. Knepley const PetscScalar *x; 579f1ceaac6SMatthew G. Knepley PetscScalar *y,sone = 1.0; 580da3a660dSBarry Smith Vec tmp = 0; 58167e560aaSBarry Smith 5823a40ed3dSBarry Smith PetscFunctionBegin; 583f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 5841ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 585d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 586da3a660dSBarry Smith if (yy == zz) { 58778b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 5883bb1ff40SBarry Smith ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr); 58978b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 590da3a660dSBarry Smith } 5918208b9aeSStefano Zampini ierr = MatSolve_SeqDense(A,xx,yy);CHKERRQ(ierr); 5926bf464f9SBarry Smith if (tmp) { 5936bf464f9SBarry Smith ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); 5946bf464f9SBarry Smith ierr = VecDestroy(&tmp);CHKERRQ(ierr); 5956bf464f9SBarry Smith } else { 5966bf464f9SBarry Smith ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr); 5976bf464f9SBarry Smith } 598f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 5991ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 6008208b9aeSStefano Zampini ierr = PetscLogFlops(A->cmap->n);CHKERRQ(ierr); 6013a40ed3dSBarry Smith PetscFunctionReturn(0); 602da3a660dSBarry Smith } 60367e560aaSBarry Smith 604e0877f53SBarry Smith static PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 605da3a660dSBarry Smith { 6066849ba73SBarry Smith PetscErrorCode ierr; 607f1ceaac6SMatthew G. Knepley const PetscScalar *x; 608f1ceaac6SMatthew G. Knepley PetscScalar *y,sone = 1.0; 60989ae1891SBarry Smith Vec tmp = NULL; 61067e560aaSBarry Smith 6113a40ed3dSBarry Smith PetscFunctionBegin; 612d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 613f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 6141ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 615da3a660dSBarry Smith if (yy == zz) { 61678b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 6173bb1ff40SBarry Smith ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr); 61878b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 619da3a660dSBarry Smith } 6208208b9aeSStefano Zampini ierr = MatSolveTranspose_SeqDense(A,xx,yy);CHKERRQ(ierr); 62190f02eecSBarry Smith if (tmp) { 6222dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); 6236bf464f9SBarry Smith ierr = VecDestroy(&tmp);CHKERRQ(ierr); 6243a40ed3dSBarry Smith } else { 6252dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr); 62690f02eecSBarry Smith } 627f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 6281ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 6298208b9aeSStefano Zampini ierr = PetscLogFlops(A->cmap->n);CHKERRQ(ierr); 6303a40ed3dSBarry Smith PetscFunctionReturn(0); 631da3a660dSBarry Smith } 632db4efbfdSBarry Smith 633db4efbfdSBarry Smith /* ---------------------------------------------------------------*/ 634db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots, 635db4efbfdSBarry Smith rather than put it in the Mat->row slot.*/ 636e0877f53SBarry Smith static PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo) 637db4efbfdSBarry Smith { 638db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF) 639db4efbfdSBarry Smith PetscFunctionBegin; 640e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable."); 641db4efbfdSBarry Smith #else 642db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 643db4efbfdSBarry Smith PetscErrorCode ierr; 644db4efbfdSBarry Smith PetscBLASInt n,m,info; 645db4efbfdSBarry Smith 646db4efbfdSBarry Smith PetscFunctionBegin; 647c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 648c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 649db4efbfdSBarry Smith if (!mat->pivots) { 6508208b9aeSStefano Zampini ierr = PetscMalloc1(A->rmap->n,&mat->pivots);CHKERRQ(ierr); 6513bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr); 652db4efbfdSBarry Smith } 653db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 6548e57ea43SSatish Balay ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 6558b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrf",LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info)); 6568e57ea43SSatish Balay ierr = PetscFPTrapPop();CHKERRQ(ierr); 6578e57ea43SSatish Balay 658e32f2f54SBarry Smith if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization"); 659e32f2f54SBarry Smith if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization"); 6608208b9aeSStefano Zampini 661db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 6628208b9aeSStefano Zampini A->ops->matsolve = MatMatSolve_SeqDense; 663db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 664db4efbfdSBarry Smith A->ops->solveadd = MatSolveAdd_SeqDense; 665db4efbfdSBarry Smith A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 666d5f3da31SBarry Smith A->factortype = MAT_FACTOR_LU; 667db4efbfdSBarry Smith 668f6224b95SHong Zhang ierr = PetscFree(A->solvertype);CHKERRQ(ierr); 669f6224b95SHong Zhang ierr = PetscStrallocpy(MATSOLVERPETSC,&A->solvertype);CHKERRQ(ierr); 670f6224b95SHong Zhang 671dc0b31edSSatish Balay ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr); 672db4efbfdSBarry Smith #endif 673db4efbfdSBarry Smith PetscFunctionReturn(0); 674db4efbfdSBarry Smith } 675db4efbfdSBarry Smith 676a49dc2a2SStefano Zampini /* Cholesky as L*L^T or L*D*L^T and the symmetric/hermitian complex variants */ 677e0877f53SBarry Smith static PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo) 678db4efbfdSBarry Smith { 679db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF) 680db4efbfdSBarry Smith PetscFunctionBegin; 681e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable."); 682db4efbfdSBarry Smith #else 683db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 684db4efbfdSBarry Smith PetscErrorCode ierr; 685c5df96a5SBarry Smith PetscBLASInt info,n; 686db4efbfdSBarry Smith 687db4efbfdSBarry Smith PetscFunctionBegin; 688c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 689db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 690a49dc2a2SStefano Zampini if (A->spd) { 69100121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 6928b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrf",LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info)); 69300121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 694a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX) 695a49dc2a2SStefano Zampini } else if (A->hermitian) { 696a49dc2a2SStefano Zampini if (!mat->pivots) { 697a49dc2a2SStefano Zampini ierr = PetscMalloc1(A->rmap->n,&mat->pivots);CHKERRQ(ierr); 698a49dc2a2SStefano Zampini ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr); 699a49dc2a2SStefano Zampini } 700a49dc2a2SStefano Zampini if (!mat->fwork) { 701a49dc2a2SStefano Zampini PetscScalar dummy; 702a49dc2a2SStefano Zampini 703a49dc2a2SStefano Zampini mat->lfwork = -1; 70400121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 705a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKhetrf",LAPACKhetrf_("L",&n,mat->v,&mat->lda,mat->pivots,&dummy,&mat->lfwork,&info)); 70600121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 707a49dc2a2SStefano Zampini mat->lfwork = (PetscInt)PetscRealPart(dummy); 708a49dc2a2SStefano Zampini ierr = PetscMalloc1(mat->lfwork,&mat->fwork);CHKERRQ(ierr); 709a49dc2a2SStefano Zampini ierr = PetscLogObjectMemory((PetscObject)A,mat->lfwork*sizeof(PetscBLASInt));CHKERRQ(ierr); 710a49dc2a2SStefano Zampini } 71100121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 712a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKhetrf",LAPACKhetrf_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&mat->lfwork,&info)); 71300121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 714a49dc2a2SStefano Zampini #endif 715a49dc2a2SStefano Zampini } else { /* symmetric case */ 716a49dc2a2SStefano Zampini if (!mat->pivots) { 717a49dc2a2SStefano Zampini ierr = PetscMalloc1(A->rmap->n,&mat->pivots);CHKERRQ(ierr); 718a49dc2a2SStefano Zampini ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr); 719a49dc2a2SStefano Zampini } 720a49dc2a2SStefano Zampini if (!mat->fwork) { 721a49dc2a2SStefano Zampini PetscScalar dummy; 722a49dc2a2SStefano Zampini 723a49dc2a2SStefano Zampini mat->lfwork = -1; 72400121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 725a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrf",LAPACKsytrf_("L",&n,mat->v,&mat->lda,mat->pivots,&dummy,&mat->lfwork,&info)); 72600121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 727a49dc2a2SStefano Zampini mat->lfwork = (PetscInt)PetscRealPart(dummy); 728a49dc2a2SStefano Zampini ierr = PetscMalloc1(mat->lfwork,&mat->fwork);CHKERRQ(ierr); 729a49dc2a2SStefano Zampini ierr = PetscLogObjectMemory((PetscObject)A,mat->lfwork*sizeof(PetscBLASInt));CHKERRQ(ierr); 730a49dc2a2SStefano Zampini } 73100121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 732a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrf",LAPACKsytrf_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&mat->lfwork,&info)); 73300121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 734a49dc2a2SStefano Zampini } 735e32f2f54SBarry Smith if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1); 7368208b9aeSStefano Zampini 737db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 7388208b9aeSStefano Zampini A->ops->matsolve = MatMatSolve_SeqDense; 739db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 740db4efbfdSBarry Smith A->ops->solveadd = MatSolveAdd_SeqDense; 741db4efbfdSBarry Smith A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 742d5f3da31SBarry Smith A->factortype = MAT_FACTOR_CHOLESKY; 7432205254eSKarl Rupp 744f6224b95SHong Zhang ierr = PetscFree(A->solvertype);CHKERRQ(ierr); 745f6224b95SHong Zhang ierr = PetscStrallocpy(MATSOLVERPETSC,&A->solvertype);CHKERRQ(ierr); 746f6224b95SHong Zhang 747eb3f19e4SBarry Smith ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr); 748db4efbfdSBarry Smith #endif 749db4efbfdSBarry Smith PetscFunctionReturn(0); 750db4efbfdSBarry Smith } 751db4efbfdSBarry Smith 752db4efbfdSBarry Smith 7530481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 754db4efbfdSBarry Smith { 755db4efbfdSBarry Smith PetscErrorCode ierr; 756db4efbfdSBarry Smith MatFactorInfo info; 757db4efbfdSBarry Smith 758db4efbfdSBarry Smith PetscFunctionBegin; 759db4efbfdSBarry Smith info.fill = 1.0; 7602205254eSKarl Rupp 761c3ef05f6SHong Zhang ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 762719d5645SBarry Smith ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr); 763db4efbfdSBarry Smith PetscFunctionReturn(0); 764db4efbfdSBarry Smith } 765db4efbfdSBarry Smith 766e0877f53SBarry Smith static PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info) 767db4efbfdSBarry Smith { 768db4efbfdSBarry Smith PetscFunctionBegin; 769c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 7701bbcc794SSatish Balay fact->preallocated = PETSC_TRUE; 771719d5645SBarry Smith fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense; 772bd443b22SStefano Zampini fact->ops->solve = MatSolve_SeqDense; 773bd443b22SStefano Zampini fact->ops->matsolve = MatMatSolve_SeqDense; 774bd443b22SStefano Zampini fact->ops->solvetranspose = MatSolveTranspose_SeqDense; 775bd443b22SStefano Zampini fact->ops->solveadd = MatSolveAdd_SeqDense; 776bd443b22SStefano Zampini fact->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 777db4efbfdSBarry Smith PetscFunctionReturn(0); 778db4efbfdSBarry Smith } 779db4efbfdSBarry Smith 780e0877f53SBarry Smith static PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info) 781db4efbfdSBarry Smith { 782db4efbfdSBarry Smith PetscFunctionBegin; 783b66fe19dSMatthew G Knepley fact->preallocated = PETSC_TRUE; 784c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 785719d5645SBarry Smith fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense; 786bd443b22SStefano Zampini fact->ops->solve = MatSolve_SeqDense; 787bd443b22SStefano Zampini fact->ops->matsolve = MatMatSolve_SeqDense; 788bd443b22SStefano Zampini fact->ops->solvetranspose = MatSolveTranspose_SeqDense; 789bd443b22SStefano Zampini fact->ops->solveadd = MatSolveAdd_SeqDense; 790bd443b22SStefano Zampini fact->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 791db4efbfdSBarry Smith PetscFunctionReturn(0); 792db4efbfdSBarry Smith } 793db4efbfdSBarry Smith 794cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact) 795db4efbfdSBarry Smith { 796db4efbfdSBarry Smith PetscErrorCode ierr; 797db4efbfdSBarry Smith 798db4efbfdSBarry Smith PetscFunctionBegin; 799ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),fact);CHKERRQ(ierr); 800db4efbfdSBarry Smith ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 801db4efbfdSBarry Smith ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr); 802db4efbfdSBarry Smith if (ftype == MAT_FACTOR_LU) { 803db4efbfdSBarry Smith (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense; 804db4efbfdSBarry Smith } else { 805db4efbfdSBarry Smith (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense; 806db4efbfdSBarry Smith } 807d5f3da31SBarry Smith (*fact)->factortype = ftype; 80800c67f3bSHong Zhang 80900c67f3bSHong Zhang ierr = PetscFree((*fact)->solvertype);CHKERRQ(ierr); 81000c67f3bSHong Zhang ierr = PetscStrallocpy(MATSOLVERPETSC,&(*fact)->solvertype);CHKERRQ(ierr); 811db4efbfdSBarry Smith PetscFunctionReturn(0); 812db4efbfdSBarry Smith } 813db4efbfdSBarry Smith 814289bc588SBarry Smith /* ------------------------------------------------------------------*/ 815e0877f53SBarry Smith static PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx) 816289bc588SBarry Smith { 817c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 818d9ca1df4SBarry Smith PetscScalar *x,*v = mat->v,zero = 0.0,xt; 819d9ca1df4SBarry Smith const PetscScalar *b; 820dfbe8321SBarry Smith PetscErrorCode ierr; 821d0f46423SBarry Smith PetscInt m = A->rmap->n,i; 822c5df96a5SBarry Smith PetscBLASInt o = 1,bm; 823289bc588SBarry Smith 8243a40ed3dSBarry Smith PetscFunctionBegin; 825422a814eSBarry Smith if (shift == -1) shift = 0.0; /* negative shift indicates do not error on zero diagonal; this code never zeros on zero diagonal */ 826c5df96a5SBarry Smith ierr = PetscBLASIntCast(m,&bm);CHKERRQ(ierr); 827289bc588SBarry Smith if (flag & SOR_ZERO_INITIAL_GUESS) { 8283bffc371SBarry Smith /* this is a hack fix, should have another version without the second BLASdotu */ 8292dcb1b2aSMatthew Knepley ierr = VecSet(xx,zero);CHKERRQ(ierr); 830289bc588SBarry Smith } 8311ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 832d9ca1df4SBarry Smith ierr = VecGetArrayRead(bb,&b);CHKERRQ(ierr); 833b965ef7fSBarry Smith its = its*lits; 834e32f2f54SBarry 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); 835289bc588SBarry Smith while (its--) { 836fccaa45eSBarry Smith if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) { 837289bc588SBarry Smith for (i=0; i<m; i++) { 8383bffc371SBarry Smith PetscStackCallBLAS("BLASdotu",xt = b[i] - BLASdotu_(&bm,v+i,&bm,x,&o)); 83955a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 840289bc588SBarry Smith } 841289bc588SBarry Smith } 842fccaa45eSBarry Smith if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) { 843289bc588SBarry Smith for (i=m-1; i>=0; i--) { 8443bffc371SBarry Smith PetscStackCallBLAS("BLASdotu",xt = b[i] - BLASdotu_(&bm,v+i,&bm,x,&o)); 84555a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 846289bc588SBarry Smith } 847289bc588SBarry Smith } 848289bc588SBarry Smith } 849d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(bb,&b);CHKERRQ(ierr); 8501ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 8513a40ed3dSBarry Smith PetscFunctionReturn(0); 852289bc588SBarry Smith } 853289bc588SBarry Smith 854289bc588SBarry Smith /* -----------------------------------------------------------------*/ 855cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy) 856289bc588SBarry Smith { 857c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 858d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 859d9ca1df4SBarry Smith PetscScalar *y; 860dfbe8321SBarry Smith PetscErrorCode ierr; 8610805154bSBarry Smith PetscBLASInt m, n,_One=1; 862ea709b57SSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 8633a40ed3dSBarry Smith 8643a40ed3dSBarry Smith PetscFunctionBegin; 865c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 866c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 867d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 8681ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 8695ac36cfcSBarry Smith if (!A->rmap->n || !A->cmap->n) { 8705ac36cfcSBarry Smith PetscBLASInt i; 8715ac36cfcSBarry Smith for (i=0; i<n; i++) y[i] = 0.0; 8725ac36cfcSBarry Smith } else { 8738b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One)); 8745ac36cfcSBarry Smith ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 8755ac36cfcSBarry Smith } 876d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 8771ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 8783a40ed3dSBarry Smith PetscFunctionReturn(0); 879289bc588SBarry Smith } 880800995b7SMatthew Knepley 881cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy) 882289bc588SBarry Smith { 883c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 884d9ca1df4SBarry Smith PetscScalar *y,_DOne=1.0,_DZero=0.0; 885dfbe8321SBarry Smith PetscErrorCode ierr; 8860805154bSBarry Smith PetscBLASInt m, n, _One=1; 887d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 8883a40ed3dSBarry Smith 8893a40ed3dSBarry Smith PetscFunctionBegin; 890c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 891c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 892d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 8931ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 8945ac36cfcSBarry Smith if (!A->rmap->n || !A->cmap->n) { 8955ac36cfcSBarry Smith PetscBLASInt i; 8965ac36cfcSBarry Smith for (i=0; i<m; i++) y[i] = 0.0; 8975ac36cfcSBarry Smith } else { 8988b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One)); 8995ac36cfcSBarry Smith ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr); 9005ac36cfcSBarry Smith } 901d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 9021ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 9033a40ed3dSBarry Smith PetscFunctionReturn(0); 904289bc588SBarry Smith } 9056ee01492SSatish Balay 906cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 907289bc588SBarry Smith { 908c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 909d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 910d9ca1df4SBarry Smith PetscScalar *y,_DOne=1.0; 911dfbe8321SBarry Smith PetscErrorCode ierr; 9120805154bSBarry Smith PetscBLASInt m, n, _One=1; 9133a40ed3dSBarry Smith 9143a40ed3dSBarry Smith PetscFunctionBegin; 915c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 916c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 917d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 918600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 919d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 9201ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 9218b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One)); 922d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 9231ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 924dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 9253a40ed3dSBarry Smith PetscFunctionReturn(0); 926289bc588SBarry Smith } 9276ee01492SSatish Balay 928e0877f53SBarry Smith static PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 929289bc588SBarry Smith { 930c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 931d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 932d9ca1df4SBarry Smith PetscScalar *y; 933dfbe8321SBarry Smith PetscErrorCode ierr; 9340805154bSBarry Smith PetscBLASInt m, n, _One=1; 93587828ca2SBarry Smith PetscScalar _DOne=1.0; 9363a40ed3dSBarry Smith 9373a40ed3dSBarry Smith PetscFunctionBegin; 938c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 939c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 940d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 941600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 942d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 9431ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 9448b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One)); 945d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 9461ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 947dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 9483a40ed3dSBarry Smith PetscFunctionReturn(0); 949289bc588SBarry Smith } 950289bc588SBarry Smith 951289bc588SBarry Smith /* -----------------------------------------------------------------*/ 952e0877f53SBarry Smith static PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 953289bc588SBarry Smith { 954c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 95587828ca2SBarry Smith PetscScalar *v; 9566849ba73SBarry Smith PetscErrorCode ierr; 95713f74950SBarry Smith PetscInt i; 95867e560aaSBarry Smith 9593a40ed3dSBarry Smith PetscFunctionBegin; 960d0f46423SBarry Smith *ncols = A->cmap->n; 961289bc588SBarry Smith if (cols) { 962854ce69bSBarry Smith ierr = PetscMalloc1(A->cmap->n+1,cols);CHKERRQ(ierr); 963d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) (*cols)[i] = i; 964289bc588SBarry Smith } 965289bc588SBarry Smith if (vals) { 966854ce69bSBarry Smith ierr = PetscMalloc1(A->cmap->n+1,vals);CHKERRQ(ierr); 967289bc588SBarry Smith v = mat->v + row; 968d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;} 969289bc588SBarry Smith } 9703a40ed3dSBarry Smith PetscFunctionReturn(0); 971289bc588SBarry Smith } 9726ee01492SSatish Balay 973e0877f53SBarry Smith static PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 974289bc588SBarry Smith { 975dfbe8321SBarry Smith PetscErrorCode ierr; 9766e111a19SKarl Rupp 977606d414cSSatish Balay PetscFunctionBegin; 978606d414cSSatish Balay if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);} 979606d414cSSatish Balay if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); } 9803a40ed3dSBarry Smith PetscFunctionReturn(0); 981289bc588SBarry Smith } 982289bc588SBarry Smith /* ----------------------------------------------------------------*/ 983e0877f53SBarry Smith static PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv) 984289bc588SBarry Smith { 985c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 98613f74950SBarry Smith PetscInt i,j,idx=0; 987d6dfbf8fSBarry Smith 9883a40ed3dSBarry Smith PetscFunctionBegin; 989289bc588SBarry Smith if (!mat->roworiented) { 990dbb450caSBarry Smith if (addv == INSERT_VALUES) { 991289bc588SBarry Smith for (j=0; j<n; j++) { 992cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 9932515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 994e32f2f54SBarry Smith if (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); 99558804f6dSBarry Smith #endif 996289bc588SBarry Smith for (i=0; i<m; i++) { 997cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 9982515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 999e32f2f54SBarry Smith if (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); 100058804f6dSBarry Smith #endif 1001cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 1002289bc588SBarry Smith } 1003289bc588SBarry Smith } 10043a40ed3dSBarry Smith } else { 1005289bc588SBarry Smith for (j=0; j<n; j++) { 1006cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 10072515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 1008e32f2f54SBarry Smith if (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); 100958804f6dSBarry Smith #endif 1010289bc588SBarry Smith for (i=0; i<m; i++) { 1011cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 10122515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 1013e32f2f54SBarry Smith if (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); 101458804f6dSBarry Smith #endif 1015cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 1016289bc588SBarry Smith } 1017289bc588SBarry Smith } 1018289bc588SBarry Smith } 10193a40ed3dSBarry Smith } else { 1020dbb450caSBarry Smith if (addv == INSERT_VALUES) { 1021e8d4e0b9SBarry Smith for (i=0; i<m; i++) { 1022cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 10232515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 1024e32f2f54SBarry Smith if (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); 102558804f6dSBarry Smith #endif 1026e8d4e0b9SBarry Smith for (j=0; j<n; j++) { 1027cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 10282515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 1029e32f2f54SBarry Smith if (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); 103058804f6dSBarry Smith #endif 1031cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 1032e8d4e0b9SBarry Smith } 1033e8d4e0b9SBarry Smith } 10343a40ed3dSBarry Smith } else { 1035289bc588SBarry Smith for (i=0; i<m; i++) { 1036cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 10372515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 1038e32f2f54SBarry Smith if (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); 103958804f6dSBarry Smith #endif 1040289bc588SBarry Smith for (j=0; j<n; j++) { 1041cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 10422515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 1043e32f2f54SBarry Smith if (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); 104458804f6dSBarry Smith #endif 1045cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 1046289bc588SBarry Smith } 1047289bc588SBarry Smith } 1048289bc588SBarry Smith } 1049e8d4e0b9SBarry Smith } 10503a40ed3dSBarry Smith PetscFunctionReturn(0); 1051289bc588SBarry Smith } 1052e8d4e0b9SBarry Smith 1053e0877f53SBarry Smith static PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[]) 1054ae80bb75SLois Curfman McInnes { 1055ae80bb75SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 105613f74950SBarry Smith PetscInt i,j; 1057ae80bb75SLois Curfman McInnes 10583a40ed3dSBarry Smith PetscFunctionBegin; 1059ae80bb75SLois Curfman McInnes /* row-oriented output */ 1060ae80bb75SLois Curfman McInnes for (i=0; i<m; i++) { 106197e567efSBarry Smith if (indexm[i] < 0) {v += n;continue;} 1062e32f2f54SBarry 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); 1063ae80bb75SLois Curfman McInnes for (j=0; j<n; j++) { 10646f31f424SBarry Smith if (indexn[j] < 0) {v++; continue;} 1065e32f2f54SBarry 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); 106697e567efSBarry Smith *v++ = mat->v[indexn[j]*mat->lda + indexm[i]]; 1067ae80bb75SLois Curfman McInnes } 1068ae80bb75SLois Curfman McInnes } 10693a40ed3dSBarry Smith PetscFunctionReturn(0); 1070ae80bb75SLois Curfman McInnes } 1071ae80bb75SLois Curfman McInnes 1072289bc588SBarry Smith /* -----------------------------------------------------------------*/ 1073289bc588SBarry Smith 1074e0877f53SBarry Smith static PetscErrorCode MatLoad_SeqDense(Mat newmat,PetscViewer viewer) 1075aabbc4fbSShri Abhyankar { 1076aabbc4fbSShri Abhyankar Mat_SeqDense *a; 1077aabbc4fbSShri Abhyankar PetscErrorCode ierr; 1078aabbc4fbSShri Abhyankar PetscInt *scols,i,j,nz,header[4]; 1079aabbc4fbSShri Abhyankar int fd; 1080aabbc4fbSShri Abhyankar PetscMPIInt size; 1081aabbc4fbSShri Abhyankar PetscInt *rowlengths = 0,M,N,*cols,grows,gcols; 1082aabbc4fbSShri Abhyankar PetscScalar *vals,*svals,*v,*w; 1083ce94432eSBarry Smith MPI_Comm comm; 1084aabbc4fbSShri Abhyankar 1085aabbc4fbSShri Abhyankar PetscFunctionBegin; 1086c98fd787SBarry Smith /* force binary viewer to load .info file if it has not yet done so */ 1087c98fd787SBarry Smith ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr); 1088ce94432eSBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 1089aabbc4fbSShri Abhyankar ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 1090aabbc4fbSShri Abhyankar if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor"); 1091aabbc4fbSShri Abhyankar ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 1092aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr); 1093aabbc4fbSShri Abhyankar if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object"); 1094aabbc4fbSShri Abhyankar M = header[1]; N = header[2]; nz = header[3]; 1095aabbc4fbSShri Abhyankar 1096aabbc4fbSShri Abhyankar /* set global size if not set already*/ 1097aabbc4fbSShri Abhyankar if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) { 1098aabbc4fbSShri Abhyankar ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr); 1099aabbc4fbSShri Abhyankar } else { 1100aabbc4fbSShri Abhyankar /* if sizes and type are already set, check if the vector global sizes are correct */ 1101aabbc4fbSShri Abhyankar ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr); 1102aabbc4fbSShri Abhyankar if (M != grows || N != gcols) SETERRQ4(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED, "Matrix in file of different length (%d, %d) than the input matrix (%d, %d)",M,N,grows,gcols); 1103aabbc4fbSShri Abhyankar } 1104e6324fbbSBarry Smith a = (Mat_SeqDense*)newmat->data; 1105e6324fbbSBarry Smith if (!a->user_alloc) { 11060298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr); 1107e6324fbbSBarry Smith } 1108aabbc4fbSShri Abhyankar 1109aabbc4fbSShri Abhyankar if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */ 1110aabbc4fbSShri Abhyankar a = (Mat_SeqDense*)newmat->data; 1111aabbc4fbSShri Abhyankar v = a->v; 1112aabbc4fbSShri Abhyankar /* Allocate some temp space to read in the values and then flip them 1113aabbc4fbSShri Abhyankar from row major to column major */ 1114854ce69bSBarry Smith ierr = PetscMalloc1(M*N > 0 ? M*N : 1,&w);CHKERRQ(ierr); 1115aabbc4fbSShri Abhyankar /* read in nonzero values */ 1116aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr); 1117aabbc4fbSShri Abhyankar /* now flip the values and store them in the matrix*/ 1118aabbc4fbSShri Abhyankar for (j=0; j<N; j++) { 1119aabbc4fbSShri Abhyankar for (i=0; i<M; i++) { 1120aabbc4fbSShri Abhyankar *v++ =w[i*N+j]; 1121aabbc4fbSShri Abhyankar } 1122aabbc4fbSShri Abhyankar } 1123aabbc4fbSShri Abhyankar ierr = PetscFree(w);CHKERRQ(ierr); 1124aabbc4fbSShri Abhyankar } else { 1125aabbc4fbSShri Abhyankar /* read row lengths */ 1126854ce69bSBarry Smith ierr = PetscMalloc1(M+1,&rowlengths);CHKERRQ(ierr); 1127aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr); 1128aabbc4fbSShri Abhyankar 1129aabbc4fbSShri Abhyankar a = (Mat_SeqDense*)newmat->data; 1130aabbc4fbSShri Abhyankar v = a->v; 1131aabbc4fbSShri Abhyankar 1132aabbc4fbSShri Abhyankar /* read column indices and nonzeros */ 1133854ce69bSBarry Smith ierr = PetscMalloc1(nz+1,&scols);CHKERRQ(ierr); 1134aabbc4fbSShri Abhyankar cols = scols; 1135aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr); 1136854ce69bSBarry Smith ierr = PetscMalloc1(nz+1,&svals);CHKERRQ(ierr); 1137aabbc4fbSShri Abhyankar vals = svals; 1138aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr); 1139aabbc4fbSShri Abhyankar 1140aabbc4fbSShri Abhyankar /* insert into matrix */ 1141aabbc4fbSShri Abhyankar for (i=0; i<M; i++) { 1142aabbc4fbSShri Abhyankar for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j]; 1143aabbc4fbSShri Abhyankar svals += rowlengths[i]; scols += rowlengths[i]; 1144aabbc4fbSShri Abhyankar } 1145aabbc4fbSShri Abhyankar ierr = PetscFree(vals);CHKERRQ(ierr); 1146aabbc4fbSShri Abhyankar ierr = PetscFree(cols);CHKERRQ(ierr); 1147aabbc4fbSShri Abhyankar ierr = PetscFree(rowlengths);CHKERRQ(ierr); 1148aabbc4fbSShri Abhyankar } 1149aabbc4fbSShri Abhyankar ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1150aabbc4fbSShri Abhyankar ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1151aabbc4fbSShri Abhyankar PetscFunctionReturn(0); 1152aabbc4fbSShri Abhyankar } 1153aabbc4fbSShri Abhyankar 11546849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer) 1155289bc588SBarry Smith { 1156932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1157dfbe8321SBarry Smith PetscErrorCode ierr; 115813f74950SBarry Smith PetscInt i,j; 11592dcb1b2aSMatthew Knepley const char *name; 116087828ca2SBarry Smith PetscScalar *v; 1161f3ef73ceSBarry Smith PetscViewerFormat format; 11625f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX) 1163ace3abfcSBarry Smith PetscBool allreal = PETSC_TRUE; 11645f481a85SSatish Balay #endif 1165932b0c3eSLois Curfman McInnes 11663a40ed3dSBarry Smith PetscFunctionBegin; 1167b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1168456192e2SBarry Smith if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 11693a40ed3dSBarry Smith PetscFunctionReturn(0); /* do nothing for now */ 1170fb9695e5SSatish Balay } else if (format == PETSC_VIEWER_ASCII_COMMON) { 1171d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 1172d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 117344cd7ae7SLois Curfman McInnes v = a->v + i; 117477431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr); 1175d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1176aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 1177329f5518SBarry Smith if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) { 117857622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g + %g i) ",j,(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr); 1179329f5518SBarry Smith } else if (PetscRealPart(*v)) { 118057622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)PetscRealPart(*v));CHKERRQ(ierr); 11816831982aSBarry Smith } 118280cd9d93SLois Curfman McInnes #else 11836831982aSBarry Smith if (*v) { 118457622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)*v);CHKERRQ(ierr); 11856831982aSBarry Smith } 118680cd9d93SLois Curfman McInnes #endif 11871b807ce4Svictorle v += a->lda; 118880cd9d93SLois Curfman McInnes } 1189b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 119080cd9d93SLois Curfman McInnes } 1191d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 11923a40ed3dSBarry Smith } else { 1193d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 1194aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 119547989497SBarry Smith /* determine if matrix has all real values */ 119647989497SBarry Smith v = a->v; 1197d0f46423SBarry Smith for (i=0; i<A->rmap->n*A->cmap->n; i++) { 1198ffac6cdbSBarry Smith if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break;} 119947989497SBarry Smith } 120047989497SBarry Smith #endif 1201fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 12023a7fca6bSBarry Smith ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr); 1203d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr); 1204d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 1205fb9695e5SSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr); 1206ffac6cdbSBarry Smith } 1207ffac6cdbSBarry Smith 1208d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 1209932b0c3eSLois Curfman McInnes v = a->v + i; 1210d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1211aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 121247989497SBarry Smith if (allreal) { 1213c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr); 121447989497SBarry Smith } else { 1215c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr); 121647989497SBarry Smith } 1217289bc588SBarry Smith #else 1218c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr); 1219289bc588SBarry Smith #endif 12201b807ce4Svictorle v += a->lda; 1221289bc588SBarry Smith } 1222b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 1223289bc588SBarry Smith } 1224fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 1225b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr); 1226ffac6cdbSBarry Smith } 1227d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 1228da3a660dSBarry Smith } 1229b0a32e0cSBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 12303a40ed3dSBarry Smith PetscFunctionReturn(0); 1231289bc588SBarry Smith } 1232289bc588SBarry Smith 12336849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer) 1234932b0c3eSLois Curfman McInnes { 1235932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 12366849ba73SBarry Smith PetscErrorCode ierr; 123713f74950SBarry Smith int fd; 1238d0f46423SBarry Smith PetscInt ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n; 1239f4403165SShri Abhyankar PetscScalar *v,*anonz,*vals; 1240f4403165SShri Abhyankar PetscViewerFormat format; 1241932b0c3eSLois Curfman McInnes 12423a40ed3dSBarry Smith PetscFunctionBegin; 1243b0a32e0cSBarry Smith ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 124490ace30eSBarry Smith 1245f4403165SShri Abhyankar ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1246f4403165SShri Abhyankar if (format == PETSC_VIEWER_NATIVE) { 1247f4403165SShri Abhyankar /* store the matrix as a dense matrix */ 1248785e854fSJed Brown ierr = PetscMalloc1(4,&col_lens);CHKERRQ(ierr); 12492205254eSKarl Rupp 1250f4403165SShri Abhyankar col_lens[0] = MAT_FILE_CLASSID; 1251f4403165SShri Abhyankar col_lens[1] = m; 1252f4403165SShri Abhyankar col_lens[2] = n; 1253f4403165SShri Abhyankar col_lens[3] = MATRIX_BINARY_FORMAT_DENSE; 12542205254eSKarl Rupp 1255f4403165SShri Abhyankar ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 1256f4403165SShri Abhyankar ierr = PetscFree(col_lens);CHKERRQ(ierr); 1257f4403165SShri Abhyankar 1258f4403165SShri Abhyankar /* write out matrix, by rows */ 1259854ce69bSBarry Smith ierr = PetscMalloc1(m*n+1,&vals);CHKERRQ(ierr); 1260f4403165SShri Abhyankar v = a->v; 1261f4403165SShri Abhyankar for (j=0; j<n; j++) { 1262f4403165SShri Abhyankar for (i=0; i<m; i++) { 1263f4403165SShri Abhyankar vals[j + i*n] = *v++; 1264f4403165SShri Abhyankar } 1265f4403165SShri Abhyankar } 1266f4403165SShri Abhyankar ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 1267f4403165SShri Abhyankar ierr = PetscFree(vals);CHKERRQ(ierr); 1268f4403165SShri Abhyankar } else { 1269854ce69bSBarry Smith ierr = PetscMalloc1(4+nz,&col_lens);CHKERRQ(ierr); 12702205254eSKarl Rupp 12710700a824SBarry Smith col_lens[0] = MAT_FILE_CLASSID; 1272932b0c3eSLois Curfman McInnes col_lens[1] = m; 1273932b0c3eSLois Curfman McInnes col_lens[2] = n; 1274932b0c3eSLois Curfman McInnes col_lens[3] = nz; 1275932b0c3eSLois Curfman McInnes 1276932b0c3eSLois Curfman McInnes /* store lengths of each row and write (including header) to file */ 1277932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) col_lens[4+i] = n; 12786f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 1279932b0c3eSLois Curfman McInnes 1280932b0c3eSLois Curfman McInnes /* Possibly should write in smaller increments, not whole matrix at once? */ 1281932b0c3eSLois Curfman McInnes /* store column indices (zero start index) */ 1282932b0c3eSLois Curfman McInnes ict = 0; 1283932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 1284932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) col_lens[ict++] = j; 1285932b0c3eSLois Curfman McInnes } 12866f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 1287606d414cSSatish Balay ierr = PetscFree(col_lens);CHKERRQ(ierr); 1288932b0c3eSLois Curfman McInnes 1289932b0c3eSLois Curfman McInnes /* store nonzero values */ 1290854ce69bSBarry Smith ierr = PetscMalloc1(nz+1,&anonz);CHKERRQ(ierr); 1291932b0c3eSLois Curfman McInnes ict = 0; 1292932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 1293932b0c3eSLois Curfman McInnes v = a->v + i; 1294932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) { 12951b807ce4Svictorle anonz[ict++] = *v; v += a->lda; 1296932b0c3eSLois Curfman McInnes } 1297932b0c3eSLois Curfman McInnes } 12986f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 1299606d414cSSatish Balay ierr = PetscFree(anonz);CHKERRQ(ierr); 1300f4403165SShri Abhyankar } 13013a40ed3dSBarry Smith PetscFunctionReturn(0); 1302932b0c3eSLois Curfman McInnes } 1303932b0c3eSLois Curfman McInnes 13049804daf3SBarry Smith #include <petscdraw.h> 1305e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa) 1306f1af5d2fSBarry Smith { 1307f1af5d2fSBarry Smith Mat A = (Mat) Aa; 1308f1af5d2fSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 13096849ba73SBarry Smith PetscErrorCode ierr; 1310383922c3SLisandro Dalcin PetscInt m = A->rmap->n,n = A->cmap->n,i,j; 1311383922c3SLisandro Dalcin int color = PETSC_DRAW_WHITE; 131287828ca2SBarry Smith PetscScalar *v = a->v; 1313b0a32e0cSBarry Smith PetscViewer viewer; 1314b05fc000SLisandro Dalcin PetscReal xl,yl,xr,yr,x_l,x_r,y_l,y_r; 1315f3ef73ceSBarry Smith PetscViewerFormat format; 1316f1af5d2fSBarry Smith 1317f1af5d2fSBarry Smith PetscFunctionBegin; 1318f1af5d2fSBarry Smith ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr); 1319b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1320b0a32e0cSBarry Smith ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr); 1321f1af5d2fSBarry Smith 1322f1af5d2fSBarry Smith /* Loop over matrix elements drawing boxes */ 1323383922c3SLisandro Dalcin 1324fb9695e5SSatish Balay if (format != PETSC_VIEWER_DRAW_CONTOUR) { 1325383922c3SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 1326f1af5d2fSBarry Smith /* Blue for negative and Red for positive */ 1327f1af5d2fSBarry Smith for (j = 0; j < n; j++) { 1328383922c3SLisandro Dalcin x_l = j; x_r = x_l + 1.0; 1329f1af5d2fSBarry Smith for (i = 0; i < m; i++) { 1330f1af5d2fSBarry Smith y_l = m - i - 1.0; 1331f1af5d2fSBarry Smith y_r = y_l + 1.0; 1332329f5518SBarry Smith if (PetscRealPart(v[j*m+i]) > 0.) { 1333b0a32e0cSBarry Smith color = PETSC_DRAW_RED; 1334329f5518SBarry Smith } else if (PetscRealPart(v[j*m+i]) < 0.) { 1335b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 1336f1af5d2fSBarry Smith } else { 1337f1af5d2fSBarry Smith continue; 1338f1af5d2fSBarry Smith } 1339b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1340f1af5d2fSBarry Smith } 1341f1af5d2fSBarry Smith } 1342383922c3SLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 1343f1af5d2fSBarry Smith } else { 1344f1af5d2fSBarry Smith /* use contour shading to indicate magnitude of values */ 1345f1af5d2fSBarry Smith /* first determine max of all nonzero values */ 1346b05fc000SLisandro Dalcin PetscReal minv = 0.0, maxv = 0.0; 1347b05fc000SLisandro Dalcin PetscDraw popup; 1348b05fc000SLisandro Dalcin 1349f1af5d2fSBarry Smith for (i=0; i < m*n; i++) { 1350f1af5d2fSBarry Smith if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]); 1351f1af5d2fSBarry Smith } 1352383922c3SLisandro Dalcin if (minv >= maxv) maxv = minv + PETSC_SMALL; 1353b0a32e0cSBarry Smith ierr = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr); 135445f3bb6eSLisandro Dalcin ierr = PetscDrawScalePopup(popup,minv,maxv);CHKERRQ(ierr); 1355383922c3SLisandro Dalcin 1356383922c3SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 1357f1af5d2fSBarry Smith for (j=0; j<n; j++) { 1358f1af5d2fSBarry Smith x_l = j; 1359f1af5d2fSBarry Smith x_r = x_l + 1.0; 1360f1af5d2fSBarry Smith for (i=0; i<m; i++) { 1361f1af5d2fSBarry Smith y_l = m - i - 1.0; 1362f1af5d2fSBarry Smith y_r = y_l + 1.0; 1363b05fc000SLisandro Dalcin color = PetscDrawRealToColor(PetscAbsScalar(v[j*m+i]),minv,maxv); 1364b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1365f1af5d2fSBarry Smith } 1366f1af5d2fSBarry Smith } 1367383922c3SLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 1368f1af5d2fSBarry Smith } 1369f1af5d2fSBarry Smith PetscFunctionReturn(0); 1370f1af5d2fSBarry Smith } 1371f1af5d2fSBarry Smith 1372e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer) 1373f1af5d2fSBarry Smith { 1374b0a32e0cSBarry Smith PetscDraw draw; 1375ace3abfcSBarry Smith PetscBool isnull; 1376329f5518SBarry Smith PetscReal xr,yr,xl,yl,h,w; 1377dfbe8321SBarry Smith PetscErrorCode ierr; 1378f1af5d2fSBarry Smith 1379f1af5d2fSBarry Smith PetscFunctionBegin; 1380b0a32e0cSBarry Smith ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr); 1381b0a32e0cSBarry Smith ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 1382abc0a331SBarry Smith if (isnull) PetscFunctionReturn(0); 1383f1af5d2fSBarry Smith 1384d0f46423SBarry Smith xr = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0; 1385f1af5d2fSBarry Smith xr += w; yr += h; xl = -w; yl = -h; 1386b0a32e0cSBarry Smith ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr); 1387832b7cebSLisandro Dalcin ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr); 1388b0a32e0cSBarry Smith ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr); 13890298fd71SBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr); 1390832b7cebSLisandro Dalcin ierr = PetscDrawSave(draw);CHKERRQ(ierr); 1391f1af5d2fSBarry Smith PetscFunctionReturn(0); 1392f1af5d2fSBarry Smith } 1393f1af5d2fSBarry Smith 1394dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer) 1395932b0c3eSLois Curfman McInnes { 1396dfbe8321SBarry Smith PetscErrorCode ierr; 1397ace3abfcSBarry Smith PetscBool iascii,isbinary,isdraw; 1398932b0c3eSLois Curfman McInnes 13993a40ed3dSBarry Smith PetscFunctionBegin; 1400251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 1401251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 1402251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 14030f5bd95cSBarry Smith 1404c45a1595SBarry Smith if (iascii) { 1405c45a1595SBarry Smith ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr); 14060f5bd95cSBarry Smith } else if (isbinary) { 14073a40ed3dSBarry Smith ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr); 1408f1af5d2fSBarry Smith } else if (isdraw) { 1409f1af5d2fSBarry Smith ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr); 1410932b0c3eSLois Curfman McInnes } 14113a40ed3dSBarry Smith PetscFunctionReturn(0); 1412932b0c3eSLois Curfman McInnes } 1413289bc588SBarry Smith 1414d3042a70SBarry Smith static PetscErrorCode MatDensePlaceArray_SeqDense(Mat A,const PetscScalar array[]) 1415d3042a70SBarry Smith { 1416d3042a70SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1417d3042a70SBarry Smith 1418d3042a70SBarry Smith PetscFunctionBegin; 1419d3042a70SBarry Smith a->unplacedarray = a->v; 1420d3042a70SBarry Smith a->unplaced_user_alloc = a->user_alloc; 1421d3042a70SBarry Smith a->v = (PetscScalar*) array; 1422d3042a70SBarry Smith PetscFunctionReturn(0); 1423d3042a70SBarry Smith } 1424d3042a70SBarry Smith 1425d3042a70SBarry Smith static PetscErrorCode MatDenseResetArray_SeqDense(Mat A) 1426d3042a70SBarry Smith { 1427d3042a70SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1428d3042a70SBarry Smith 1429d3042a70SBarry Smith PetscFunctionBegin; 1430d3042a70SBarry Smith a->v = a->unplacedarray; 1431d3042a70SBarry Smith a->user_alloc = a->unplaced_user_alloc; 1432d3042a70SBarry Smith a->unplacedarray = NULL; 1433d3042a70SBarry Smith PetscFunctionReturn(0); 1434d3042a70SBarry Smith } 1435d3042a70SBarry Smith 1436e0877f53SBarry Smith static PetscErrorCode MatDestroy_SeqDense(Mat mat) 1437289bc588SBarry Smith { 1438ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)mat->data; 1439dfbe8321SBarry Smith PetscErrorCode ierr; 144090f02eecSBarry Smith 14413a40ed3dSBarry Smith PetscFunctionBegin; 1442aa482453SBarry Smith #if defined(PETSC_USE_LOG) 1443d0f46423SBarry Smith PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n); 1444a5a9c739SBarry Smith #endif 144505b42c5fSBarry Smith ierr = PetscFree(l->pivots);CHKERRQ(ierr); 1446a49dc2a2SStefano Zampini ierr = PetscFree(l->fwork);CHKERRQ(ierr); 1447abc3b08eSStefano Zampini ierr = MatDestroy(&l->ptapwork);CHKERRQ(ierr); 14486857c123SSatish Balay if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);} 1449bf0cc555SLisandro Dalcin ierr = PetscFree(mat->data);CHKERRQ(ierr); 1450dbd8c25aSHong Zhang 1451dbd8c25aSHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr); 1452bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL);CHKERRQ(ierr); 1453d3042a70SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDensePlaceArray_C",NULL);CHKERRQ(ierr); 1454d3042a70SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseResetArray_C",NULL);CHKERRQ(ierr); 1455bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL);CHKERRQ(ierr); 14568baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL);CHKERRQ(ierr); 14578baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 14588baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL);CHKERRQ(ierr); 14598baccfbdSHong Zhang #endif 1460bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL);CHKERRQ(ierr); 1461bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1462bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1463bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1464abc3b08eSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatPtAP_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 14653bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 14663bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 14673bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 146886aefd0dSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumn_C",NULL);CHKERRQ(ierr); 146986aefd0dSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumn_C",NULL);CHKERRQ(ierr); 14703a40ed3dSBarry Smith PetscFunctionReturn(0); 1471289bc588SBarry Smith } 1472289bc588SBarry Smith 1473e0877f53SBarry Smith static PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout) 1474289bc588SBarry Smith { 1475c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 14766849ba73SBarry Smith PetscErrorCode ierr; 147713f74950SBarry Smith PetscInt k,j,m,n,M; 147887828ca2SBarry Smith PetscScalar *v,tmp; 147948b35521SBarry Smith 14803a40ed3dSBarry Smith PetscFunctionBegin; 1481d0f46423SBarry Smith v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n; 14822847e3fdSStefano Zampini if (reuse == MAT_INPLACE_MATRIX && m == n) { /* in place transpose */ 1483d3e5ee88SLois Curfman McInnes for (j=0; j<m; j++) { 1484289bc588SBarry Smith for (k=0; k<j; k++) { 14851b807ce4Svictorle tmp = v[j + k*M]; 14861b807ce4Svictorle v[j + k*M] = v[k + j*M]; 14871b807ce4Svictorle v[k + j*M] = tmp; 1488289bc588SBarry Smith } 1489289bc588SBarry Smith } 14903a40ed3dSBarry Smith } else { /* out-of-place transpose */ 1491d3e5ee88SLois Curfman McInnes Mat tmat; 1492ec8511deSBarry Smith Mat_SeqDense *tmatd; 149387828ca2SBarry Smith PetscScalar *v2; 1494af36a384SStefano Zampini PetscInt M2; 1495ea709b57SSatish Balay 14962847e3fdSStefano Zampini if (reuse != MAT_REUSE_MATRIX) { 1497ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr); 1498d0f46423SBarry Smith ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr); 14997adad957SLisandro Dalcin ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 15000298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr); 1501fc4dec0aSBarry Smith } else { 1502fc4dec0aSBarry Smith tmat = *matout; 1503fc4dec0aSBarry Smith } 1504ec8511deSBarry Smith tmatd = (Mat_SeqDense*)tmat->data; 1505af36a384SStefano Zampini v = mat->v; v2 = tmatd->v; M2 = tmatd->lda; 1506d3e5ee88SLois Curfman McInnes for (j=0; j<n; j++) { 1507af36a384SStefano Zampini for (k=0; k<m; k++) v2[j + k*M2] = v[k + j*M]; 1508d3e5ee88SLois Curfman McInnes } 15096d4a8577SBarry Smith ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 15106d4a8577SBarry Smith ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 15112847e3fdSStefano Zampini if (reuse == MAT_INITIAL_MATRIX || reuse == MAT_REUSE_MATRIX) *matout = tmat; 15122847e3fdSStefano Zampini else { 15132847e3fdSStefano Zampini ierr = MatHeaderMerge(A,&tmat);CHKERRQ(ierr); 15142847e3fdSStefano Zampini } 151548b35521SBarry Smith } 15163a40ed3dSBarry Smith PetscFunctionReturn(0); 1517289bc588SBarry Smith } 1518289bc588SBarry Smith 1519e0877f53SBarry Smith static PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool *flg) 1520289bc588SBarry Smith { 1521c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data; 1522c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data; 152313f74950SBarry Smith PetscInt i,j; 1524a2ea699eSBarry Smith PetscScalar *v1,*v2; 15259ea5d5aeSSatish Balay 15263a40ed3dSBarry Smith PetscFunctionBegin; 1527d0f46423SBarry Smith if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1528d0f46423SBarry Smith if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1529d0f46423SBarry Smith for (i=0; i<A1->rmap->n; i++) { 15301b807ce4Svictorle v1 = mat1->v+i; v2 = mat2->v+i; 1531d0f46423SBarry Smith for (j=0; j<A1->cmap->n; j++) { 15323a40ed3dSBarry Smith if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 15331b807ce4Svictorle v1 += mat1->lda; v2 += mat2->lda; 15341b807ce4Svictorle } 1535289bc588SBarry Smith } 153677c4ece6SBarry Smith *flg = PETSC_TRUE; 15373a40ed3dSBarry Smith PetscFunctionReturn(0); 1538289bc588SBarry Smith } 1539289bc588SBarry Smith 1540e0877f53SBarry Smith static PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v) 1541289bc588SBarry Smith { 1542c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1543dfbe8321SBarry Smith PetscErrorCode ierr; 154413f74950SBarry Smith PetscInt i,n,len; 154587828ca2SBarry Smith PetscScalar *x,zero = 0.0; 154644cd7ae7SLois Curfman McInnes 15473a40ed3dSBarry Smith PetscFunctionBegin; 15482dcb1b2aSMatthew Knepley ierr = VecSet(v,zero);CHKERRQ(ierr); 15497a97a34bSBarry Smith ierr = VecGetSize(v,&n);CHKERRQ(ierr); 15501ebc52fbSHong Zhang ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1551d0f46423SBarry Smith len = PetscMin(A->rmap->n,A->cmap->n); 1552e32f2f54SBarry Smith if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec"); 155344cd7ae7SLois Curfman McInnes for (i=0; i<len; i++) { 15541b807ce4Svictorle x[i] = mat->v[i*mat->lda + i]; 1555289bc588SBarry Smith } 15561ebc52fbSHong Zhang ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 15573a40ed3dSBarry Smith PetscFunctionReturn(0); 1558289bc588SBarry Smith } 1559289bc588SBarry Smith 1560e0877f53SBarry Smith static PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr) 1561289bc588SBarry Smith { 1562c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1563f1ceaac6SMatthew G. Knepley const PetscScalar *l,*r; 1564f1ceaac6SMatthew G. Knepley PetscScalar x,*v; 1565dfbe8321SBarry Smith PetscErrorCode ierr; 1566d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n; 156755659b69SBarry Smith 15683a40ed3dSBarry Smith PetscFunctionBegin; 156928988994SBarry Smith if (ll) { 15707a97a34bSBarry Smith ierr = VecGetSize(ll,&m);CHKERRQ(ierr); 1571f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(ll,&l);CHKERRQ(ierr); 1572e32f2f54SBarry Smith if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size"); 1573da3a660dSBarry Smith for (i=0; i<m; i++) { 1574da3a660dSBarry Smith x = l[i]; 1575da3a660dSBarry Smith v = mat->v + i; 1576b43bac26SStefano Zampini for (j=0; j<n; j++) { (*v) *= x; v+= mat->lda;} 1577da3a660dSBarry Smith } 1578f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(ll,&l);CHKERRQ(ierr); 1579eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr); 1580da3a660dSBarry Smith } 158128988994SBarry Smith if (rr) { 15827a97a34bSBarry Smith ierr = VecGetSize(rr,&n);CHKERRQ(ierr); 1583f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(rr,&r);CHKERRQ(ierr); 1584e32f2f54SBarry Smith if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size"); 1585da3a660dSBarry Smith for (i=0; i<n; i++) { 1586da3a660dSBarry Smith x = r[i]; 1587b43bac26SStefano Zampini v = mat->v + i*mat->lda; 15882205254eSKarl Rupp for (j=0; j<m; j++) (*v++) *= x; 1589da3a660dSBarry Smith } 1590f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(rr,&r);CHKERRQ(ierr); 1591eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr); 1592da3a660dSBarry Smith } 15933a40ed3dSBarry Smith PetscFunctionReturn(0); 1594289bc588SBarry Smith } 1595289bc588SBarry Smith 1596e0877f53SBarry Smith static PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm) 1597289bc588SBarry Smith { 1598c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 159987828ca2SBarry Smith PetscScalar *v = mat->v; 1600329f5518SBarry Smith PetscReal sum = 0.0; 1601d0f46423SBarry Smith PetscInt lda =mat->lda,m=A->rmap->n,i,j; 1602efee365bSSatish Balay PetscErrorCode ierr; 160355659b69SBarry Smith 16043a40ed3dSBarry Smith PetscFunctionBegin; 1605289bc588SBarry Smith if (type == NORM_FROBENIUS) { 1606a5ce6ee0Svictorle if (lda>m) { 1607d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1608a5ce6ee0Svictorle v = mat->v+j*lda; 1609a5ce6ee0Svictorle for (i=0; i<m; i++) { 1610a5ce6ee0Svictorle sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1611a5ce6ee0Svictorle } 1612a5ce6ee0Svictorle } 1613a5ce6ee0Svictorle } else { 1614570b7f6dSBarry Smith #if defined(PETSC_USE_REAL___FP16) 1615570b7f6dSBarry Smith PetscBLASInt one = 1,cnt = A->cmap->n*A->rmap->n; 1616570b7f6dSBarry Smith *nrm = BLASnrm2_(&cnt,v,&one); 1617570b7f6dSBarry Smith } 1618570b7f6dSBarry Smith #else 1619d0f46423SBarry Smith for (i=0; i<A->cmap->n*A->rmap->n; i++) { 1620329f5518SBarry Smith sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1621289bc588SBarry Smith } 1622a5ce6ee0Svictorle } 16238f1a2a5eSBarry Smith *nrm = PetscSqrtReal(sum); 1624570b7f6dSBarry Smith #endif 1625dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 16263a40ed3dSBarry Smith } else if (type == NORM_1) { 1627064f8208SBarry Smith *nrm = 0.0; 1628d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 16291b807ce4Svictorle v = mat->v + j*mat->lda; 1630289bc588SBarry Smith sum = 0.0; 1631d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 163233a8263dSBarry Smith sum += PetscAbsScalar(*v); v++; 1633289bc588SBarry Smith } 1634064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1635289bc588SBarry Smith } 1636eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 16373a40ed3dSBarry Smith } else if (type == NORM_INFINITY) { 1638064f8208SBarry Smith *nrm = 0.0; 1639d0f46423SBarry Smith for (j=0; j<A->rmap->n; j++) { 1640289bc588SBarry Smith v = mat->v + j; 1641289bc588SBarry Smith sum = 0.0; 1642d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) { 16431b807ce4Svictorle sum += PetscAbsScalar(*v); v += mat->lda; 1644289bc588SBarry Smith } 1645064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1646289bc588SBarry Smith } 1647eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 1648e7e72b3dSBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm"); 16493a40ed3dSBarry Smith PetscFunctionReturn(0); 1650289bc588SBarry Smith } 1651289bc588SBarry Smith 1652e0877f53SBarry Smith static PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg) 1653289bc588SBarry Smith { 1654c0bbcb79SLois Curfman McInnes Mat_SeqDense *aij = (Mat_SeqDense*)A->data; 165563ba0a88SBarry Smith PetscErrorCode ierr; 165667e560aaSBarry Smith 16573a40ed3dSBarry Smith PetscFunctionBegin; 1658b5a2b587SKris Buschelman switch (op) { 1659b5a2b587SKris Buschelman case MAT_ROW_ORIENTED: 16604e0d8c25SBarry Smith aij->roworiented = flg; 1661b5a2b587SKris Buschelman break; 1662512a5fc5SBarry Smith case MAT_NEW_NONZERO_LOCATIONS: 1663b5a2b587SKris Buschelman case MAT_NEW_NONZERO_LOCATION_ERR: 16643971808eSMatthew Knepley case MAT_NEW_NONZERO_ALLOCATION_ERR: 16654e0d8c25SBarry Smith case MAT_NEW_DIAGONALS: 166613fa8e87SLisandro Dalcin case MAT_KEEP_NONZERO_PATTERN: 1667b5a2b587SKris Buschelman case MAT_IGNORE_OFF_PROC_ENTRIES: 1668b5a2b587SKris Buschelman case MAT_USE_HASH_TABLE: 16690f8fb01aSBarry Smith case MAT_IGNORE_ZERO_ENTRIES: 16705021d80fSJed Brown case MAT_IGNORE_LOWER_TRIANGULAR: 16715021d80fSJed Brown ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr); 16725021d80fSJed Brown break; 16735021d80fSJed Brown case MAT_SPD: 167477e54ba9SKris Buschelman case MAT_SYMMETRIC: 167577e54ba9SKris Buschelman case MAT_STRUCTURALLY_SYMMETRIC: 16769a4540c5SBarry Smith case MAT_HERMITIAN: 16779a4540c5SBarry Smith case MAT_SYMMETRY_ETERNAL: 16785021d80fSJed Brown /* These options are handled directly by MatSetOption() */ 167977e54ba9SKris Buschelman break; 1680b5a2b587SKris Buschelman default: 1681e32f2f54SBarry Smith SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]); 16823a40ed3dSBarry Smith } 16833a40ed3dSBarry Smith PetscFunctionReturn(0); 1684289bc588SBarry Smith } 1685289bc588SBarry Smith 1686e0877f53SBarry Smith static PetscErrorCode MatZeroEntries_SeqDense(Mat A) 16876f0a148fSBarry Smith { 1688ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 16896849ba73SBarry Smith PetscErrorCode ierr; 1690d0f46423SBarry Smith PetscInt lda=l->lda,m=A->rmap->n,j; 16913a40ed3dSBarry Smith 16923a40ed3dSBarry Smith PetscFunctionBegin; 1693a5ce6ee0Svictorle if (lda>m) { 1694d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1695a5ce6ee0Svictorle ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 1696a5ce6ee0Svictorle } 1697a5ce6ee0Svictorle } else { 1698d0f46423SBarry Smith ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1699a5ce6ee0Svictorle } 17003a40ed3dSBarry Smith PetscFunctionReturn(0); 17016f0a148fSBarry Smith } 17026f0a148fSBarry Smith 1703e0877f53SBarry Smith static PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b) 17046f0a148fSBarry Smith { 170597b48c8fSBarry Smith PetscErrorCode ierr; 1706ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 1707b9679d65SBarry Smith PetscInt m = l->lda, n = A->cmap->n, i,j; 170897b48c8fSBarry Smith PetscScalar *slot,*bb; 170997b48c8fSBarry Smith const PetscScalar *xx; 171055659b69SBarry Smith 17113a40ed3dSBarry Smith PetscFunctionBegin; 1712b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG) 1713b9679d65SBarry Smith for (i=0; i<N; i++) { 1714b9679d65SBarry Smith if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed"); 1715b9679d65SBarry 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); 1716b9679d65SBarry Smith } 1717b9679d65SBarry Smith #endif 1718b9679d65SBarry Smith 171997b48c8fSBarry Smith /* fix right hand side if needed */ 172097b48c8fSBarry Smith if (x && b) { 172197b48c8fSBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 172297b48c8fSBarry Smith ierr = VecGetArray(b,&bb);CHKERRQ(ierr); 17232205254eSKarl Rupp for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]]; 172497b48c8fSBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 172597b48c8fSBarry Smith ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr); 172697b48c8fSBarry Smith } 172797b48c8fSBarry Smith 17286f0a148fSBarry Smith for (i=0; i<N; i++) { 17296f0a148fSBarry Smith slot = l->v + rows[i]; 1730b9679d65SBarry Smith for (j=0; j<n; j++) { *slot = 0.0; slot += m;} 17316f0a148fSBarry Smith } 1732f4df32b1SMatthew Knepley if (diag != 0.0) { 1733b9679d65SBarry Smith if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 17346f0a148fSBarry Smith for (i=0; i<N; i++) { 1735b9679d65SBarry Smith slot = l->v + (m+1)*rows[i]; 1736f4df32b1SMatthew Knepley *slot = diag; 17376f0a148fSBarry Smith } 17386f0a148fSBarry Smith } 17393a40ed3dSBarry Smith PetscFunctionReturn(0); 17406f0a148fSBarry Smith } 1741557bce09SLois Curfman McInnes 1742e0877f53SBarry Smith static PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar *array[]) 174364e87e97SBarry Smith { 1744c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 17453a40ed3dSBarry Smith 17463a40ed3dSBarry Smith PetscFunctionBegin; 1747e32f2f54SBarry Smith if (mat->lda != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get array for Dense matrices with LDA different from number of rows"); 174864e87e97SBarry Smith *array = mat->v; 17493a40ed3dSBarry Smith PetscFunctionReturn(0); 175064e87e97SBarry Smith } 17510754003eSLois Curfman McInnes 1752e0877f53SBarry Smith static PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar *array[]) 1753ff14e315SSatish Balay { 17543a40ed3dSBarry Smith PetscFunctionBegin; 17553a40ed3dSBarry Smith PetscFunctionReturn(0); 1756ff14e315SSatish Balay } 17570754003eSLois Curfman McInnes 1758dec5eb66SMatthew G Knepley /*@C 17598c778c55SBarry Smith MatDenseGetArray - gives access to the array where the data for a SeqDense matrix is stored 176073a71a0fSBarry Smith 17618572280aSBarry Smith Logically Collective on Mat 176273a71a0fSBarry Smith 176373a71a0fSBarry Smith Input Parameter: 1764579dbff0SBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 176573a71a0fSBarry Smith 176673a71a0fSBarry Smith Output Parameter: 176773a71a0fSBarry Smith . array - pointer to the data 176873a71a0fSBarry Smith 176973a71a0fSBarry Smith Level: intermediate 177073a71a0fSBarry Smith 17718572280aSBarry Smith .seealso: MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead() 177273a71a0fSBarry Smith @*/ 17738c778c55SBarry Smith PetscErrorCode MatDenseGetArray(Mat A,PetscScalar **array) 177473a71a0fSBarry Smith { 177573a71a0fSBarry Smith PetscErrorCode ierr; 177673a71a0fSBarry Smith 177773a71a0fSBarry Smith PetscFunctionBegin; 17788c778c55SBarry Smith ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 177973a71a0fSBarry Smith PetscFunctionReturn(0); 178073a71a0fSBarry Smith } 178173a71a0fSBarry Smith 1782dec5eb66SMatthew G Knepley /*@C 1783579dbff0SBarry Smith MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray() 178473a71a0fSBarry Smith 17858572280aSBarry Smith Logically Collective on Mat 17868572280aSBarry Smith 17878572280aSBarry Smith Input Parameters: 17888572280aSBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 17898572280aSBarry Smith . array - pointer to the data 17908572280aSBarry Smith 17918572280aSBarry Smith Level: intermediate 17928572280aSBarry Smith 17938572280aSBarry Smith .seealso: MatDenseGetArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead() 17948572280aSBarry Smith @*/ 17958572280aSBarry Smith PetscErrorCode MatDenseRestoreArray(Mat A,PetscScalar **array) 17968572280aSBarry Smith { 17978572280aSBarry Smith PetscErrorCode ierr; 17988572280aSBarry Smith 17998572280aSBarry Smith PetscFunctionBegin; 18008572280aSBarry Smith ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 18018572280aSBarry Smith if (array) *array = NULL; 18028572280aSBarry Smith ierr = PetscObjectStateIncrease((PetscObject)A);CHKERRQ(ierr); 18038572280aSBarry Smith PetscFunctionReturn(0); 18048572280aSBarry Smith } 18058572280aSBarry Smith 18068572280aSBarry Smith /*@C 18078572280aSBarry Smith MatDenseGetArrayRead - gives access to the array where the data for a SeqDense matrix is stored 18088572280aSBarry Smith 18098572280aSBarry Smith Not Collective 18108572280aSBarry Smith 18118572280aSBarry Smith Input Parameter: 18128572280aSBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 18138572280aSBarry Smith 18148572280aSBarry Smith Output Parameter: 18158572280aSBarry Smith . array - pointer to the data 18168572280aSBarry Smith 18178572280aSBarry Smith Level: intermediate 18188572280aSBarry Smith 18198572280aSBarry Smith .seealso: MatDenseRestoreArray(), MatDenseGetArray(), MatDenseRestoreArrayRead() 18208572280aSBarry Smith @*/ 18218572280aSBarry Smith PetscErrorCode MatDenseGetArrayRead(Mat A,const PetscScalar **array) 18228572280aSBarry Smith { 18238572280aSBarry Smith PetscErrorCode ierr; 18248572280aSBarry Smith 18258572280aSBarry Smith PetscFunctionBegin; 18268572280aSBarry Smith ierr = PetscUseMethod(A,"MatDenseGetArrayRead_C",(Mat,const PetscScalar**),(A,array));CHKERRQ(ierr); 18278572280aSBarry Smith PetscFunctionReturn(0); 18288572280aSBarry Smith } 18298572280aSBarry Smith 18308572280aSBarry Smith /*@C 18318572280aSBarry Smith MatDenseRestoreArrayRead - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray() 18328572280aSBarry Smith 183373a71a0fSBarry Smith Not Collective 183473a71a0fSBarry Smith 183573a71a0fSBarry Smith Input Parameters: 1836579dbff0SBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 183773a71a0fSBarry Smith . array - pointer to the data 183873a71a0fSBarry Smith 183973a71a0fSBarry Smith Level: intermediate 184073a71a0fSBarry Smith 18418572280aSBarry Smith .seealso: MatDenseGetArray(), MatDenseGetArrayRead(), MatDenseRestoreArray() 184273a71a0fSBarry Smith @*/ 18438572280aSBarry Smith PetscErrorCode MatDenseRestoreArrayRead(Mat A,const PetscScalar **array) 184473a71a0fSBarry Smith { 184573a71a0fSBarry Smith PetscErrorCode ierr; 184673a71a0fSBarry Smith 184773a71a0fSBarry Smith PetscFunctionBegin; 18488572280aSBarry Smith ierr = PetscUseMethod(A,"MatDenseRestoreArrayRead_C",(Mat,const PetscScalar**),(A,array));CHKERRQ(ierr); 18498572280aSBarry Smith if (array) *array = NULL; 185073a71a0fSBarry Smith PetscFunctionReturn(0); 185173a71a0fSBarry Smith } 185273a71a0fSBarry Smith 18537dae84e0SHong Zhang static PetscErrorCode MatCreateSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B) 18540754003eSLois Curfman McInnes { 1855c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 18566849ba73SBarry Smith PetscErrorCode ierr; 18575d0c19d7SBarry Smith PetscInt i,j,nrows,ncols; 18585d0c19d7SBarry Smith const PetscInt *irow,*icol; 185987828ca2SBarry Smith PetscScalar *av,*bv,*v = mat->v; 18600754003eSLois Curfman McInnes Mat newmat; 18610754003eSLois Curfman McInnes 18623a40ed3dSBarry Smith PetscFunctionBegin; 186378b31e54SBarry Smith ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr); 186478b31e54SBarry Smith ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr); 1865e03a110bSBarry Smith ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr); 1866e03a110bSBarry Smith ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr); 18670754003eSLois Curfman McInnes 1868182d2002SSatish Balay /* Check submatrixcall */ 1869182d2002SSatish Balay if (scall == MAT_REUSE_MATRIX) { 187013f74950SBarry Smith PetscInt n_cols,n_rows; 1871182d2002SSatish Balay ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr); 187221a2c019SBarry Smith if (n_rows != nrows || n_cols != ncols) { 1873f746d493SDmitry Karpeev /* resize the result matrix to match number of requested rows/columns */ 1874c61587bbSBarry Smith ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 187521a2c019SBarry Smith } 1876182d2002SSatish Balay newmat = *B; 1877182d2002SSatish Balay } else { 18780754003eSLois Curfman McInnes /* Create and fill new matrix */ 1879ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr); 1880f69a0ea3SMatthew Knepley ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 18817adad957SLisandro Dalcin ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 18820298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr); 1883182d2002SSatish Balay } 1884182d2002SSatish Balay 1885182d2002SSatish Balay /* Now extract the data pointers and do the copy,column at a time */ 1886182d2002SSatish Balay bv = ((Mat_SeqDense*)newmat->data)->v; 1887182d2002SSatish Balay 1888182d2002SSatish Balay for (i=0; i<ncols; i++) { 18896de62eeeSBarry Smith av = v + mat->lda*icol[i]; 18902205254eSKarl Rupp for (j=0; j<nrows; j++) *bv++ = av[irow[j]]; 18910754003eSLois Curfman McInnes } 1892182d2002SSatish Balay 1893182d2002SSatish Balay /* Assemble the matrices so that the correct flags are set */ 18946d4a8577SBarry Smith ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 18956d4a8577SBarry Smith ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 18960754003eSLois Curfman McInnes 18970754003eSLois Curfman McInnes /* Free work space */ 189878b31e54SBarry Smith ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr); 189978b31e54SBarry Smith ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr); 1900182d2002SSatish Balay *B = newmat; 19013a40ed3dSBarry Smith PetscFunctionReturn(0); 19020754003eSLois Curfman McInnes } 19030754003eSLois Curfman McInnes 19047dae84e0SHong Zhang static PetscErrorCode MatCreateSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[]) 1905905e6a2fSBarry Smith { 19066849ba73SBarry Smith PetscErrorCode ierr; 190713f74950SBarry Smith PetscInt i; 1908905e6a2fSBarry Smith 19093a40ed3dSBarry Smith PetscFunctionBegin; 1910905e6a2fSBarry Smith if (scall == MAT_INITIAL_MATRIX) { 1911df750dc8SHong Zhang ierr = PetscCalloc1(n+1,B);CHKERRQ(ierr); 1912905e6a2fSBarry Smith } 1913905e6a2fSBarry Smith 1914905e6a2fSBarry Smith for (i=0; i<n; i++) { 19157dae84e0SHong Zhang ierr = MatCreateSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr); 1916905e6a2fSBarry Smith } 19173a40ed3dSBarry Smith PetscFunctionReturn(0); 1918905e6a2fSBarry Smith } 1919905e6a2fSBarry Smith 1920e0877f53SBarry Smith static PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode) 1921c0aa2d19SHong Zhang { 1922c0aa2d19SHong Zhang PetscFunctionBegin; 1923c0aa2d19SHong Zhang PetscFunctionReturn(0); 1924c0aa2d19SHong Zhang } 1925c0aa2d19SHong Zhang 1926e0877f53SBarry Smith static PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode) 1927c0aa2d19SHong Zhang { 1928c0aa2d19SHong Zhang PetscFunctionBegin; 1929c0aa2d19SHong Zhang PetscFunctionReturn(0); 1930c0aa2d19SHong Zhang } 1931c0aa2d19SHong Zhang 1932e0877f53SBarry Smith static PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str) 19334b0e389bSBarry Smith { 19344b0e389bSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data; 19356849ba73SBarry Smith PetscErrorCode ierr; 1936d0f46423SBarry Smith PetscInt lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j; 19373a40ed3dSBarry Smith 19383a40ed3dSBarry Smith PetscFunctionBegin; 193933f4a19fSKris Buschelman /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */ 194033f4a19fSKris Buschelman if (A->ops->copy != B->ops->copy) { 1941cb5b572fSBarry Smith ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr); 19423a40ed3dSBarry Smith PetscFunctionReturn(0); 19433a40ed3dSBarry Smith } 1944e32f2f54SBarry Smith if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)"); 1945a5ce6ee0Svictorle if (lda1>m || lda2>m) { 19460dbb7854Svictorle for (j=0; j<n; j++) { 1947a5ce6ee0Svictorle ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr); 1948a5ce6ee0Svictorle } 1949a5ce6ee0Svictorle } else { 1950d0f46423SBarry Smith ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1951a5ce6ee0Svictorle } 1952cdc753b6SBarry Smith ierr = PetscObjectStateIncrease((PetscObject)B);CHKERRQ(ierr); 1953273d9f13SBarry Smith PetscFunctionReturn(0); 1954273d9f13SBarry Smith } 1955273d9f13SBarry Smith 1956e0877f53SBarry Smith static PetscErrorCode MatSetUp_SeqDense(Mat A) 1957273d9f13SBarry Smith { 1958dfbe8321SBarry Smith PetscErrorCode ierr; 1959273d9f13SBarry Smith 1960273d9f13SBarry Smith PetscFunctionBegin; 1961273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr); 19623a40ed3dSBarry Smith PetscFunctionReturn(0); 19634b0e389bSBarry Smith } 19644b0e389bSBarry Smith 1965ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A) 1966ba337c44SJed Brown { 1967ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1968ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1969ba337c44SJed Brown PetscScalar *aa = a->v; 1970ba337c44SJed Brown 1971ba337c44SJed Brown PetscFunctionBegin; 1972ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]); 1973ba337c44SJed Brown PetscFunctionReturn(0); 1974ba337c44SJed Brown } 1975ba337c44SJed Brown 1976ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A) 1977ba337c44SJed Brown { 1978ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1979ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1980ba337c44SJed Brown PetscScalar *aa = a->v; 1981ba337c44SJed Brown 1982ba337c44SJed Brown PetscFunctionBegin; 1983ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]); 1984ba337c44SJed Brown PetscFunctionReturn(0); 1985ba337c44SJed Brown } 1986ba337c44SJed Brown 1987ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A) 1988ba337c44SJed Brown { 1989ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1990ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1991ba337c44SJed Brown PetscScalar *aa = a->v; 1992ba337c44SJed Brown 1993ba337c44SJed Brown PetscFunctionBegin; 1994ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]); 1995ba337c44SJed Brown PetscFunctionReturn(0); 1996ba337c44SJed Brown } 1997284134d9SBarry Smith 1998a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/ 1999150d2497SBarry Smith PETSC_INTERN PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 2000a9fe9ddaSSatish Balay { 2001a9fe9ddaSSatish Balay PetscErrorCode ierr; 2002a9fe9ddaSSatish Balay 2003a9fe9ddaSSatish Balay PetscFunctionBegin; 2004a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX) { 20053ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 2006a9fe9ddaSSatish Balay ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 20073ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 2008a9fe9ddaSSatish Balay } 20093ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr); 2010a9fe9ddaSSatish Balay ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 20113ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr); 2012a9fe9ddaSSatish Balay PetscFunctionReturn(0); 2013a9fe9ddaSSatish Balay } 2014a9fe9ddaSSatish Balay 2015a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 2016a9fe9ddaSSatish Balay { 2017ee16a9a1SHong Zhang PetscErrorCode ierr; 2018d0f46423SBarry Smith PetscInt m=A->rmap->n,n=B->cmap->n; 2019ee16a9a1SHong Zhang Mat Cmat; 2020a9fe9ddaSSatish Balay 2021ee16a9a1SHong Zhang PetscFunctionBegin; 2022e32f2f54SBarry Smith if (A->cmap->n != B->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"A->cmap->n %d != B->rmap->n %d\n",A->cmap->n,B->rmap->n); 2023ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 2024ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 2025ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 20260298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr); 2027d73949e8SHong Zhang 2028ee16a9a1SHong Zhang *C = Cmat; 2029ee16a9a1SHong Zhang PetscFunctionReturn(0); 2030ee16a9a1SHong Zhang } 2031a9fe9ddaSSatish Balay 2032a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 2033a9fe9ddaSSatish Balay { 2034a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2035a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 2036a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 20370805154bSBarry Smith PetscBLASInt m,n,k; 2038a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 2039c5df96a5SBarry Smith PetscErrorCode ierr; 2040fd4e9aacSBarry Smith PetscBool flg; 2041a9fe9ddaSSatish Balay 2042a9fe9ddaSSatish Balay PetscFunctionBegin; 2043fd4e9aacSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)B,MATSEQDENSE,&flg);CHKERRQ(ierr); 2044fd4e9aacSBarry Smith if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Second matrix must be dense"); 2045fd4e9aacSBarry Smith 2046fd4e9aacSBarry Smith /* Handle case where where user provided the final C matrix rather than calling MatMatMult() with MAT_INITIAL_MATRIX*/ 2047fd4e9aacSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&flg);CHKERRQ(ierr); 2048fd4e9aacSBarry Smith if (flg) { 2049fd4e9aacSBarry Smith C->ops->matmultnumeric = MatMatMultNumeric_SeqAIJ_SeqDense; 2050fd4e9aacSBarry Smith ierr = (*C->ops->matmultnumeric)(A,B,C);CHKERRQ(ierr); 2051fd4e9aacSBarry Smith PetscFunctionReturn(0); 2052fd4e9aacSBarry Smith } 2053fd4e9aacSBarry Smith 2054fd4e9aacSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQDENSE,&flg);CHKERRQ(ierr); 2055fd4e9aacSBarry Smith if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"First matrix must be dense"); 20568208b9aeSStefano Zampini ierr = PetscBLASIntCast(C->rmap->n,&m);CHKERRQ(ierr); 20578208b9aeSStefano Zampini ierr = PetscBLASIntCast(C->cmap->n,&n);CHKERRQ(ierr); 2058c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr); 20595ca1cc5dSStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda)); 2060a9fe9ddaSSatish Balay PetscFunctionReturn(0); 2061a9fe9ddaSSatish Balay } 2062a9fe9ddaSSatish Balay 206369f65d41SStefano Zampini PetscErrorCode MatMatTransposeMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 206469f65d41SStefano Zampini { 206569f65d41SStefano Zampini PetscErrorCode ierr; 206669f65d41SStefano Zampini 206769f65d41SStefano Zampini PetscFunctionBegin; 206869f65d41SStefano Zampini if (scall == MAT_INITIAL_MATRIX) { 206969f65d41SStefano Zampini ierr = PetscLogEventBegin(MAT_MatTransposeMultSymbolic,A,B,0,0);CHKERRQ(ierr); 207069f65d41SStefano Zampini ierr = MatMatTransposeMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 207169f65d41SStefano Zampini ierr = PetscLogEventEnd(MAT_MatTransposeMultSymbolic,A,B,0,0);CHKERRQ(ierr); 207269f65d41SStefano Zampini } 207369f65d41SStefano Zampini ierr = PetscLogEventBegin(MAT_MatTransposeMultNumeric,A,B,0,0);CHKERRQ(ierr); 207469f65d41SStefano Zampini ierr = MatMatTransposeMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 207569f65d41SStefano Zampini ierr = PetscLogEventEnd(MAT_MatTransposeMultNumeric,A,B,0,0);CHKERRQ(ierr); 207669f65d41SStefano Zampini PetscFunctionReturn(0); 207769f65d41SStefano Zampini } 207869f65d41SStefano Zampini 207969f65d41SStefano Zampini PetscErrorCode MatMatTransposeMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 208069f65d41SStefano Zampini { 208169f65d41SStefano Zampini PetscErrorCode ierr; 208269f65d41SStefano Zampini PetscInt m=A->rmap->n,n=B->rmap->n; 208369f65d41SStefano Zampini Mat Cmat; 208469f65d41SStefano Zampini 208569f65d41SStefano Zampini PetscFunctionBegin; 208669f65d41SStefano Zampini if (A->cmap->n != B->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"A->cmap->n %d != B->cmap->n %d\n",A->cmap->n,B->cmap->n); 208769f65d41SStefano Zampini ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 208869f65d41SStefano Zampini ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 208969f65d41SStefano Zampini ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 209069f65d41SStefano Zampini ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr); 209169f65d41SStefano Zampini 209269f65d41SStefano Zampini Cmat->assembled = PETSC_TRUE; 209369f65d41SStefano Zampini 209469f65d41SStefano Zampini *C = Cmat; 209569f65d41SStefano Zampini PetscFunctionReturn(0); 209669f65d41SStefano Zampini } 209769f65d41SStefano Zampini 209869f65d41SStefano Zampini PetscErrorCode MatMatTransposeMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 209969f65d41SStefano Zampini { 210069f65d41SStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 210169f65d41SStefano Zampini Mat_SeqDense *b = (Mat_SeqDense*)B->data; 210269f65d41SStefano Zampini Mat_SeqDense *c = (Mat_SeqDense*)C->data; 210369f65d41SStefano Zampini PetscBLASInt m,n,k; 210469f65d41SStefano Zampini PetscScalar _DOne=1.0,_DZero=0.0; 210569f65d41SStefano Zampini PetscErrorCode ierr; 210669f65d41SStefano Zampini 210769f65d41SStefano Zampini PetscFunctionBegin; 210869f65d41SStefano Zampini ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 210969f65d41SStefano Zampini ierr = PetscBLASIntCast(B->rmap->n,&n);CHKERRQ(ierr); 211069f65d41SStefano Zampini ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr); 211169f65d41SStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("N","T",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda)); 211269f65d41SStefano Zampini PetscFunctionReturn(0); 211369f65d41SStefano Zampini } 211469f65d41SStefano Zampini 211575648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 2116a9fe9ddaSSatish Balay { 2117a9fe9ddaSSatish Balay PetscErrorCode ierr; 2118a9fe9ddaSSatish Balay 2119a9fe9ddaSSatish Balay PetscFunctionBegin; 2120a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX) { 21213ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 212275648e8dSHong Zhang ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 21233ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 2124a9fe9ddaSSatish Balay } 21253ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr); 212675648e8dSHong Zhang ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 21273ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr); 2128a9fe9ddaSSatish Balay PetscFunctionReturn(0); 2129a9fe9ddaSSatish Balay } 2130a9fe9ddaSSatish Balay 213175648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 2132a9fe9ddaSSatish Balay { 2133ee16a9a1SHong Zhang PetscErrorCode ierr; 2134d0f46423SBarry Smith PetscInt m=A->cmap->n,n=B->cmap->n; 2135ee16a9a1SHong Zhang Mat Cmat; 2136a9fe9ddaSSatish Balay 2137ee16a9a1SHong Zhang PetscFunctionBegin; 2138e32f2f54SBarry Smith if (A->rmap->n != B->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"A->rmap->n %d != B->rmap->n %d\n",A->rmap->n,B->rmap->n); 2139ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 2140ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 2141ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 21420298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr); 21432205254eSKarl Rupp 2144ee16a9a1SHong Zhang Cmat->assembled = PETSC_TRUE; 21452205254eSKarl Rupp 2146ee16a9a1SHong Zhang *C = Cmat; 2147ee16a9a1SHong Zhang PetscFunctionReturn(0); 2148ee16a9a1SHong Zhang } 2149a9fe9ddaSSatish Balay 215075648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 2151a9fe9ddaSSatish Balay { 2152a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2153a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 2154a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 21550805154bSBarry Smith PetscBLASInt m,n,k; 2156a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 2157c5df96a5SBarry Smith PetscErrorCode ierr; 2158a9fe9ddaSSatish Balay 2159a9fe9ddaSSatish Balay PetscFunctionBegin; 21608208b9aeSStefano Zampini ierr = PetscBLASIntCast(C->rmap->n,&m);CHKERRQ(ierr); 21618208b9aeSStefano Zampini ierr = PetscBLASIntCast(C->cmap->n,&n);CHKERRQ(ierr); 2162c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr); 21635ca1cc5dSStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda)); 2164a9fe9ddaSSatish Balay PetscFunctionReturn(0); 2165a9fe9ddaSSatish Balay } 2166985db425SBarry Smith 2167e0877f53SBarry Smith static PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[]) 2168985db425SBarry Smith { 2169985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2170985db425SBarry Smith PetscErrorCode ierr; 2171d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 2172985db425SBarry Smith PetscScalar *x; 2173985db425SBarry Smith MatScalar *aa = a->v; 2174985db425SBarry Smith 2175985db425SBarry Smith PetscFunctionBegin; 2176e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2177985db425SBarry Smith 2178985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 2179985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2180985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 2181e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2182985db425SBarry Smith for (i=0; i<m; i++) { 2183985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 2184985db425SBarry Smith for (j=1; j<n; j++) { 2185985db425SBarry Smith if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 2186985db425SBarry Smith } 2187985db425SBarry Smith } 2188985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2189985db425SBarry Smith PetscFunctionReturn(0); 2190985db425SBarry Smith } 2191985db425SBarry Smith 2192e0877f53SBarry Smith static PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[]) 2193985db425SBarry Smith { 2194985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2195985db425SBarry Smith PetscErrorCode ierr; 2196d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 2197985db425SBarry Smith PetscScalar *x; 2198985db425SBarry Smith PetscReal atmp; 2199985db425SBarry Smith MatScalar *aa = a->v; 2200985db425SBarry Smith 2201985db425SBarry Smith PetscFunctionBegin; 2202e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2203985db425SBarry Smith 2204985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 2205985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2206985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 2207e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2208985db425SBarry Smith for (i=0; i<m; i++) { 22099189402eSHong Zhang x[i] = PetscAbsScalar(aa[i]); 2210985db425SBarry Smith for (j=1; j<n; j++) { 2211985db425SBarry Smith atmp = PetscAbsScalar(aa[i+m*j]); 2212985db425SBarry Smith if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;} 2213985db425SBarry Smith } 2214985db425SBarry Smith } 2215985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2216985db425SBarry Smith PetscFunctionReturn(0); 2217985db425SBarry Smith } 2218985db425SBarry Smith 2219e0877f53SBarry Smith static PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[]) 2220985db425SBarry Smith { 2221985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2222985db425SBarry Smith PetscErrorCode ierr; 2223d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 2224985db425SBarry Smith PetscScalar *x; 2225985db425SBarry Smith MatScalar *aa = a->v; 2226985db425SBarry Smith 2227985db425SBarry Smith PetscFunctionBegin; 2228e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2229985db425SBarry Smith 2230985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 2231985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2232985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 2233e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2234985db425SBarry Smith for (i=0; i<m; i++) { 2235985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 2236985db425SBarry Smith for (j=1; j<n; j++) { 2237985db425SBarry Smith if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 2238985db425SBarry Smith } 2239985db425SBarry Smith } 2240985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2241985db425SBarry Smith PetscFunctionReturn(0); 2242985db425SBarry Smith } 2243985db425SBarry Smith 2244e0877f53SBarry Smith static PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col) 22458d0534beSBarry Smith { 22468d0534beSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 22478d0534beSBarry Smith PetscErrorCode ierr; 22488d0534beSBarry Smith PetscScalar *x; 22498d0534beSBarry Smith 22508d0534beSBarry Smith PetscFunctionBegin; 2251e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 22528d0534beSBarry Smith 22538d0534beSBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2254d0f46423SBarry Smith ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 22558d0534beSBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 22568d0534beSBarry Smith PetscFunctionReturn(0); 22578d0534beSBarry Smith } 22588d0534beSBarry Smith 22590716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms) 22600716a85fSBarry Smith { 22610716a85fSBarry Smith PetscErrorCode ierr; 22620716a85fSBarry Smith PetscInt i,j,m,n; 22630716a85fSBarry Smith PetscScalar *a; 22640716a85fSBarry Smith 22650716a85fSBarry Smith PetscFunctionBegin; 22660716a85fSBarry Smith ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr); 22670716a85fSBarry Smith ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr); 22688c778c55SBarry Smith ierr = MatDenseGetArray(A,&a);CHKERRQ(ierr); 22690716a85fSBarry Smith if (type == NORM_2) { 22700716a85fSBarry Smith for (i=0; i<n; i++) { 22710716a85fSBarry Smith for (j=0; j<m; j++) { 22720716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]*a[j]); 22730716a85fSBarry Smith } 22740716a85fSBarry Smith a += m; 22750716a85fSBarry Smith } 22760716a85fSBarry Smith } else if (type == NORM_1) { 22770716a85fSBarry Smith for (i=0; i<n; i++) { 22780716a85fSBarry Smith for (j=0; j<m; j++) { 22790716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]); 22800716a85fSBarry Smith } 22810716a85fSBarry Smith a += m; 22820716a85fSBarry Smith } 22830716a85fSBarry Smith } else if (type == NORM_INFINITY) { 22840716a85fSBarry Smith for (i=0; i<n; i++) { 22850716a85fSBarry Smith for (j=0; j<m; j++) { 22860716a85fSBarry Smith norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]); 22870716a85fSBarry Smith } 22880716a85fSBarry Smith a += m; 22890716a85fSBarry Smith } 2290ce94432eSBarry Smith } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType"); 22918c778c55SBarry Smith ierr = MatDenseRestoreArray(A,&a);CHKERRQ(ierr); 22920716a85fSBarry Smith if (type == NORM_2) { 22938f1a2a5eSBarry Smith for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]); 22940716a85fSBarry Smith } 22950716a85fSBarry Smith PetscFunctionReturn(0); 22960716a85fSBarry Smith } 22970716a85fSBarry Smith 229873a71a0fSBarry Smith static PetscErrorCode MatSetRandom_SeqDense(Mat x,PetscRandom rctx) 229973a71a0fSBarry Smith { 230073a71a0fSBarry Smith PetscErrorCode ierr; 230173a71a0fSBarry Smith PetscScalar *a; 230273a71a0fSBarry Smith PetscInt m,n,i; 230373a71a0fSBarry Smith 230473a71a0fSBarry Smith PetscFunctionBegin; 230573a71a0fSBarry Smith ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr); 23068c778c55SBarry Smith ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr); 230773a71a0fSBarry Smith for (i=0; i<m*n; i++) { 230873a71a0fSBarry Smith ierr = PetscRandomGetValue(rctx,a+i);CHKERRQ(ierr); 230973a71a0fSBarry Smith } 23108c778c55SBarry Smith ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr); 231173a71a0fSBarry Smith PetscFunctionReturn(0); 231273a71a0fSBarry Smith } 231373a71a0fSBarry Smith 23143b49f96aSBarry Smith static PetscErrorCode MatMissingDiagonal_SeqDense(Mat A,PetscBool *missing,PetscInt *d) 23153b49f96aSBarry Smith { 23163b49f96aSBarry Smith PetscFunctionBegin; 23173b49f96aSBarry Smith *missing = PETSC_FALSE; 23183b49f96aSBarry Smith PetscFunctionReturn(0); 23193b49f96aSBarry Smith } 232073a71a0fSBarry Smith 2321af53bab2SHong Zhang static PetscErrorCode MatDenseGetColumn_SeqDense(Mat A,PetscInt col,PetscScalar **vals) 232286aefd0dSHong Zhang { 232386aefd0dSHong Zhang Mat_SeqDense *a = (Mat_SeqDense*)A->data; 232486aefd0dSHong Zhang 232586aefd0dSHong Zhang PetscFunctionBegin; 232686aefd0dSHong Zhang if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 232786aefd0dSHong Zhang *vals = a->v+col*a->lda; 232886aefd0dSHong Zhang PetscFunctionReturn(0); 232986aefd0dSHong Zhang } 233086aefd0dSHong Zhang 2331af53bab2SHong Zhang static PetscErrorCode MatDenseRestoreColumn_SeqDense(Mat A,PetscScalar **vals) 233286aefd0dSHong Zhang { 233386aefd0dSHong Zhang PetscFunctionBegin; 233486aefd0dSHong Zhang *vals = 0; /* user cannot accidently use the array later */ 233586aefd0dSHong Zhang PetscFunctionReturn(0); 233686aefd0dSHong Zhang } 2337abc3b08eSStefano Zampini 2338289bc588SBarry Smith /* -------------------------------------------------------------------*/ 2339a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense, 2340905e6a2fSBarry Smith MatGetRow_SeqDense, 2341905e6a2fSBarry Smith MatRestoreRow_SeqDense, 2342905e6a2fSBarry Smith MatMult_SeqDense, 234397304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense, 23447c922b88SBarry Smith MatMultTranspose_SeqDense, 23457c922b88SBarry Smith MatMultTransposeAdd_SeqDense, 2346db4efbfdSBarry Smith 0, 2347db4efbfdSBarry Smith 0, 2348db4efbfdSBarry Smith 0, 2349db4efbfdSBarry Smith /* 10*/ 0, 2350905e6a2fSBarry Smith MatLUFactor_SeqDense, 2351905e6a2fSBarry Smith MatCholeskyFactor_SeqDense, 235241f059aeSBarry Smith MatSOR_SeqDense, 2353ec8511deSBarry Smith MatTranspose_SeqDense, 235497304618SKris Buschelman /* 15*/ MatGetInfo_SeqDense, 2355905e6a2fSBarry Smith MatEqual_SeqDense, 2356905e6a2fSBarry Smith MatGetDiagonal_SeqDense, 2357905e6a2fSBarry Smith MatDiagonalScale_SeqDense, 2358905e6a2fSBarry Smith MatNorm_SeqDense, 2359c0aa2d19SHong Zhang /* 20*/ MatAssemblyBegin_SeqDense, 2360c0aa2d19SHong Zhang MatAssemblyEnd_SeqDense, 2361905e6a2fSBarry Smith MatSetOption_SeqDense, 2362905e6a2fSBarry Smith MatZeroEntries_SeqDense, 2363d519adbfSMatthew Knepley /* 24*/ MatZeroRows_SeqDense, 2364db4efbfdSBarry Smith 0, 2365db4efbfdSBarry Smith 0, 2366db4efbfdSBarry Smith 0, 2367db4efbfdSBarry Smith 0, 23684994cf47SJed Brown /* 29*/ MatSetUp_SeqDense, 2369273d9f13SBarry Smith 0, 2370905e6a2fSBarry Smith 0, 237173a71a0fSBarry Smith 0, 237273a71a0fSBarry Smith 0, 2373d519adbfSMatthew Knepley /* 34*/ MatDuplicate_SeqDense, 2374a5ae1ecdSBarry Smith 0, 2375a5ae1ecdSBarry Smith 0, 2376a5ae1ecdSBarry Smith 0, 2377a5ae1ecdSBarry Smith 0, 2378d519adbfSMatthew Knepley /* 39*/ MatAXPY_SeqDense, 23797dae84e0SHong Zhang MatCreateSubMatrices_SeqDense, 2380a5ae1ecdSBarry Smith 0, 23814b0e389bSBarry Smith MatGetValues_SeqDense, 2382a5ae1ecdSBarry Smith MatCopy_SeqDense, 2383d519adbfSMatthew Knepley /* 44*/ MatGetRowMax_SeqDense, 2384a5ae1ecdSBarry Smith MatScale_SeqDense, 23857d68702bSBarry Smith MatShift_Basic, 2386a5ae1ecdSBarry Smith 0, 23873f49a652SStefano Zampini MatZeroRowsColumns_SeqDense, 238873a71a0fSBarry Smith /* 49*/ MatSetRandom_SeqDense, 2389a5ae1ecdSBarry Smith 0, 2390a5ae1ecdSBarry Smith 0, 2391a5ae1ecdSBarry Smith 0, 2392a5ae1ecdSBarry Smith 0, 2393d519adbfSMatthew Knepley /* 54*/ 0, 2394a5ae1ecdSBarry Smith 0, 2395a5ae1ecdSBarry Smith 0, 2396a5ae1ecdSBarry Smith 0, 2397a5ae1ecdSBarry Smith 0, 2398d519adbfSMatthew Knepley /* 59*/ 0, 2399e03a110bSBarry Smith MatDestroy_SeqDense, 2400e03a110bSBarry Smith MatView_SeqDense, 2401357abbc8SBarry Smith 0, 240297304618SKris Buschelman 0, 2403d519adbfSMatthew Knepley /* 64*/ 0, 240497304618SKris Buschelman 0, 240597304618SKris Buschelman 0, 240697304618SKris Buschelman 0, 240797304618SKris Buschelman 0, 2408d519adbfSMatthew Knepley /* 69*/ MatGetRowMaxAbs_SeqDense, 240997304618SKris Buschelman 0, 241097304618SKris Buschelman 0, 241197304618SKris Buschelman 0, 241297304618SKris Buschelman 0, 2413d519adbfSMatthew Knepley /* 74*/ 0, 241497304618SKris Buschelman 0, 241597304618SKris Buschelman 0, 241697304618SKris Buschelman 0, 241797304618SKris Buschelman 0, 2418d519adbfSMatthew Knepley /* 79*/ 0, 241997304618SKris Buschelman 0, 242097304618SKris Buschelman 0, 242197304618SKris Buschelman 0, 24225bba2384SShri Abhyankar /* 83*/ MatLoad_SeqDense, 2423865e5f61SKris Buschelman 0, 24241cbb95d3SBarry Smith MatIsHermitian_SeqDense, 2425865e5f61SKris Buschelman 0, 2426865e5f61SKris Buschelman 0, 2427865e5f61SKris Buschelman 0, 2428d519adbfSMatthew Knepley /* 89*/ MatMatMult_SeqDense_SeqDense, 2429a9fe9ddaSSatish Balay MatMatMultSymbolic_SeqDense_SeqDense, 2430a9fe9ddaSSatish Balay MatMatMultNumeric_SeqDense_SeqDense, 2431abc3b08eSStefano Zampini MatPtAP_SeqDense_SeqDense, 2432abc3b08eSStefano Zampini MatPtAPSymbolic_SeqDense_SeqDense, 2433abc3b08eSStefano Zampini /* 94*/ MatPtAPNumeric_SeqDense_SeqDense, 243469f65d41SStefano Zampini MatMatTransposeMult_SeqDense_SeqDense, 243569f65d41SStefano Zampini MatMatTransposeMultSymbolic_SeqDense_SeqDense, 243669f65d41SStefano Zampini MatMatTransposeMultNumeric_SeqDense_SeqDense, 2437284134d9SBarry Smith 0, 2438d519adbfSMatthew Knepley /* 99*/ 0, 2439284134d9SBarry Smith 0, 2440284134d9SBarry Smith 0, 2441ba337c44SJed Brown MatConjugate_SeqDense, 2442f73d5cc4SBarry Smith 0, 2443ba337c44SJed Brown /*104*/ 0, 2444ba337c44SJed Brown MatRealPart_SeqDense, 2445ba337c44SJed Brown MatImaginaryPart_SeqDense, 2446985db425SBarry Smith 0, 2447985db425SBarry Smith 0, 24488208b9aeSStefano Zampini /*109*/ 0, 2449985db425SBarry Smith 0, 24508d0534beSBarry Smith MatGetRowMin_SeqDense, 2451aabbc4fbSShri Abhyankar MatGetColumnVector_SeqDense, 24523b49f96aSBarry Smith MatMissingDiagonal_SeqDense, 2453aabbc4fbSShri Abhyankar /*114*/ 0, 2454aabbc4fbSShri Abhyankar 0, 2455aabbc4fbSShri Abhyankar 0, 2456aabbc4fbSShri Abhyankar 0, 2457aabbc4fbSShri Abhyankar 0, 2458aabbc4fbSShri Abhyankar /*119*/ 0, 2459aabbc4fbSShri Abhyankar 0, 2460aabbc4fbSShri Abhyankar 0, 24610716a85fSBarry Smith 0, 24620716a85fSBarry Smith 0, 24630716a85fSBarry Smith /*124*/ 0, 24645df89d91SHong Zhang MatGetColumnNorms_SeqDense, 24655df89d91SHong Zhang 0, 24665df89d91SHong Zhang 0, 24675df89d91SHong Zhang 0, 24685df89d91SHong Zhang /*129*/ 0, 246975648e8dSHong Zhang MatTransposeMatMult_SeqDense_SeqDense, 247075648e8dSHong Zhang MatTransposeMatMultSymbolic_SeqDense_SeqDense, 247175648e8dSHong Zhang MatTransposeMatMultNumeric_SeqDense_SeqDense, 24723964eb88SJed Brown 0, 24733964eb88SJed Brown /*134*/ 0, 24743964eb88SJed Brown 0, 24753964eb88SJed Brown 0, 24763964eb88SJed Brown 0, 24773964eb88SJed Brown 0, 24783964eb88SJed Brown /*139*/ 0, 2479f9426fe0SMark Adams 0, 2480d528f656SJakub Kruzik 0, 2481d528f656SJakub Kruzik 0, 2482d528f656SJakub Kruzik 0, 2483d528f656SJakub Kruzik /*144*/ MatCreateMPIMatConcatenateSeqMat_SeqDense 2484985db425SBarry Smith }; 248590ace30eSBarry Smith 24864b828684SBarry Smith /*@C 2487fafbff53SBarry Smith MatCreateSeqDense - Creates a sequential dense matrix that 2488d65003e9SLois Curfman McInnes is stored in column major order (the usual Fortran 77 manner). Many 2489d65003e9SLois Curfman McInnes of the matrix operations use the BLAS and LAPACK routines. 2490289bc588SBarry Smith 2491db81eaa0SLois Curfman McInnes Collective on MPI_Comm 2492db81eaa0SLois Curfman McInnes 249320563c6bSBarry Smith Input Parameters: 2494db81eaa0SLois Curfman McInnes + comm - MPI communicator, set to PETSC_COMM_SELF 24950c775827SLois Curfman McInnes . m - number of rows 249618f449edSLois Curfman McInnes . n - number of columns 24970298fd71SBarry Smith - data - optional location of matrix data in column major order. Set data=NULL for PETSc 2498dfc5480cSLois Curfman McInnes to control all matrix memory allocation. 249920563c6bSBarry Smith 250020563c6bSBarry Smith Output Parameter: 250144cd7ae7SLois Curfman McInnes . A - the matrix 250220563c6bSBarry Smith 2503b259b22eSLois Curfman McInnes Notes: 250418f449edSLois Curfman McInnes The data input variable is intended primarily for Fortran programmers 250518f449edSLois Curfman McInnes who wish to allocate their own matrix memory space. Most users should 25060298fd71SBarry Smith set data=NULL. 250718f449edSLois Curfman McInnes 2508027ccd11SLois Curfman McInnes Level: intermediate 2509027ccd11SLois Curfman McInnes 2510dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS 2511d65003e9SLois Curfman McInnes 251269b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues() 251320563c6bSBarry Smith @*/ 25147087cfbeSBarry Smith PetscErrorCode MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A) 2515289bc588SBarry Smith { 2516dfbe8321SBarry Smith PetscErrorCode ierr; 25173b2fbd54SBarry Smith 25183a40ed3dSBarry Smith PetscFunctionBegin; 2519f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 2520f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr); 2521273d9f13SBarry Smith ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr); 2522273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr); 2523273d9f13SBarry Smith PetscFunctionReturn(0); 2524273d9f13SBarry Smith } 2525273d9f13SBarry Smith 2526273d9f13SBarry Smith /*@C 2527273d9f13SBarry Smith MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements 2528273d9f13SBarry Smith 2529273d9f13SBarry Smith Collective on MPI_Comm 2530273d9f13SBarry Smith 2531273d9f13SBarry Smith Input Parameters: 25321c4f3114SJed Brown + B - the matrix 25330298fd71SBarry Smith - data - the array (or NULL) 2534273d9f13SBarry Smith 2535273d9f13SBarry Smith Notes: 2536273d9f13SBarry Smith The data input variable is intended primarily for Fortran programmers 2537273d9f13SBarry Smith who wish to allocate their own matrix memory space. Most users should 2538284134d9SBarry Smith need not call this routine. 2539273d9f13SBarry Smith 2540273d9f13SBarry Smith Level: intermediate 2541273d9f13SBarry Smith 2542273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS 2543273d9f13SBarry Smith 254469b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA() 2545867c911aSBarry Smith 2546273d9f13SBarry Smith @*/ 25477087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation(Mat B,PetscScalar data[]) 2548273d9f13SBarry Smith { 25494ac538c5SBarry Smith PetscErrorCode ierr; 2550a23d5eceSKris Buschelman 2551a23d5eceSKris Buschelman PetscFunctionBegin; 25524ac538c5SBarry Smith ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr); 2553a23d5eceSKris Buschelman PetscFunctionReturn(0); 2554a23d5eceSKris Buschelman } 2555a23d5eceSKris Buschelman 25567087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data) 2557a23d5eceSKris Buschelman { 2558273d9f13SBarry Smith Mat_SeqDense *b; 2559dfbe8321SBarry Smith PetscErrorCode ierr; 2560273d9f13SBarry Smith 2561273d9f13SBarry Smith PetscFunctionBegin; 2562273d9f13SBarry Smith B->preallocated = PETSC_TRUE; 2563a868139aSShri Abhyankar 256434ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr); 256534ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr); 256634ef9618SShri Abhyankar 2567273d9f13SBarry Smith b = (Mat_SeqDense*)B->data; 256886d161a7SShri Abhyankar b->Mmax = B->rmap->n; 256986d161a7SShri Abhyankar b->Nmax = B->cmap->n; 257086d161a7SShri Abhyankar if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n; 257186d161a7SShri Abhyankar 2572220afb94SBarry Smith ierr = PetscIntMultError(b->lda,b->Nmax,NULL);CHKERRQ(ierr); 25739e8f95c4SLisandro Dalcin if (!data) { /* petsc-allocated storage */ 25749e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2575e92229d0SSatish Balay ierr = PetscCalloc1((size_t)b->lda*b->Nmax,&b->v);CHKERRQ(ierr); 25763bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr); 25772205254eSKarl Rupp 25789e8f95c4SLisandro Dalcin b->user_alloc = PETSC_FALSE; 2579273d9f13SBarry Smith } else { /* user-allocated storage */ 25809e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2581273d9f13SBarry Smith b->v = data; 2582273d9f13SBarry Smith b->user_alloc = PETSC_TRUE; 2583273d9f13SBarry Smith } 25840450473dSBarry Smith B->assembled = PETSC_TRUE; 2585273d9f13SBarry Smith PetscFunctionReturn(0); 2586273d9f13SBarry Smith } 2587273d9f13SBarry Smith 258865b80a83SHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 2589cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat) 25908baccfbdSHong Zhang { 2591d77f618aSHong Zhang Mat mat_elemental; 2592d77f618aSHong Zhang PetscErrorCode ierr; 2593d77f618aSHong Zhang PetscScalar *array,*v_colwise; 2594d77f618aSHong Zhang PetscInt M=A->rmap->N,N=A->cmap->N,i,j,k,*rows,*cols; 2595d77f618aSHong Zhang 25968baccfbdSHong Zhang PetscFunctionBegin; 2597d77f618aSHong Zhang ierr = PetscMalloc3(M*N,&v_colwise,M,&rows,N,&cols);CHKERRQ(ierr); 2598d77f618aSHong Zhang ierr = MatDenseGetArray(A,&array);CHKERRQ(ierr); 2599d77f618aSHong Zhang /* convert column-wise array into row-wise v_colwise, see MatSetValues_Elemental() */ 2600d77f618aSHong Zhang k = 0; 2601d77f618aSHong Zhang for (j=0; j<N; j++) { 2602d77f618aSHong Zhang cols[j] = j; 2603d77f618aSHong Zhang for (i=0; i<M; i++) { 2604d77f618aSHong Zhang v_colwise[j*M+i] = array[k++]; 2605d77f618aSHong Zhang } 2606d77f618aSHong Zhang } 2607d77f618aSHong Zhang for (i=0; i<M; i++) { 2608d77f618aSHong Zhang rows[i] = i; 2609d77f618aSHong Zhang } 2610d77f618aSHong Zhang ierr = MatDenseRestoreArray(A,&array);CHKERRQ(ierr); 2611d77f618aSHong Zhang 2612d77f618aSHong Zhang ierr = MatCreate(PetscObjectComm((PetscObject)A), &mat_elemental);CHKERRQ(ierr); 2613d77f618aSHong Zhang ierr = MatSetSizes(mat_elemental,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr); 2614d77f618aSHong Zhang ierr = MatSetType(mat_elemental,MATELEMENTAL);CHKERRQ(ierr); 2615d77f618aSHong Zhang ierr = MatSetUp(mat_elemental);CHKERRQ(ierr); 2616d77f618aSHong Zhang 2617d77f618aSHong Zhang /* PETSc-Elemental interaface uses axpy for setting off-processor entries, only ADD_VALUES is allowed */ 2618d77f618aSHong Zhang ierr = MatSetValues(mat_elemental,M,rows,N,cols,v_colwise,ADD_VALUES);CHKERRQ(ierr); 2619d77f618aSHong Zhang ierr = MatAssemblyBegin(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2620d77f618aSHong Zhang ierr = MatAssemblyEnd(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2621d77f618aSHong Zhang ierr = PetscFree3(v_colwise,rows,cols);CHKERRQ(ierr); 2622d77f618aSHong Zhang 2623511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 262428be2f97SBarry Smith ierr = MatHeaderReplace(A,&mat_elemental);CHKERRQ(ierr); 2625d77f618aSHong Zhang } else { 2626d77f618aSHong Zhang *newmat = mat_elemental; 2627d77f618aSHong Zhang } 26288baccfbdSHong Zhang PetscFunctionReturn(0); 26298baccfbdSHong Zhang } 263065b80a83SHong Zhang #endif 26318baccfbdSHong Zhang 26321b807ce4Svictorle /*@C 26331b807ce4Svictorle MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array 26341b807ce4Svictorle 26351b807ce4Svictorle Input parameter: 26361b807ce4Svictorle + A - the matrix 26371b807ce4Svictorle - lda - the leading dimension 26381b807ce4Svictorle 26391b807ce4Svictorle Notes: 2640867c911aSBarry Smith This routine is to be used in conjunction with MatSeqDenseSetPreallocation(); 26411b807ce4Svictorle it asserts that the preallocation has a leading dimension (the LDA parameter 26421b807ce4Svictorle of Blas and Lapack fame) larger than M, the first dimension of the matrix. 26431b807ce4Svictorle 26441b807ce4Svictorle Level: intermediate 26451b807ce4Svictorle 26461b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS 26471b807ce4Svictorle 2648284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize() 2649867c911aSBarry Smith 26501b807ce4Svictorle @*/ 26517087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetLDA(Mat B,PetscInt lda) 26521b807ce4Svictorle { 26531b807ce4Svictorle Mat_SeqDense *b = (Mat_SeqDense*)B->data; 265421a2c019SBarry Smith 26551b807ce4Svictorle PetscFunctionBegin; 2656e32f2f54SBarry 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); 26571b807ce4Svictorle b->lda = lda; 265821a2c019SBarry Smith b->changelda = PETSC_FALSE; 265921a2c019SBarry Smith b->Mmax = PetscMax(b->Mmax,lda); 26601b807ce4Svictorle PetscFunctionReturn(0); 26611b807ce4Svictorle } 26621b807ce4Svictorle 2663d528f656SJakub Kruzik PetscErrorCode MatCreateMPIMatConcatenateSeqMat_SeqDense(MPI_Comm comm,Mat inmat,PetscInt n,MatReuse scall,Mat *outmat) 2664d528f656SJakub Kruzik { 2665d528f656SJakub Kruzik PetscErrorCode ierr; 2666d528f656SJakub Kruzik PetscMPIInt size; 2667d528f656SJakub Kruzik 2668d528f656SJakub Kruzik PetscFunctionBegin; 2669d528f656SJakub Kruzik ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 2670d528f656SJakub Kruzik if (size == 1) { 2671d528f656SJakub Kruzik if (scall == MAT_INITIAL_MATRIX) { 2672d528f656SJakub Kruzik ierr = MatDuplicate(inmat,MAT_COPY_VALUES,outmat);CHKERRQ(ierr); 2673d528f656SJakub Kruzik } else { 2674d528f656SJakub Kruzik ierr = MatCopy(inmat,*outmat,SAME_NONZERO_PATTERN);CHKERRQ(ierr); 2675d528f656SJakub Kruzik } 2676d528f656SJakub Kruzik } else { 2677d528f656SJakub Kruzik ierr = MatCreateMPIMatConcatenateSeqMat_MPIDense(comm,inmat,n,scall,outmat);CHKERRQ(ierr); 2678d528f656SJakub Kruzik } 2679d528f656SJakub Kruzik PetscFunctionReturn(0); 2680d528f656SJakub Kruzik } 2681d528f656SJakub Kruzik 26820bad9183SKris Buschelman /*MC 2683fafad747SKris Buschelman MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices. 26840bad9183SKris Buschelman 26850bad9183SKris Buschelman Options Database Keys: 26860bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions() 26870bad9183SKris Buschelman 26880bad9183SKris Buschelman Level: beginner 26890bad9183SKris Buschelman 269089665df3SBarry Smith .seealso: MatCreateSeqDense() 269189665df3SBarry Smith 26920bad9183SKris Buschelman M*/ 26930bad9183SKris Buschelman 26948cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatCreate_SeqDense(Mat B) 2695273d9f13SBarry Smith { 2696273d9f13SBarry Smith Mat_SeqDense *b; 2697dfbe8321SBarry Smith PetscErrorCode ierr; 26987c334f02SBarry Smith PetscMPIInt size; 2699273d9f13SBarry Smith 2700273d9f13SBarry Smith PetscFunctionBegin; 2701ce94432eSBarry Smith ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr); 2702e32f2f54SBarry Smith if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1"); 270355659b69SBarry Smith 2704b00a9115SJed Brown ierr = PetscNewLog(B,&b);CHKERRQ(ierr); 2705549d3d68SSatish Balay ierr = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr); 270644cd7ae7SLois Curfman McInnes B->data = (void*)b; 270718f449edSLois Curfman McInnes 2708273d9f13SBarry Smith b->roworiented = PETSC_TRUE; 27094e220ebcSLois Curfman McInnes 2710bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr); 27118572280aSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr); 2712d3042a70SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDensePlaceArray_C",MatDensePlaceArray_SeqDense);CHKERRQ(ierr); 2713d3042a70SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseResetArray_C",MatDenseResetArray_SeqDense);CHKERRQ(ierr); 27148572280aSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArrayRead_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr); 2715715b7558SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArrayRead_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr); 2716bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr); 27178baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 27188baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr); 27198baccfbdSHong Zhang #endif 2720bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr); 2721bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaij_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 2722bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 2723bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 2724abc3b08eSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatPtAP_seqaij_seqdense_C",MatPtAP_SeqDense_SeqDense);CHKERRQ(ierr); 27254099cc6bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaijperm_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 27264099cc6bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaijperm_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 27274099cc6bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaijperm_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 27284099cc6bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatPtAP_seqaijperm_seqdense_C",MatPtAP_SeqDense_SeqDense);CHKERRQ(ierr); 2729*e9e4f4a6SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaijsell_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 2730*e9e4f4a6SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaijsell_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 2731*e9e4f4a6SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaijsell_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 2732*e9e4f4a6SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatPtAP_seqaijsell_seqdense_C",MatPtAP_SeqDense_SeqDense);CHKERRQ(ierr); 273396e6d5c4SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaijmkl_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 273496e6d5c4SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaijmkl_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 273596e6d5c4SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaijmkl_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 273696e6d5c4SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatPtAP_seqaijmkl_seqdense_C",MatPtAP_SeqDense_SeqDense);CHKERRQ(ierr); 273796e6d5c4SRichard Tran Mills 27383bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaij_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 27393bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 27403bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaij_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 27414099cc6bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaijperm_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 27424099cc6bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaijperm_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 27434099cc6bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaijperm_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 2744*e9e4f4a6SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaijsell_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 2745*e9e4f4a6SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaijsell_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 2746*e9e4f4a6SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaijsell_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 274796e6d5c4SRichard Tran Mills 274896e6d5c4SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaijmkl_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 274996e6d5c4SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaijmkl_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 275096e6d5c4SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaijmkl_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 2751af53bab2SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumn_C",MatDenseGetColumn_SeqDense);CHKERRQ(ierr); 2752af53bab2SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumn_C",MatDenseRestoreColumn_SeqDense);CHKERRQ(ierr); 275317667f90SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr); 27543a40ed3dSBarry Smith PetscFunctionReturn(0); 2755289bc588SBarry Smith } 275686aefd0dSHong Zhang 275786aefd0dSHong Zhang /*@C 2758af53bab2SHong 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. 275986aefd0dSHong Zhang 276086aefd0dSHong Zhang Not Collective 276186aefd0dSHong Zhang 276286aefd0dSHong Zhang Input Parameter: 276386aefd0dSHong Zhang + mat - a MATSEQDENSE or MATMPIDENSE matrix 276486aefd0dSHong Zhang - col - column index 276586aefd0dSHong Zhang 276686aefd0dSHong Zhang Output Parameter: 276786aefd0dSHong Zhang . vals - pointer to the data 276886aefd0dSHong Zhang 276986aefd0dSHong Zhang Level: intermediate 277086aefd0dSHong Zhang 277186aefd0dSHong Zhang .seealso: MatDenseRestoreColumn() 277286aefd0dSHong Zhang @*/ 277386aefd0dSHong Zhang PetscErrorCode MatDenseGetColumn(Mat A,PetscInt col,PetscScalar **vals) 277486aefd0dSHong Zhang { 277586aefd0dSHong Zhang PetscErrorCode ierr; 277686aefd0dSHong Zhang 277786aefd0dSHong Zhang PetscFunctionBegin; 277886aefd0dSHong Zhang ierr = PetscUseMethod(A,"MatDenseGetColumn_C",(Mat,PetscInt,PetscScalar**),(A,col,vals));CHKERRQ(ierr); 277986aefd0dSHong Zhang PetscFunctionReturn(0); 278086aefd0dSHong Zhang } 278186aefd0dSHong Zhang 278286aefd0dSHong Zhang /*@C 278386aefd0dSHong Zhang MatDenseRestoreColumn - returns access to a column of a dense matrix which is returned by MatDenseGetColumn(). 278486aefd0dSHong Zhang 278586aefd0dSHong Zhang Not Collective 278686aefd0dSHong Zhang 278786aefd0dSHong Zhang Input Parameter: 278886aefd0dSHong Zhang . mat - a MATSEQDENSE or MATMPIDENSE matrix 278986aefd0dSHong Zhang 279086aefd0dSHong Zhang Output Parameter: 279186aefd0dSHong Zhang . vals - pointer to the data 279286aefd0dSHong Zhang 279386aefd0dSHong Zhang Level: intermediate 279486aefd0dSHong Zhang 279586aefd0dSHong Zhang .seealso: MatDenseGetColumn() 279686aefd0dSHong Zhang @*/ 279786aefd0dSHong Zhang PetscErrorCode MatDenseRestoreColumn(Mat A,PetscScalar **vals) 279886aefd0dSHong Zhang { 279986aefd0dSHong Zhang PetscErrorCode ierr; 280086aefd0dSHong Zhang 280186aefd0dSHong Zhang PetscFunctionBegin; 280286aefd0dSHong Zhang ierr = PetscUseMethod(A,"MatDenseRestoreColumn_C",(Mat,PetscScalar**),(A,vals));CHKERRQ(ierr); 280386aefd0dSHong Zhang PetscFunctionReturn(0); 280486aefd0dSHong Zhang } 2805