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) { 1166c4d906cSStefano Zampini Vec xt; 1176c4d906cSStefano Zampini 1186c4d906cSStefano Zampini if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 1196c4d906cSStefano Zampini ierr = VecDuplicate(x,&xt);CHKERRQ(ierr); 1206c4d906cSStefano Zampini ierr = VecCopy(x,xt);CHKERRQ(ierr); 1216c4d906cSStefano Zampini ierr = VecScale(xt,-1.0);CHKERRQ(ierr); 1226c4d906cSStefano Zampini ierr = MatMultAdd(A,xt,b,b);CHKERRQ(ierr); 1236c4d906cSStefano Zampini ierr = VecDestroy(&xt);CHKERRQ(ierr); 1243f49a652SStefano Zampini ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 1253f49a652SStefano Zampini ierr = VecGetArray(b,&bb);CHKERRQ(ierr); 1263f49a652SStefano Zampini for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]]; 1273f49a652SStefano Zampini ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 1283f49a652SStefano Zampini ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr); 1293f49a652SStefano Zampini } 1303f49a652SStefano Zampini 1313f49a652SStefano Zampini for (i=0; i<N; i++) { 1323f49a652SStefano Zampini slot = l->v + rows[i]*m; 1333f49a652SStefano Zampini ierr = PetscMemzero(slot,r*sizeof(PetscScalar));CHKERRQ(ierr); 1343f49a652SStefano Zampini } 1353f49a652SStefano Zampini for (i=0; i<N; i++) { 1363f49a652SStefano Zampini slot = l->v + rows[i]; 1373f49a652SStefano Zampini for (j=0; j<n; j++) { *slot = 0.0; slot += m;} 1383f49a652SStefano Zampini } 1393f49a652SStefano Zampini if (diag != 0.0) { 1403f49a652SStefano Zampini if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 1413f49a652SStefano Zampini for (i=0; i<N; i++) { 1423f49a652SStefano Zampini slot = l->v + (m+1)*rows[i]; 1433f49a652SStefano Zampini *slot = diag; 1443f49a652SStefano Zampini } 1453f49a652SStefano Zampini } 1463f49a652SStefano Zampini PetscFunctionReturn(0); 1473f49a652SStefano Zampini } 1483f49a652SStefano Zampini 149abc3b08eSStefano Zampini PetscErrorCode MatPtAPNumeric_SeqDense_SeqDense(Mat A,Mat P,Mat C) 150abc3b08eSStefano Zampini { 151abc3b08eSStefano Zampini Mat_SeqDense *c = (Mat_SeqDense*)(C->data); 152abc3b08eSStefano Zampini PetscErrorCode ierr; 153abc3b08eSStefano Zampini 154abc3b08eSStefano Zampini PetscFunctionBegin; 155abc3b08eSStefano Zampini ierr = MatMatMultNumeric_SeqDense_SeqDense(A,P,c->ptapwork);CHKERRQ(ierr); 156abc3b08eSStefano Zampini ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(P,c->ptapwork,C);CHKERRQ(ierr); 157abc3b08eSStefano Zampini PetscFunctionReturn(0); 158abc3b08eSStefano Zampini } 159abc3b08eSStefano Zampini 160abc3b08eSStefano Zampini PetscErrorCode MatPtAPSymbolic_SeqDense_SeqDense(Mat A,Mat P,PetscReal fill,Mat *C) 161abc3b08eSStefano Zampini { 162abc3b08eSStefano Zampini Mat_SeqDense *c; 163abc3b08eSStefano Zampini PetscErrorCode ierr; 164abc3b08eSStefano Zampini 165abc3b08eSStefano Zampini PetscFunctionBegin; 166abc3b08eSStefano Zampini ierr = MatCreateSeqDense(PetscObjectComm((PetscObject)A),P->cmap->N,P->cmap->N,NULL,C);CHKERRQ(ierr); 167abc3b08eSStefano Zampini c = (Mat_SeqDense*)((*C)->data); 168abc3b08eSStefano Zampini ierr = MatCreateSeqDense(PetscObjectComm((PetscObject)A),A->rmap->N,P->cmap->N,NULL,&c->ptapwork);CHKERRQ(ierr); 169abc3b08eSStefano Zampini PetscFunctionReturn(0); 170abc3b08eSStefano Zampini } 171abc3b08eSStefano Zampini 172150d2497SBarry Smith PETSC_INTERN PetscErrorCode MatPtAP_SeqDense_SeqDense(Mat A,Mat P,MatReuse reuse,PetscReal fill,Mat *C) 173abc3b08eSStefano Zampini { 174abc3b08eSStefano Zampini PetscErrorCode ierr; 175abc3b08eSStefano Zampini 176abc3b08eSStefano Zampini PetscFunctionBegin; 177abc3b08eSStefano Zampini if (reuse == MAT_INITIAL_MATRIX) { 178abc3b08eSStefano Zampini ierr = MatPtAPSymbolic_SeqDense_SeqDense(A,P,fill,C);CHKERRQ(ierr); 179abc3b08eSStefano Zampini } 180abc3b08eSStefano Zampini ierr = PetscLogEventBegin(MAT_PtAPNumeric,A,P,0,0);CHKERRQ(ierr); 181abc3b08eSStefano Zampini ierr = (*(*C)->ops->ptapnumeric)(A,P,*C);CHKERRQ(ierr); 182abc3b08eSStefano Zampini ierr = PetscLogEventEnd(MAT_PtAPNumeric,A,P,0,0);CHKERRQ(ierr); 183abc3b08eSStefano Zampini PetscFunctionReturn(0); 184abc3b08eSStefano Zampini } 185abc3b08eSStefano Zampini 186cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqAIJ_SeqDense(Mat A,MatType newtype,MatReuse reuse,Mat *newmat) 187b49cda9fSStefano Zampini { 188a13144ffSStefano Zampini Mat B = NULL; 189b49cda9fSStefano Zampini Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 190b49cda9fSStefano Zampini Mat_SeqDense *b; 191b49cda9fSStefano Zampini PetscErrorCode ierr; 192b49cda9fSStefano Zampini PetscInt *ai=a->i,*aj=a->j,m=A->rmap->N,n=A->cmap->N,i; 193b49cda9fSStefano Zampini MatScalar *av=a->a; 194a13144ffSStefano Zampini PetscBool isseqdense; 195b49cda9fSStefano Zampini 196b49cda9fSStefano Zampini PetscFunctionBegin; 197a13144ffSStefano Zampini if (reuse == MAT_REUSE_MATRIX) { 198a13144ffSStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)*newmat,MATSEQDENSE,&isseqdense);CHKERRQ(ierr); 199a13144ffSStefano Zampini if (!isseqdense) SETERRQ1(PetscObjectComm((PetscObject)*newmat),PETSC_ERR_USER,"Cannot reuse matrix of type %s",((PetscObject)(*newmat))->type); 200a13144ffSStefano Zampini } 201a13144ffSStefano Zampini if (reuse != MAT_REUSE_MATRIX) { 202b49cda9fSStefano Zampini ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); 203b49cda9fSStefano Zampini ierr = MatSetSizes(B,m,n,m,n);CHKERRQ(ierr); 204b49cda9fSStefano Zampini ierr = MatSetType(B,MATSEQDENSE);CHKERRQ(ierr); 205b49cda9fSStefano Zampini ierr = MatSeqDenseSetPreallocation(B,NULL);CHKERRQ(ierr); 206b49cda9fSStefano Zampini b = (Mat_SeqDense*)(B->data); 207a13144ffSStefano Zampini } else { 208a13144ffSStefano Zampini b = (Mat_SeqDense*)((*newmat)->data); 209a13144ffSStefano Zampini ierr = PetscMemzero(b->v,m*n*sizeof(PetscScalar));CHKERRQ(ierr); 210a13144ffSStefano Zampini } 211b49cda9fSStefano Zampini for (i=0; i<m; i++) { 212b49cda9fSStefano Zampini PetscInt j; 213b49cda9fSStefano Zampini for (j=0;j<ai[1]-ai[0];j++) { 214b49cda9fSStefano Zampini b->v[*aj*m+i] = *av; 215b49cda9fSStefano Zampini aj++; 216b49cda9fSStefano Zampini av++; 217b49cda9fSStefano Zampini } 218b49cda9fSStefano Zampini ai++; 219b49cda9fSStefano Zampini } 220b49cda9fSStefano Zampini 221511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 222a13144ffSStefano Zampini ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 223a13144ffSStefano Zampini ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 22428be2f97SBarry Smith ierr = MatHeaderReplace(A,&B);CHKERRQ(ierr); 225b49cda9fSStefano Zampini } else { 226a13144ffSStefano Zampini if (B) *newmat = B; 227a13144ffSStefano Zampini ierr = MatAssemblyBegin(*newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 228a13144ffSStefano Zampini ierr = MatAssemblyEnd(*newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 229b49cda9fSStefano Zampini } 230b49cda9fSStefano Zampini PetscFunctionReturn(0); 231b49cda9fSStefano Zampini } 232b49cda9fSStefano Zampini 233cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqDense_SeqAIJ(Mat A, MatType newtype,MatReuse reuse,Mat *newmat) 2346a63e612SBarry Smith { 2356a63e612SBarry Smith Mat B; 2366a63e612SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2376a63e612SBarry Smith PetscErrorCode ierr; 2389399e1b8SMatthew G. Knepley PetscInt i, j; 2399399e1b8SMatthew G. Knepley PetscInt *rows, *nnz; 2409399e1b8SMatthew G. Knepley MatScalar *aa = a->v, *vals; 2416a63e612SBarry Smith 2426a63e612SBarry Smith PetscFunctionBegin; 243ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); 2446a63e612SBarry Smith ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 2456a63e612SBarry Smith ierr = MatSetType(B,MATSEQAIJ);CHKERRQ(ierr); 2469399e1b8SMatthew G. Knepley ierr = PetscCalloc3(A->rmap->n,&rows,A->rmap->n,&nnz,A->rmap->n,&vals);CHKERRQ(ierr); 2479399e1b8SMatthew G. Knepley for (j=0; j<A->cmap->n; j++) { 2489399e1b8SMatthew G. Knepley for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) ++nnz[i]; 2496a63e612SBarry Smith aa += a->lda; 2506a63e612SBarry Smith } 2519399e1b8SMatthew G. Knepley ierr = MatSeqAIJSetPreallocation(B,PETSC_DETERMINE,nnz);CHKERRQ(ierr); 2529399e1b8SMatthew G. Knepley aa = a->v; 2539399e1b8SMatthew G. Knepley for (j=0; j<A->cmap->n; j++) { 2549399e1b8SMatthew G. Knepley PetscInt numRows = 0; 2559399e1b8SMatthew G. Knepley for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) {rows[numRows] = i; vals[numRows++] = aa[i];} 2569399e1b8SMatthew G. Knepley ierr = MatSetValues(B,numRows,rows,1,&j,vals,INSERT_VALUES);CHKERRQ(ierr); 2579399e1b8SMatthew G. Knepley aa += a->lda; 2589399e1b8SMatthew G. Knepley } 2599399e1b8SMatthew G. Knepley ierr = PetscFree3(rows,nnz,vals);CHKERRQ(ierr); 2606a63e612SBarry Smith ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2616a63e612SBarry Smith ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2626a63e612SBarry Smith 263511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 26428be2f97SBarry Smith ierr = MatHeaderReplace(A,&B);CHKERRQ(ierr); 2656a63e612SBarry Smith } else { 2666a63e612SBarry Smith *newmat = B; 2676a63e612SBarry Smith } 2686a63e612SBarry Smith PetscFunctionReturn(0); 2696a63e612SBarry Smith } 2706a63e612SBarry Smith 271e0877f53SBarry Smith static PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str) 2721987afe7SBarry Smith { 2731987afe7SBarry Smith Mat_SeqDense *x = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data; 274f4df32b1SMatthew Knepley PetscScalar oalpha = alpha; 27513f74950SBarry Smith PetscInt j; 2760805154bSBarry Smith PetscBLASInt N,m,ldax,lday,one = 1; 277efee365bSSatish Balay PetscErrorCode ierr; 2783a40ed3dSBarry Smith 2793a40ed3dSBarry Smith PetscFunctionBegin; 280c5df96a5SBarry Smith ierr = PetscBLASIntCast(X->rmap->n*X->cmap->n,&N);CHKERRQ(ierr); 281c5df96a5SBarry Smith ierr = PetscBLASIntCast(X->rmap->n,&m);CHKERRQ(ierr); 282c5df96a5SBarry Smith ierr = PetscBLASIntCast(x->lda,&ldax);CHKERRQ(ierr); 283c5df96a5SBarry Smith ierr = PetscBLASIntCast(y->lda,&lday);CHKERRQ(ierr); 284a5ce6ee0Svictorle if (ldax>m || lday>m) { 285d0f46423SBarry Smith for (j=0; j<X->cmap->n; j++) { 2868b83055fSJed Brown PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&m,&oalpha,x->v+j*ldax,&one,y->v+j*lday,&one)); 287a5ce6ee0Svictorle } 288a5ce6ee0Svictorle } else { 2898b83055fSJed Brown PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&N,&oalpha,x->v,&one,y->v,&one)); 290a5ce6ee0Svictorle } 291a3fa217bSJose E. Roman ierr = PetscObjectStateIncrease((PetscObject)Y);CHKERRQ(ierr); 2920450473dSBarry Smith ierr = PetscLogFlops(PetscMax(2*N-1,0));CHKERRQ(ierr); 2933a40ed3dSBarry Smith PetscFunctionReturn(0); 2941987afe7SBarry Smith } 2951987afe7SBarry Smith 296e0877f53SBarry Smith static PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info) 297289bc588SBarry Smith { 298d0f46423SBarry Smith PetscInt N = A->rmap->n*A->cmap->n; 2993a40ed3dSBarry Smith 3003a40ed3dSBarry Smith PetscFunctionBegin; 3014e220ebcSLois Curfman McInnes info->block_size = 1.0; 3024e220ebcSLois Curfman McInnes info->nz_allocated = (double)N; 3036de62eeeSBarry Smith info->nz_used = (double)N; 3046de62eeeSBarry Smith info->nz_unneeded = (double)0; 3054e220ebcSLois Curfman McInnes info->assemblies = (double)A->num_ass; 3064e220ebcSLois Curfman McInnes info->mallocs = 0; 3077adad957SLisandro Dalcin info->memory = ((PetscObject)A)->mem; 3084e220ebcSLois Curfman McInnes info->fill_ratio_given = 0; 3094e220ebcSLois Curfman McInnes info->fill_ratio_needed = 0; 3104e220ebcSLois Curfman McInnes info->factor_mallocs = 0; 3113a40ed3dSBarry Smith PetscFunctionReturn(0); 312289bc588SBarry Smith } 313289bc588SBarry Smith 314e0877f53SBarry Smith static PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha) 31580cd9d93SLois Curfman McInnes { 316273d9f13SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 317f4df32b1SMatthew Knepley PetscScalar oalpha = alpha; 318efee365bSSatish Balay PetscErrorCode ierr; 319c5df96a5SBarry Smith PetscBLASInt one = 1,j,nz,lda; 32080cd9d93SLois Curfman McInnes 3213a40ed3dSBarry Smith PetscFunctionBegin; 322c5df96a5SBarry Smith ierr = PetscBLASIntCast(a->lda,&lda);CHKERRQ(ierr); 323d0f46423SBarry Smith if (lda>A->rmap->n) { 324c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&nz);CHKERRQ(ierr); 325d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 3268b83055fSJed Brown PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v+j*lda,&one)); 327a5ce6ee0Svictorle } 328a5ce6ee0Svictorle } else { 329c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n*A->cmap->n,&nz);CHKERRQ(ierr); 3308b83055fSJed Brown PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v,&one)); 331a5ce6ee0Svictorle } 332efee365bSSatish Balay ierr = PetscLogFlops(nz);CHKERRQ(ierr); 3333a40ed3dSBarry Smith PetscFunctionReturn(0); 33480cd9d93SLois Curfman McInnes } 33580cd9d93SLois Curfman McInnes 336e0877f53SBarry Smith static PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscBool *fl) 3371cbb95d3SBarry Smith { 3381cbb95d3SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 339d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,N; 3401cbb95d3SBarry Smith PetscScalar *v = a->v; 3411cbb95d3SBarry Smith 3421cbb95d3SBarry Smith PetscFunctionBegin; 3431cbb95d3SBarry Smith *fl = PETSC_FALSE; 344d0f46423SBarry Smith if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0); 3451cbb95d3SBarry Smith N = a->lda; 3461cbb95d3SBarry Smith 3471cbb95d3SBarry Smith for (i=0; i<m; i++) { 3481cbb95d3SBarry Smith for (j=i+1; j<m; j++) { 3491cbb95d3SBarry Smith if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) PetscFunctionReturn(0); 3501cbb95d3SBarry Smith } 3511cbb95d3SBarry Smith } 3521cbb95d3SBarry Smith *fl = PETSC_TRUE; 3531cbb95d3SBarry Smith PetscFunctionReturn(0); 3541cbb95d3SBarry Smith } 3551cbb95d3SBarry Smith 356e0877f53SBarry Smith static PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat newi,Mat A,MatDuplicateOption cpvalues) 357b24902e0SBarry Smith { 358b24902e0SBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data,*l; 359b24902e0SBarry Smith PetscErrorCode ierr; 360b24902e0SBarry Smith PetscInt lda = (PetscInt)mat->lda,j,m; 361b24902e0SBarry Smith 362b24902e0SBarry Smith PetscFunctionBegin; 363aa5ea44dSBarry Smith ierr = PetscLayoutReference(A->rmap,&newi->rmap);CHKERRQ(ierr); 364aa5ea44dSBarry Smith ierr = PetscLayoutReference(A->cmap,&newi->cmap);CHKERRQ(ierr); 3650298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newi,NULL);CHKERRQ(ierr); 366b24902e0SBarry Smith if (cpvalues == MAT_COPY_VALUES) { 367b24902e0SBarry Smith l = (Mat_SeqDense*)newi->data; 368d0f46423SBarry Smith if (lda>A->rmap->n) { 369d0f46423SBarry Smith m = A->rmap->n; 370d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 371b24902e0SBarry Smith ierr = PetscMemcpy(l->v+j*m,mat->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 372b24902e0SBarry Smith } 373b24902e0SBarry Smith } else { 374d0f46423SBarry Smith ierr = PetscMemcpy(l->v,mat->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 375b24902e0SBarry Smith } 376b24902e0SBarry Smith } 377b24902e0SBarry Smith newi->assembled = PETSC_TRUE; 378b24902e0SBarry Smith PetscFunctionReturn(0); 379b24902e0SBarry Smith } 380b24902e0SBarry Smith 381e0877f53SBarry Smith static PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat) 38202cad45dSBarry Smith { 3836849ba73SBarry Smith PetscErrorCode ierr; 38402cad45dSBarry Smith 3853a40ed3dSBarry Smith PetscFunctionBegin; 386ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),newmat);CHKERRQ(ierr); 387d0f46423SBarry Smith ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 3885c9eb25fSBarry Smith ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 389719d5645SBarry Smith ierr = MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues);CHKERRQ(ierr); 390b24902e0SBarry Smith PetscFunctionReturn(0); 391b24902e0SBarry Smith } 392b24902e0SBarry Smith 3936ee01492SSatish Balay 394e0877f53SBarry Smith static PetscErrorCode MatLUFactor_SeqDense(Mat,IS,IS,const MatFactorInfo*); 395719d5645SBarry Smith 396e0877f53SBarry Smith static PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 397289bc588SBarry Smith { 3984482741eSBarry Smith MatFactorInfo info; 399a093e273SMatthew Knepley PetscErrorCode ierr; 4003a40ed3dSBarry Smith 4013a40ed3dSBarry Smith PetscFunctionBegin; 402c3ef05f6SHong Zhang ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 403719d5645SBarry Smith ierr = MatLUFactor_SeqDense(fact,0,0,&info);CHKERRQ(ierr); 4043a40ed3dSBarry Smith PetscFunctionReturn(0); 405289bc588SBarry Smith } 4066ee01492SSatish Balay 407e0877f53SBarry Smith static PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy) 408289bc588SBarry Smith { 409c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 4106849ba73SBarry Smith PetscErrorCode ierr; 411f1ceaac6SMatthew G. Knepley const PetscScalar *x; 412f1ceaac6SMatthew G. Knepley PetscScalar *y; 413c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 41467e560aaSBarry Smith 4153a40ed3dSBarry Smith PetscFunctionBegin; 416c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 417f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 4181ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 419d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 420d5f3da31SBarry Smith if (A->factortype == MAT_FACTOR_LU) { 421ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 422e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 423ae7cfcebSSatish Balay #else 42400121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 4258b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 42600121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 427e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 428ae7cfcebSSatish Balay #endif 429d5f3da31SBarry Smith } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 430ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 431e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 432ae7cfcebSSatish Balay #else 433a49dc2a2SStefano Zampini if (A->spd) { 43400121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 4358b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 43600121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 437e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 438a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX) 439a49dc2a2SStefano Zampini } else if (A->hermitian) { 44000121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 441a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKhetrs",LAPACKhetrs_("L",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 44200121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 443a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"HETRS Bad solve"); 444a49dc2a2SStefano Zampini #endif 445a49dc2a2SStefano Zampini } else { /* symmetric case */ 44600121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 447a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrs",LAPACKsytrs_("L",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 44800121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 449a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"SYTRS Bad solve"); 450a49dc2a2SStefano Zampini } 451ae7cfcebSSatish Balay #endif 4522205254eSKarl Rupp } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 453f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 4541ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 455dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 4563a40ed3dSBarry Smith PetscFunctionReturn(0); 457289bc588SBarry Smith } 4586ee01492SSatish Balay 459e0877f53SBarry Smith static PetscErrorCode MatMatSolve_SeqDense(Mat A,Mat B,Mat X) 46085e2c93fSHong Zhang { 46185e2c93fSHong Zhang Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 46285e2c93fSHong Zhang PetscErrorCode ierr; 46385e2c93fSHong Zhang PetscScalar *b,*x; 464efb80c78SLisandro Dalcin PetscInt n; 465783b601eSJed Brown PetscBLASInt nrhs,info,m; 466bda8bf91SBarry Smith PetscBool flg; 46785e2c93fSHong Zhang 46885e2c93fSHong Zhang PetscFunctionBegin; 469c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 4700298fd71SBarry Smith ierr = PetscObjectTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr); 471ce94432eSBarry Smith if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix B must be MATDENSE matrix"); 4720298fd71SBarry Smith ierr = PetscObjectTypeCompareAny((PetscObject)X,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr); 473ce94432eSBarry Smith if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix X must be MATDENSE matrix"); 474bda8bf91SBarry Smith 4750298fd71SBarry Smith ierr = MatGetSize(B,NULL,&n);CHKERRQ(ierr); 476c5df96a5SBarry Smith ierr = PetscBLASIntCast(n,&nrhs);CHKERRQ(ierr); 4778c778c55SBarry Smith ierr = MatDenseGetArray(B,&b);CHKERRQ(ierr); 4788c778c55SBarry Smith ierr = MatDenseGetArray(X,&x);CHKERRQ(ierr); 47985e2c93fSHong Zhang 480f272c775SHong Zhang ierr = PetscMemcpy(x,b,m*nrhs*sizeof(PetscScalar));CHKERRQ(ierr); 48185e2c93fSHong Zhang 48285e2c93fSHong Zhang if (A->factortype == MAT_FACTOR_LU) { 48385e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_GETRS) 48485e2c93fSHong Zhang SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 48585e2c93fSHong Zhang #else 48600121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 4878b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info)); 48800121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 48985e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 49085e2c93fSHong Zhang #endif 49185e2c93fSHong Zhang } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 49285e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_POTRS) 49385e2c93fSHong Zhang SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 49485e2c93fSHong Zhang #else 495a49dc2a2SStefano Zampini if (A->spd) { 49600121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 4978b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info)); 49800121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 49985e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 500a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX) 501a49dc2a2SStefano Zampini } else if (A->hermitian) { 50200121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 503a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKhetrs",LAPACKhetrs_("L",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info)); 50400121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 505a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"HETRS Bad solve"); 506a49dc2a2SStefano Zampini #endif 507a49dc2a2SStefano Zampini } else { /* symmetric case */ 50800121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 509a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrs",LAPACKsytrs_("L",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info)); 51000121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 511a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"SYTRS Bad solve"); 512a49dc2a2SStefano Zampini } 51385e2c93fSHong Zhang #endif 5142205254eSKarl Rupp } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 51585e2c93fSHong Zhang 5168c778c55SBarry Smith ierr = MatDenseRestoreArray(B,&b);CHKERRQ(ierr); 5178c778c55SBarry Smith ierr = MatDenseRestoreArray(X,&x);CHKERRQ(ierr); 51885e2c93fSHong Zhang ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr); 51985e2c93fSHong Zhang PetscFunctionReturn(0); 52085e2c93fSHong Zhang } 52185e2c93fSHong Zhang 52200121966SStefano Zampini static PetscErrorCode MatConjugate_SeqDense(Mat); 52300121966SStefano Zampini 524e0877f53SBarry Smith static PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy) 525da3a660dSBarry Smith { 526c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 527dfbe8321SBarry Smith PetscErrorCode ierr; 528f1ceaac6SMatthew G. Knepley const PetscScalar *x; 529f1ceaac6SMatthew G. Knepley PetscScalar *y; 530c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 53167e560aaSBarry Smith 5323a40ed3dSBarry Smith PetscFunctionBegin; 533c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 534f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 5351ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 536d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 5378208b9aeSStefano Zampini if (A->factortype == MAT_FACTOR_LU) { 538ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 539e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 540ae7cfcebSSatish Balay #else 54100121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 5428b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 54300121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 544e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve"); 545ae7cfcebSSatish Balay #endif 5468208b9aeSStefano Zampini } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 547ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 548e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 549ae7cfcebSSatish Balay #else 550a49dc2a2SStefano Zampini if (A->spd) { 55100121966SStefano Zampini #if defined(PETSC_USE_COMPLEX) 55200121966SStefano Zampini ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr); 55300121966SStefano Zampini #endif 55400121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 5558b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 55600121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 55700121966SStefano Zampini #if defined(PETSC_USE_COMPLEX) 55800121966SStefano Zampini ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr); 55900121966SStefano Zampini #endif 560a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 561a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX) 562a49dc2a2SStefano Zampini } else if (A->hermitian) { 56300121966SStefano Zampini ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr); 56400121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 56500121966SStefano Zampini PetscStackCallBLAS("LAPACKhetrs",LAPACKhetrs_("L",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 56600121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 56700121966SStefano Zampini ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr); 568ae7cfcebSSatish Balay #endif 569a49dc2a2SStefano Zampini } else { /* symmetric case */ 57000121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 571a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrs",LAPACKsytrs_("L",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 57200121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 573a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"SYTRS Bad solve"); 574da3a660dSBarry Smith } 575a49dc2a2SStefano Zampini #endif 576a49dc2a2SStefano Zampini } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 577f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 5781ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 579dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 5803a40ed3dSBarry Smith PetscFunctionReturn(0); 581da3a660dSBarry Smith } 5826ee01492SSatish Balay 583e0877f53SBarry Smith static PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 584da3a660dSBarry Smith { 585dfbe8321SBarry Smith PetscErrorCode ierr; 586f1ceaac6SMatthew G. Knepley const PetscScalar *x; 587f1ceaac6SMatthew G. Knepley PetscScalar *y,sone = 1.0; 588da3a660dSBarry Smith Vec tmp = 0; 58967e560aaSBarry Smith 5903a40ed3dSBarry Smith PetscFunctionBegin; 591f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 5921ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 593d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 594da3a660dSBarry Smith if (yy == zz) { 59578b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 5963bb1ff40SBarry Smith ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr); 59778b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 598da3a660dSBarry Smith } 5998208b9aeSStefano Zampini ierr = MatSolve_SeqDense(A,xx,yy);CHKERRQ(ierr); 6006bf464f9SBarry Smith if (tmp) { 6016bf464f9SBarry Smith ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); 6026bf464f9SBarry Smith ierr = VecDestroy(&tmp);CHKERRQ(ierr); 6036bf464f9SBarry Smith } else { 6046bf464f9SBarry Smith ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr); 6056bf464f9SBarry Smith } 606f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 6071ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 6088208b9aeSStefano Zampini ierr = PetscLogFlops(A->cmap->n);CHKERRQ(ierr); 6093a40ed3dSBarry Smith PetscFunctionReturn(0); 610da3a660dSBarry Smith } 61167e560aaSBarry Smith 612e0877f53SBarry Smith static PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 613da3a660dSBarry Smith { 6146849ba73SBarry Smith PetscErrorCode ierr; 615f1ceaac6SMatthew G. Knepley const PetscScalar *x; 616f1ceaac6SMatthew G. Knepley PetscScalar *y,sone = 1.0; 61789ae1891SBarry Smith Vec tmp = NULL; 61867e560aaSBarry Smith 6193a40ed3dSBarry Smith PetscFunctionBegin; 620d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 621f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 6221ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 623da3a660dSBarry Smith if (yy == zz) { 62478b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 6253bb1ff40SBarry Smith ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr); 62678b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 627da3a660dSBarry Smith } 6288208b9aeSStefano Zampini ierr = MatSolveTranspose_SeqDense(A,xx,yy);CHKERRQ(ierr); 62990f02eecSBarry Smith if (tmp) { 6302dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); 6316bf464f9SBarry Smith ierr = VecDestroy(&tmp);CHKERRQ(ierr); 6323a40ed3dSBarry Smith } else { 6332dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr); 63490f02eecSBarry Smith } 635f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 6361ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 6378208b9aeSStefano Zampini ierr = PetscLogFlops(A->cmap->n);CHKERRQ(ierr); 6383a40ed3dSBarry Smith PetscFunctionReturn(0); 639da3a660dSBarry Smith } 640db4efbfdSBarry Smith 641db4efbfdSBarry Smith /* ---------------------------------------------------------------*/ 642db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots, 643db4efbfdSBarry Smith rather than put it in the Mat->row slot.*/ 644e0877f53SBarry Smith static PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo) 645db4efbfdSBarry Smith { 646db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF) 647db4efbfdSBarry Smith PetscFunctionBegin; 648e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable."); 649db4efbfdSBarry Smith #else 650db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 651db4efbfdSBarry Smith PetscErrorCode ierr; 652db4efbfdSBarry Smith PetscBLASInt n,m,info; 653db4efbfdSBarry Smith 654db4efbfdSBarry Smith PetscFunctionBegin; 655c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 656c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 657db4efbfdSBarry Smith if (!mat->pivots) { 6588208b9aeSStefano Zampini ierr = PetscMalloc1(A->rmap->n,&mat->pivots);CHKERRQ(ierr); 6593bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr); 660db4efbfdSBarry Smith } 661db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 6628e57ea43SSatish Balay ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 6638b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrf",LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info)); 6648e57ea43SSatish Balay ierr = PetscFPTrapPop();CHKERRQ(ierr); 6658e57ea43SSatish Balay 666e32f2f54SBarry Smith if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization"); 667e32f2f54SBarry Smith if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization"); 6688208b9aeSStefano Zampini 669db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 6708208b9aeSStefano Zampini A->ops->matsolve = MatMatSolve_SeqDense; 671db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 672db4efbfdSBarry Smith A->ops->solveadd = MatSolveAdd_SeqDense; 673db4efbfdSBarry Smith A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 674d5f3da31SBarry Smith A->factortype = MAT_FACTOR_LU; 675db4efbfdSBarry Smith 676f6224b95SHong Zhang ierr = PetscFree(A->solvertype);CHKERRQ(ierr); 677f6224b95SHong Zhang ierr = PetscStrallocpy(MATSOLVERPETSC,&A->solvertype);CHKERRQ(ierr); 678f6224b95SHong Zhang 679dc0b31edSSatish Balay ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr); 680db4efbfdSBarry Smith #endif 681db4efbfdSBarry Smith PetscFunctionReturn(0); 682db4efbfdSBarry Smith } 683db4efbfdSBarry Smith 684a49dc2a2SStefano Zampini /* Cholesky as L*L^T or L*D*L^T and the symmetric/hermitian complex variants */ 685e0877f53SBarry Smith static PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo) 686db4efbfdSBarry Smith { 687db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF) 688db4efbfdSBarry Smith PetscFunctionBegin; 689e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable."); 690db4efbfdSBarry Smith #else 691db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 692db4efbfdSBarry Smith PetscErrorCode ierr; 693c5df96a5SBarry Smith PetscBLASInt info,n; 694db4efbfdSBarry Smith 695db4efbfdSBarry Smith PetscFunctionBegin; 696c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 697db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 698a49dc2a2SStefano Zampini if (A->spd) { 69900121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 7008b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrf",LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info)); 70100121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 702a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX) 703a49dc2a2SStefano Zampini } else if (A->hermitian) { 704a49dc2a2SStefano Zampini if (!mat->pivots) { 705a49dc2a2SStefano Zampini ierr = PetscMalloc1(A->rmap->n,&mat->pivots);CHKERRQ(ierr); 706a49dc2a2SStefano Zampini ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr); 707a49dc2a2SStefano Zampini } 708a49dc2a2SStefano Zampini if (!mat->fwork) { 709a49dc2a2SStefano Zampini PetscScalar dummy; 710a49dc2a2SStefano Zampini 711a49dc2a2SStefano Zampini mat->lfwork = -1; 71200121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 713a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKhetrf",LAPACKhetrf_("L",&n,mat->v,&mat->lda,mat->pivots,&dummy,&mat->lfwork,&info)); 71400121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 715a49dc2a2SStefano Zampini mat->lfwork = (PetscInt)PetscRealPart(dummy); 716a49dc2a2SStefano Zampini ierr = PetscMalloc1(mat->lfwork,&mat->fwork);CHKERRQ(ierr); 717a49dc2a2SStefano Zampini ierr = PetscLogObjectMemory((PetscObject)A,mat->lfwork*sizeof(PetscBLASInt));CHKERRQ(ierr); 718a49dc2a2SStefano Zampini } 71900121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 720a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKhetrf",LAPACKhetrf_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&mat->lfwork,&info)); 72100121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 722a49dc2a2SStefano Zampini #endif 723a49dc2a2SStefano Zampini } else { /* symmetric case */ 724a49dc2a2SStefano Zampini if (!mat->pivots) { 725a49dc2a2SStefano Zampini ierr = PetscMalloc1(A->rmap->n,&mat->pivots);CHKERRQ(ierr); 726a49dc2a2SStefano Zampini ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr); 727a49dc2a2SStefano Zampini } 728a49dc2a2SStefano Zampini if (!mat->fwork) { 729a49dc2a2SStefano Zampini PetscScalar dummy; 730a49dc2a2SStefano Zampini 731a49dc2a2SStefano Zampini mat->lfwork = -1; 73200121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 733a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrf",LAPACKsytrf_("L",&n,mat->v,&mat->lda,mat->pivots,&dummy,&mat->lfwork,&info)); 73400121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 735a49dc2a2SStefano Zampini mat->lfwork = (PetscInt)PetscRealPart(dummy); 736a49dc2a2SStefano Zampini ierr = PetscMalloc1(mat->lfwork,&mat->fwork);CHKERRQ(ierr); 737a49dc2a2SStefano Zampini ierr = PetscLogObjectMemory((PetscObject)A,mat->lfwork*sizeof(PetscBLASInt));CHKERRQ(ierr); 738a49dc2a2SStefano Zampini } 73900121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 740a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrf",LAPACKsytrf_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&mat->lfwork,&info)); 74100121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 742a49dc2a2SStefano Zampini } 743e32f2f54SBarry Smith if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1); 7448208b9aeSStefano Zampini 745db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 7468208b9aeSStefano Zampini A->ops->matsolve = MatMatSolve_SeqDense; 747db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 748db4efbfdSBarry Smith A->ops->solveadd = MatSolveAdd_SeqDense; 749db4efbfdSBarry Smith A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 750d5f3da31SBarry Smith A->factortype = MAT_FACTOR_CHOLESKY; 7512205254eSKarl Rupp 752f6224b95SHong Zhang ierr = PetscFree(A->solvertype);CHKERRQ(ierr); 753f6224b95SHong Zhang ierr = PetscStrallocpy(MATSOLVERPETSC,&A->solvertype);CHKERRQ(ierr); 754f6224b95SHong Zhang 755eb3f19e4SBarry Smith ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr); 756db4efbfdSBarry Smith #endif 757db4efbfdSBarry Smith PetscFunctionReturn(0); 758db4efbfdSBarry Smith } 759db4efbfdSBarry Smith 760db4efbfdSBarry Smith 7610481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 762db4efbfdSBarry Smith { 763db4efbfdSBarry Smith PetscErrorCode ierr; 764db4efbfdSBarry Smith MatFactorInfo info; 765db4efbfdSBarry Smith 766db4efbfdSBarry Smith PetscFunctionBegin; 767db4efbfdSBarry Smith info.fill = 1.0; 7682205254eSKarl Rupp 769c3ef05f6SHong Zhang ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 770719d5645SBarry Smith ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr); 771db4efbfdSBarry Smith PetscFunctionReturn(0); 772db4efbfdSBarry Smith } 773db4efbfdSBarry Smith 774e0877f53SBarry Smith static PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info) 775db4efbfdSBarry Smith { 776db4efbfdSBarry Smith PetscFunctionBegin; 777c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 7781bbcc794SSatish Balay fact->preallocated = PETSC_TRUE; 779719d5645SBarry Smith fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense; 780bd443b22SStefano Zampini fact->ops->solve = MatSolve_SeqDense; 781bd443b22SStefano Zampini fact->ops->matsolve = MatMatSolve_SeqDense; 782bd443b22SStefano Zampini fact->ops->solvetranspose = MatSolveTranspose_SeqDense; 783bd443b22SStefano Zampini fact->ops->solveadd = MatSolveAdd_SeqDense; 784bd443b22SStefano Zampini fact->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 785db4efbfdSBarry Smith PetscFunctionReturn(0); 786db4efbfdSBarry Smith } 787db4efbfdSBarry Smith 788e0877f53SBarry Smith static PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info) 789db4efbfdSBarry Smith { 790db4efbfdSBarry Smith PetscFunctionBegin; 791b66fe19dSMatthew G Knepley fact->preallocated = PETSC_TRUE; 792c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 793719d5645SBarry Smith fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense; 794bd443b22SStefano Zampini fact->ops->solve = MatSolve_SeqDense; 795bd443b22SStefano Zampini fact->ops->matsolve = MatMatSolve_SeqDense; 796bd443b22SStefano Zampini fact->ops->solvetranspose = MatSolveTranspose_SeqDense; 797bd443b22SStefano Zampini fact->ops->solveadd = MatSolveAdd_SeqDense; 798bd443b22SStefano Zampini fact->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 799db4efbfdSBarry Smith PetscFunctionReturn(0); 800db4efbfdSBarry Smith } 801db4efbfdSBarry Smith 802cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact) 803db4efbfdSBarry Smith { 804db4efbfdSBarry Smith PetscErrorCode ierr; 805db4efbfdSBarry Smith 806db4efbfdSBarry Smith PetscFunctionBegin; 807ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),fact);CHKERRQ(ierr); 808db4efbfdSBarry Smith ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 809db4efbfdSBarry Smith ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr); 810db4efbfdSBarry Smith if (ftype == MAT_FACTOR_LU) { 811db4efbfdSBarry Smith (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense; 812db4efbfdSBarry Smith } else { 813db4efbfdSBarry Smith (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense; 814db4efbfdSBarry Smith } 815d5f3da31SBarry Smith (*fact)->factortype = ftype; 81600c67f3bSHong Zhang 81700c67f3bSHong Zhang ierr = PetscFree((*fact)->solvertype);CHKERRQ(ierr); 81800c67f3bSHong Zhang ierr = PetscStrallocpy(MATSOLVERPETSC,&(*fact)->solvertype);CHKERRQ(ierr); 819db4efbfdSBarry Smith PetscFunctionReturn(0); 820db4efbfdSBarry Smith } 821db4efbfdSBarry Smith 822289bc588SBarry Smith /* ------------------------------------------------------------------*/ 823e0877f53SBarry Smith static PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx) 824289bc588SBarry Smith { 825c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 826d9ca1df4SBarry Smith PetscScalar *x,*v = mat->v,zero = 0.0,xt; 827d9ca1df4SBarry Smith const PetscScalar *b; 828dfbe8321SBarry Smith PetscErrorCode ierr; 829d0f46423SBarry Smith PetscInt m = A->rmap->n,i; 830c5df96a5SBarry Smith PetscBLASInt o = 1,bm; 831289bc588SBarry Smith 8323a40ed3dSBarry Smith PetscFunctionBegin; 833422a814eSBarry Smith if (shift == -1) shift = 0.0; /* negative shift indicates do not error on zero diagonal; this code never zeros on zero diagonal */ 834c5df96a5SBarry Smith ierr = PetscBLASIntCast(m,&bm);CHKERRQ(ierr); 835289bc588SBarry Smith if (flag & SOR_ZERO_INITIAL_GUESS) { 8363bffc371SBarry Smith /* this is a hack fix, should have another version without the second BLASdotu */ 8372dcb1b2aSMatthew Knepley ierr = VecSet(xx,zero);CHKERRQ(ierr); 838289bc588SBarry Smith } 8391ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 840d9ca1df4SBarry Smith ierr = VecGetArrayRead(bb,&b);CHKERRQ(ierr); 841b965ef7fSBarry Smith its = its*lits; 842e32f2f54SBarry 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); 843289bc588SBarry Smith while (its--) { 844fccaa45eSBarry Smith if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) { 845289bc588SBarry Smith for (i=0; i<m; i++) { 8463bffc371SBarry Smith PetscStackCallBLAS("BLASdotu",xt = b[i] - BLASdotu_(&bm,v+i,&bm,x,&o)); 84755a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 848289bc588SBarry Smith } 849289bc588SBarry Smith } 850fccaa45eSBarry Smith if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) { 851289bc588SBarry Smith for (i=m-1; i>=0; i--) { 8523bffc371SBarry Smith PetscStackCallBLAS("BLASdotu",xt = b[i] - BLASdotu_(&bm,v+i,&bm,x,&o)); 85355a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 854289bc588SBarry Smith } 855289bc588SBarry Smith } 856289bc588SBarry Smith } 857d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(bb,&b);CHKERRQ(ierr); 8581ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 8593a40ed3dSBarry Smith PetscFunctionReturn(0); 860289bc588SBarry Smith } 861289bc588SBarry Smith 862289bc588SBarry Smith /* -----------------------------------------------------------------*/ 863cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy) 864289bc588SBarry Smith { 865c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 866d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 867d9ca1df4SBarry Smith PetscScalar *y; 868dfbe8321SBarry Smith PetscErrorCode ierr; 8690805154bSBarry Smith PetscBLASInt m, n,_One=1; 870ea709b57SSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 8713a40ed3dSBarry Smith 8723a40ed3dSBarry Smith PetscFunctionBegin; 873c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 874c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 875d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 8761ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 8775ac36cfcSBarry Smith if (!A->rmap->n || !A->cmap->n) { 8785ac36cfcSBarry Smith PetscBLASInt i; 8795ac36cfcSBarry Smith for (i=0; i<n; i++) y[i] = 0.0; 8805ac36cfcSBarry Smith } else { 8818b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One)); 8825ac36cfcSBarry Smith ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 8835ac36cfcSBarry Smith } 884d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 8851ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 8863a40ed3dSBarry Smith PetscFunctionReturn(0); 887289bc588SBarry Smith } 888800995b7SMatthew Knepley 889cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy) 890289bc588SBarry Smith { 891c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 892d9ca1df4SBarry Smith PetscScalar *y,_DOne=1.0,_DZero=0.0; 893dfbe8321SBarry Smith PetscErrorCode ierr; 8940805154bSBarry Smith PetscBLASInt m, n, _One=1; 895d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 8963a40ed3dSBarry Smith 8973a40ed3dSBarry Smith PetscFunctionBegin; 898c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 899c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 900d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 9011ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 9025ac36cfcSBarry Smith if (!A->rmap->n || !A->cmap->n) { 9035ac36cfcSBarry Smith PetscBLASInt i; 9045ac36cfcSBarry Smith for (i=0; i<m; i++) y[i] = 0.0; 9055ac36cfcSBarry Smith } else { 9068b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One)); 9075ac36cfcSBarry Smith ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr); 9085ac36cfcSBarry Smith } 909d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 9101ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 9113a40ed3dSBarry Smith PetscFunctionReturn(0); 912289bc588SBarry Smith } 9136ee01492SSatish Balay 914cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 915289bc588SBarry Smith { 916c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 917d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 918d9ca1df4SBarry Smith PetscScalar *y,_DOne=1.0; 919dfbe8321SBarry Smith PetscErrorCode ierr; 9200805154bSBarry Smith PetscBLASInt m, n, _One=1; 9213a40ed3dSBarry Smith 9223a40ed3dSBarry Smith PetscFunctionBegin; 923c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 924c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 925d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 926600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 927d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 9281ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 9298b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One)); 930d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 9311ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 932dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 9333a40ed3dSBarry Smith PetscFunctionReturn(0); 934289bc588SBarry Smith } 9356ee01492SSatish Balay 936e0877f53SBarry Smith static PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 937289bc588SBarry Smith { 938c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 939d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 940d9ca1df4SBarry Smith PetscScalar *y; 941dfbe8321SBarry Smith PetscErrorCode ierr; 9420805154bSBarry Smith PetscBLASInt m, n, _One=1; 94387828ca2SBarry Smith PetscScalar _DOne=1.0; 9443a40ed3dSBarry Smith 9453a40ed3dSBarry Smith PetscFunctionBegin; 946c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 947c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 948d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 949600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 950d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 9511ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 9528b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One)); 953d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 9541ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 955dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 9563a40ed3dSBarry Smith PetscFunctionReturn(0); 957289bc588SBarry Smith } 958289bc588SBarry Smith 959289bc588SBarry Smith /* -----------------------------------------------------------------*/ 960e0877f53SBarry Smith static PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 961289bc588SBarry Smith { 962c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 96387828ca2SBarry Smith PetscScalar *v; 9646849ba73SBarry Smith PetscErrorCode ierr; 96513f74950SBarry Smith PetscInt i; 96667e560aaSBarry Smith 9673a40ed3dSBarry Smith PetscFunctionBegin; 968d0f46423SBarry Smith *ncols = A->cmap->n; 969289bc588SBarry Smith if (cols) { 970854ce69bSBarry Smith ierr = PetscMalloc1(A->cmap->n+1,cols);CHKERRQ(ierr); 971d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) (*cols)[i] = i; 972289bc588SBarry Smith } 973289bc588SBarry Smith if (vals) { 974854ce69bSBarry Smith ierr = PetscMalloc1(A->cmap->n+1,vals);CHKERRQ(ierr); 975289bc588SBarry Smith v = mat->v + row; 976d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;} 977289bc588SBarry Smith } 9783a40ed3dSBarry Smith PetscFunctionReturn(0); 979289bc588SBarry Smith } 9806ee01492SSatish Balay 981e0877f53SBarry Smith static PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 982289bc588SBarry Smith { 983dfbe8321SBarry Smith PetscErrorCode ierr; 9846e111a19SKarl Rupp 985606d414cSSatish Balay PetscFunctionBegin; 986606d414cSSatish Balay if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);} 987606d414cSSatish Balay if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); } 9883a40ed3dSBarry Smith PetscFunctionReturn(0); 989289bc588SBarry Smith } 990289bc588SBarry Smith /* ----------------------------------------------------------------*/ 991e0877f53SBarry Smith static PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv) 992289bc588SBarry Smith { 993c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 99413f74950SBarry Smith PetscInt i,j,idx=0; 995d6dfbf8fSBarry Smith 9963a40ed3dSBarry Smith PetscFunctionBegin; 997289bc588SBarry Smith if (!mat->roworiented) { 998dbb450caSBarry Smith if (addv == INSERT_VALUES) { 999289bc588SBarry Smith for (j=0; j<n; j++) { 1000cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 10012515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 1002e32f2f54SBarry 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); 100358804f6dSBarry Smith #endif 1004289bc588SBarry Smith for (i=0; i<m; i++) { 1005cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 10062515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 1007e32f2f54SBarry 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); 100858804f6dSBarry Smith #endif 1009cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 1010289bc588SBarry Smith } 1011289bc588SBarry Smith } 10123a40ed3dSBarry Smith } else { 1013289bc588SBarry Smith for (j=0; j<n; j++) { 1014cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 10152515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 1016e32f2f54SBarry 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); 101758804f6dSBarry Smith #endif 1018289bc588SBarry Smith for (i=0; i<m; i++) { 1019cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 10202515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 1021e32f2f54SBarry 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); 102258804f6dSBarry Smith #endif 1023cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 1024289bc588SBarry Smith } 1025289bc588SBarry Smith } 1026289bc588SBarry Smith } 10273a40ed3dSBarry Smith } else { 1028dbb450caSBarry Smith if (addv == INSERT_VALUES) { 1029e8d4e0b9SBarry Smith for (i=0; i<m; i++) { 1030cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 10312515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 1032e32f2f54SBarry 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); 103358804f6dSBarry Smith #endif 1034e8d4e0b9SBarry Smith for (j=0; j<n; j++) { 1035cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 10362515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 1037e32f2f54SBarry 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); 103858804f6dSBarry Smith #endif 1039cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 1040e8d4e0b9SBarry Smith } 1041e8d4e0b9SBarry Smith } 10423a40ed3dSBarry Smith } else { 1043289bc588SBarry Smith for (i=0; i<m; i++) { 1044cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 10452515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 1046e32f2f54SBarry 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); 104758804f6dSBarry Smith #endif 1048289bc588SBarry Smith for (j=0; j<n; j++) { 1049cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 10502515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 1051e32f2f54SBarry 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); 105258804f6dSBarry Smith #endif 1053cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 1054289bc588SBarry Smith } 1055289bc588SBarry Smith } 1056289bc588SBarry Smith } 1057e8d4e0b9SBarry Smith } 10583a40ed3dSBarry Smith PetscFunctionReturn(0); 1059289bc588SBarry Smith } 1060e8d4e0b9SBarry Smith 1061e0877f53SBarry Smith static PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[]) 1062ae80bb75SLois Curfman McInnes { 1063ae80bb75SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 106413f74950SBarry Smith PetscInt i,j; 1065ae80bb75SLois Curfman McInnes 10663a40ed3dSBarry Smith PetscFunctionBegin; 1067ae80bb75SLois Curfman McInnes /* row-oriented output */ 1068ae80bb75SLois Curfman McInnes for (i=0; i<m; i++) { 106997e567efSBarry Smith if (indexm[i] < 0) {v += n;continue;} 1070e32f2f54SBarry 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); 1071ae80bb75SLois Curfman McInnes for (j=0; j<n; j++) { 10726f31f424SBarry Smith if (indexn[j] < 0) {v++; continue;} 1073e32f2f54SBarry 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); 107497e567efSBarry Smith *v++ = mat->v[indexn[j]*mat->lda + indexm[i]]; 1075ae80bb75SLois Curfman McInnes } 1076ae80bb75SLois Curfman McInnes } 10773a40ed3dSBarry Smith PetscFunctionReturn(0); 1078ae80bb75SLois Curfman McInnes } 1079ae80bb75SLois Curfman McInnes 1080289bc588SBarry Smith /* -----------------------------------------------------------------*/ 1081289bc588SBarry Smith 1082e0877f53SBarry Smith static PetscErrorCode MatLoad_SeqDense(Mat newmat,PetscViewer viewer) 1083aabbc4fbSShri Abhyankar { 1084aabbc4fbSShri Abhyankar Mat_SeqDense *a; 1085aabbc4fbSShri Abhyankar PetscErrorCode ierr; 1086aabbc4fbSShri Abhyankar PetscInt *scols,i,j,nz,header[4]; 1087aabbc4fbSShri Abhyankar int fd; 1088aabbc4fbSShri Abhyankar PetscMPIInt size; 1089aabbc4fbSShri Abhyankar PetscInt *rowlengths = 0,M,N,*cols,grows,gcols; 1090aabbc4fbSShri Abhyankar PetscScalar *vals,*svals,*v,*w; 1091ce94432eSBarry Smith MPI_Comm comm; 10927f489da9SVaclav Hapla PetscBool isbinary; 1093aabbc4fbSShri Abhyankar 1094aabbc4fbSShri Abhyankar PetscFunctionBegin; 10957f489da9SVaclav Hapla ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 10967f489da9SVaclav Hapla if (!isbinary) SETERRQ2(PetscObjectComm((PetscObject)newmat),PETSC_ERR_SUP,"Viewer type %s not yet supported for reading %s matrices",((PetscObject)viewer)->type_name,((PetscObject)newmat)->type_name); 10977f489da9SVaclav Hapla 1098c98fd787SBarry Smith /* force binary viewer to load .info file if it has not yet done so */ 1099c98fd787SBarry Smith ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr); 1100ce94432eSBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 1101aabbc4fbSShri Abhyankar ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 1102aabbc4fbSShri Abhyankar if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor"); 1103aabbc4fbSShri Abhyankar ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 1104aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr); 1105aabbc4fbSShri Abhyankar if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object"); 1106aabbc4fbSShri Abhyankar M = header[1]; N = header[2]; nz = header[3]; 1107aabbc4fbSShri Abhyankar 1108aabbc4fbSShri Abhyankar /* set global size if not set already*/ 1109aabbc4fbSShri Abhyankar if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) { 1110aabbc4fbSShri Abhyankar ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr); 1111aabbc4fbSShri Abhyankar } else { 1112aabbc4fbSShri Abhyankar /* if sizes and type are already set, check if the vector global sizes are correct */ 1113aabbc4fbSShri Abhyankar ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr); 1114aabbc4fbSShri 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); 1115aabbc4fbSShri Abhyankar } 1116e6324fbbSBarry Smith a = (Mat_SeqDense*)newmat->data; 1117e6324fbbSBarry Smith if (!a->user_alloc) { 11180298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr); 1119e6324fbbSBarry Smith } 1120aabbc4fbSShri Abhyankar 1121aabbc4fbSShri Abhyankar if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */ 1122aabbc4fbSShri Abhyankar a = (Mat_SeqDense*)newmat->data; 1123aabbc4fbSShri Abhyankar v = a->v; 1124aabbc4fbSShri Abhyankar /* Allocate some temp space to read in the values and then flip them 1125aabbc4fbSShri Abhyankar from row major to column major */ 1126854ce69bSBarry Smith ierr = PetscMalloc1(M*N > 0 ? M*N : 1,&w);CHKERRQ(ierr); 1127aabbc4fbSShri Abhyankar /* read in nonzero values */ 1128aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr); 1129aabbc4fbSShri Abhyankar /* now flip the values and store them in the matrix*/ 1130aabbc4fbSShri Abhyankar for (j=0; j<N; j++) { 1131aabbc4fbSShri Abhyankar for (i=0; i<M; i++) { 1132aabbc4fbSShri Abhyankar *v++ =w[i*N+j]; 1133aabbc4fbSShri Abhyankar } 1134aabbc4fbSShri Abhyankar } 1135aabbc4fbSShri Abhyankar ierr = PetscFree(w);CHKERRQ(ierr); 1136aabbc4fbSShri Abhyankar } else { 1137aabbc4fbSShri Abhyankar /* read row lengths */ 1138854ce69bSBarry Smith ierr = PetscMalloc1(M+1,&rowlengths);CHKERRQ(ierr); 1139aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr); 1140aabbc4fbSShri Abhyankar 1141aabbc4fbSShri Abhyankar a = (Mat_SeqDense*)newmat->data; 1142aabbc4fbSShri Abhyankar v = a->v; 1143aabbc4fbSShri Abhyankar 1144aabbc4fbSShri Abhyankar /* read column indices and nonzeros */ 1145854ce69bSBarry Smith ierr = PetscMalloc1(nz+1,&scols);CHKERRQ(ierr); 1146aabbc4fbSShri Abhyankar cols = scols; 1147aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr); 1148854ce69bSBarry Smith ierr = PetscMalloc1(nz+1,&svals);CHKERRQ(ierr); 1149aabbc4fbSShri Abhyankar vals = svals; 1150aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr); 1151aabbc4fbSShri Abhyankar 1152aabbc4fbSShri Abhyankar /* insert into matrix */ 1153aabbc4fbSShri Abhyankar for (i=0; i<M; i++) { 1154aabbc4fbSShri Abhyankar for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j]; 1155aabbc4fbSShri Abhyankar svals += rowlengths[i]; scols += rowlengths[i]; 1156aabbc4fbSShri Abhyankar } 1157aabbc4fbSShri Abhyankar ierr = PetscFree(vals);CHKERRQ(ierr); 1158aabbc4fbSShri Abhyankar ierr = PetscFree(cols);CHKERRQ(ierr); 1159aabbc4fbSShri Abhyankar ierr = PetscFree(rowlengths);CHKERRQ(ierr); 1160aabbc4fbSShri Abhyankar } 1161aabbc4fbSShri Abhyankar ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1162aabbc4fbSShri Abhyankar ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1163aabbc4fbSShri Abhyankar PetscFunctionReturn(0); 1164aabbc4fbSShri Abhyankar } 1165aabbc4fbSShri Abhyankar 11666849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer) 1167289bc588SBarry Smith { 1168932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1169dfbe8321SBarry Smith PetscErrorCode ierr; 117013f74950SBarry Smith PetscInt i,j; 11712dcb1b2aSMatthew Knepley const char *name; 117287828ca2SBarry Smith PetscScalar *v; 1173f3ef73ceSBarry Smith PetscViewerFormat format; 11745f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX) 1175ace3abfcSBarry Smith PetscBool allreal = PETSC_TRUE; 11765f481a85SSatish Balay #endif 1177932b0c3eSLois Curfman McInnes 11783a40ed3dSBarry Smith PetscFunctionBegin; 1179b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1180456192e2SBarry Smith if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 11813a40ed3dSBarry Smith PetscFunctionReturn(0); /* do nothing for now */ 1182fb9695e5SSatish Balay } else if (format == PETSC_VIEWER_ASCII_COMMON) { 1183d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 1184d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 118544cd7ae7SLois Curfman McInnes v = a->v + i; 118677431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr); 1187d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1188aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 1189329f5518SBarry Smith if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) { 119057622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g + %g i) ",j,(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr); 1191329f5518SBarry Smith } else if (PetscRealPart(*v)) { 119257622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)PetscRealPart(*v));CHKERRQ(ierr); 11936831982aSBarry Smith } 119480cd9d93SLois Curfman McInnes #else 11956831982aSBarry Smith if (*v) { 119657622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)*v);CHKERRQ(ierr); 11976831982aSBarry Smith } 119880cd9d93SLois Curfman McInnes #endif 11991b807ce4Svictorle v += a->lda; 120080cd9d93SLois Curfman McInnes } 1201b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 120280cd9d93SLois Curfman McInnes } 1203d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 12043a40ed3dSBarry Smith } else { 1205d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 1206aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 120747989497SBarry Smith /* determine if matrix has all real values */ 120847989497SBarry Smith v = a->v; 1209d0f46423SBarry Smith for (i=0; i<A->rmap->n*A->cmap->n; i++) { 1210ffac6cdbSBarry Smith if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break;} 121147989497SBarry Smith } 121247989497SBarry Smith #endif 1213fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 12143a7fca6bSBarry Smith ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr); 1215d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr); 1216d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 1217fb9695e5SSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr); 1218ffac6cdbSBarry Smith } 1219ffac6cdbSBarry Smith 1220d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 1221932b0c3eSLois Curfman McInnes v = a->v + i; 1222d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1223aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 122447989497SBarry Smith if (allreal) { 1225c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr); 122647989497SBarry Smith } else { 1227c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr); 122847989497SBarry Smith } 1229289bc588SBarry Smith #else 1230c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr); 1231289bc588SBarry Smith #endif 12321b807ce4Svictorle v += a->lda; 1233289bc588SBarry Smith } 1234b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 1235289bc588SBarry Smith } 1236fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 1237b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr); 1238ffac6cdbSBarry Smith } 1239d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 1240da3a660dSBarry Smith } 1241b0a32e0cSBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 12423a40ed3dSBarry Smith PetscFunctionReturn(0); 1243289bc588SBarry Smith } 1244289bc588SBarry Smith 12456849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer) 1246932b0c3eSLois Curfman McInnes { 1247932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 12486849ba73SBarry Smith PetscErrorCode ierr; 124913f74950SBarry Smith int fd; 1250d0f46423SBarry Smith PetscInt ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n; 1251f4403165SShri Abhyankar PetscScalar *v,*anonz,*vals; 1252f4403165SShri Abhyankar PetscViewerFormat format; 1253932b0c3eSLois Curfman McInnes 12543a40ed3dSBarry Smith PetscFunctionBegin; 1255b0a32e0cSBarry Smith ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 125690ace30eSBarry Smith 1257f4403165SShri Abhyankar ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1258f4403165SShri Abhyankar if (format == PETSC_VIEWER_NATIVE) { 1259f4403165SShri Abhyankar /* store the matrix as a dense matrix */ 1260785e854fSJed Brown ierr = PetscMalloc1(4,&col_lens);CHKERRQ(ierr); 12612205254eSKarl Rupp 1262f4403165SShri Abhyankar col_lens[0] = MAT_FILE_CLASSID; 1263f4403165SShri Abhyankar col_lens[1] = m; 1264f4403165SShri Abhyankar col_lens[2] = n; 1265f4403165SShri Abhyankar col_lens[3] = MATRIX_BINARY_FORMAT_DENSE; 12662205254eSKarl Rupp 1267f4403165SShri Abhyankar ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 1268f4403165SShri Abhyankar ierr = PetscFree(col_lens);CHKERRQ(ierr); 1269f4403165SShri Abhyankar 1270f4403165SShri Abhyankar /* write out matrix, by rows */ 1271854ce69bSBarry Smith ierr = PetscMalloc1(m*n+1,&vals);CHKERRQ(ierr); 1272f4403165SShri Abhyankar v = a->v; 1273f4403165SShri Abhyankar for (j=0; j<n; j++) { 1274f4403165SShri Abhyankar for (i=0; i<m; i++) { 1275f4403165SShri Abhyankar vals[j + i*n] = *v++; 1276f4403165SShri Abhyankar } 1277f4403165SShri Abhyankar } 1278f4403165SShri Abhyankar ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 1279f4403165SShri Abhyankar ierr = PetscFree(vals);CHKERRQ(ierr); 1280f4403165SShri Abhyankar } else { 1281854ce69bSBarry Smith ierr = PetscMalloc1(4+nz,&col_lens);CHKERRQ(ierr); 12822205254eSKarl Rupp 12830700a824SBarry Smith col_lens[0] = MAT_FILE_CLASSID; 1284932b0c3eSLois Curfman McInnes col_lens[1] = m; 1285932b0c3eSLois Curfman McInnes col_lens[2] = n; 1286932b0c3eSLois Curfman McInnes col_lens[3] = nz; 1287932b0c3eSLois Curfman McInnes 1288932b0c3eSLois Curfman McInnes /* store lengths of each row and write (including header) to file */ 1289932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) col_lens[4+i] = n; 12906f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 1291932b0c3eSLois Curfman McInnes 1292932b0c3eSLois Curfman McInnes /* Possibly should write in smaller increments, not whole matrix at once? */ 1293932b0c3eSLois Curfman McInnes /* store column indices (zero start index) */ 1294932b0c3eSLois Curfman McInnes ict = 0; 1295932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 1296932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) col_lens[ict++] = j; 1297932b0c3eSLois Curfman McInnes } 12986f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 1299606d414cSSatish Balay ierr = PetscFree(col_lens);CHKERRQ(ierr); 1300932b0c3eSLois Curfman McInnes 1301932b0c3eSLois Curfman McInnes /* store nonzero values */ 1302854ce69bSBarry Smith ierr = PetscMalloc1(nz+1,&anonz);CHKERRQ(ierr); 1303932b0c3eSLois Curfman McInnes ict = 0; 1304932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 1305932b0c3eSLois Curfman McInnes v = a->v + i; 1306932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) { 13071b807ce4Svictorle anonz[ict++] = *v; v += a->lda; 1308932b0c3eSLois Curfman McInnes } 1309932b0c3eSLois Curfman McInnes } 13106f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 1311606d414cSSatish Balay ierr = PetscFree(anonz);CHKERRQ(ierr); 1312f4403165SShri Abhyankar } 13133a40ed3dSBarry Smith PetscFunctionReturn(0); 1314932b0c3eSLois Curfman McInnes } 1315932b0c3eSLois Curfman McInnes 13169804daf3SBarry Smith #include <petscdraw.h> 1317e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa) 1318f1af5d2fSBarry Smith { 1319f1af5d2fSBarry Smith Mat A = (Mat) Aa; 1320f1af5d2fSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 13216849ba73SBarry Smith PetscErrorCode ierr; 1322383922c3SLisandro Dalcin PetscInt m = A->rmap->n,n = A->cmap->n,i,j; 1323383922c3SLisandro Dalcin int color = PETSC_DRAW_WHITE; 132487828ca2SBarry Smith PetscScalar *v = a->v; 1325b0a32e0cSBarry Smith PetscViewer viewer; 1326b05fc000SLisandro Dalcin PetscReal xl,yl,xr,yr,x_l,x_r,y_l,y_r; 1327f3ef73ceSBarry Smith PetscViewerFormat format; 1328f1af5d2fSBarry Smith 1329f1af5d2fSBarry Smith PetscFunctionBegin; 1330f1af5d2fSBarry Smith ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr); 1331b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1332b0a32e0cSBarry Smith ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr); 1333f1af5d2fSBarry Smith 1334f1af5d2fSBarry Smith /* Loop over matrix elements drawing boxes */ 1335383922c3SLisandro Dalcin 1336fb9695e5SSatish Balay if (format != PETSC_VIEWER_DRAW_CONTOUR) { 1337383922c3SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 1338f1af5d2fSBarry Smith /* Blue for negative and Red for positive */ 1339f1af5d2fSBarry Smith for (j = 0; j < n; j++) { 1340383922c3SLisandro Dalcin x_l = j; x_r = x_l + 1.0; 1341f1af5d2fSBarry Smith for (i = 0; i < m; i++) { 1342f1af5d2fSBarry Smith y_l = m - i - 1.0; 1343f1af5d2fSBarry Smith y_r = y_l + 1.0; 1344329f5518SBarry Smith if (PetscRealPart(v[j*m+i]) > 0.) { 1345b0a32e0cSBarry Smith color = PETSC_DRAW_RED; 1346329f5518SBarry Smith } else if (PetscRealPart(v[j*m+i]) < 0.) { 1347b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 1348f1af5d2fSBarry Smith } else { 1349f1af5d2fSBarry Smith continue; 1350f1af5d2fSBarry Smith } 1351b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1352f1af5d2fSBarry Smith } 1353f1af5d2fSBarry Smith } 1354383922c3SLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 1355f1af5d2fSBarry Smith } else { 1356f1af5d2fSBarry Smith /* use contour shading to indicate magnitude of values */ 1357f1af5d2fSBarry Smith /* first determine max of all nonzero values */ 1358b05fc000SLisandro Dalcin PetscReal minv = 0.0, maxv = 0.0; 1359b05fc000SLisandro Dalcin PetscDraw popup; 1360b05fc000SLisandro Dalcin 1361f1af5d2fSBarry Smith for (i=0; i < m*n; i++) { 1362f1af5d2fSBarry Smith if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]); 1363f1af5d2fSBarry Smith } 1364383922c3SLisandro Dalcin if (minv >= maxv) maxv = minv + PETSC_SMALL; 1365b0a32e0cSBarry Smith ierr = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr); 136645f3bb6eSLisandro Dalcin ierr = PetscDrawScalePopup(popup,minv,maxv);CHKERRQ(ierr); 1367383922c3SLisandro Dalcin 1368383922c3SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 1369f1af5d2fSBarry Smith for (j=0; j<n; j++) { 1370f1af5d2fSBarry Smith x_l = j; 1371f1af5d2fSBarry Smith x_r = x_l + 1.0; 1372f1af5d2fSBarry Smith for (i=0; i<m; i++) { 1373f1af5d2fSBarry Smith y_l = m - i - 1.0; 1374f1af5d2fSBarry Smith y_r = y_l + 1.0; 1375b05fc000SLisandro Dalcin color = PetscDrawRealToColor(PetscAbsScalar(v[j*m+i]),minv,maxv); 1376b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1377f1af5d2fSBarry Smith } 1378f1af5d2fSBarry Smith } 1379383922c3SLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 1380f1af5d2fSBarry Smith } 1381f1af5d2fSBarry Smith PetscFunctionReturn(0); 1382f1af5d2fSBarry Smith } 1383f1af5d2fSBarry Smith 1384e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer) 1385f1af5d2fSBarry Smith { 1386b0a32e0cSBarry Smith PetscDraw draw; 1387ace3abfcSBarry Smith PetscBool isnull; 1388329f5518SBarry Smith PetscReal xr,yr,xl,yl,h,w; 1389dfbe8321SBarry Smith PetscErrorCode ierr; 1390f1af5d2fSBarry Smith 1391f1af5d2fSBarry Smith PetscFunctionBegin; 1392b0a32e0cSBarry Smith ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr); 1393b0a32e0cSBarry Smith ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 1394abc0a331SBarry Smith if (isnull) PetscFunctionReturn(0); 1395f1af5d2fSBarry Smith 1396d0f46423SBarry Smith xr = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0; 1397f1af5d2fSBarry Smith xr += w; yr += h; xl = -w; yl = -h; 1398b0a32e0cSBarry Smith ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr); 1399832b7cebSLisandro Dalcin ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr); 1400b0a32e0cSBarry Smith ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr); 14010298fd71SBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr); 1402832b7cebSLisandro Dalcin ierr = PetscDrawSave(draw);CHKERRQ(ierr); 1403f1af5d2fSBarry Smith PetscFunctionReturn(0); 1404f1af5d2fSBarry Smith } 1405f1af5d2fSBarry Smith 1406dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer) 1407932b0c3eSLois Curfman McInnes { 1408dfbe8321SBarry Smith PetscErrorCode ierr; 1409ace3abfcSBarry Smith PetscBool iascii,isbinary,isdraw; 1410932b0c3eSLois Curfman McInnes 14113a40ed3dSBarry Smith PetscFunctionBegin; 1412251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 1413251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 1414251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 14150f5bd95cSBarry Smith 1416c45a1595SBarry Smith if (iascii) { 1417c45a1595SBarry Smith ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr); 14180f5bd95cSBarry Smith } else if (isbinary) { 14193a40ed3dSBarry Smith ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr); 1420f1af5d2fSBarry Smith } else if (isdraw) { 1421f1af5d2fSBarry Smith ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr); 1422932b0c3eSLois Curfman McInnes } 14233a40ed3dSBarry Smith PetscFunctionReturn(0); 1424932b0c3eSLois Curfman McInnes } 1425289bc588SBarry Smith 1426d3042a70SBarry Smith static PetscErrorCode MatDensePlaceArray_SeqDense(Mat A,const PetscScalar array[]) 1427d3042a70SBarry Smith { 1428d3042a70SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1429d3042a70SBarry Smith 1430d3042a70SBarry Smith PetscFunctionBegin; 1431d3042a70SBarry Smith a->unplacedarray = a->v; 1432d3042a70SBarry Smith a->unplaced_user_alloc = a->user_alloc; 1433d3042a70SBarry Smith a->v = (PetscScalar*) array; 1434d3042a70SBarry Smith PetscFunctionReturn(0); 1435d3042a70SBarry Smith } 1436d3042a70SBarry Smith 1437d3042a70SBarry Smith static PetscErrorCode MatDenseResetArray_SeqDense(Mat A) 1438d3042a70SBarry Smith { 1439d3042a70SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1440d3042a70SBarry Smith 1441d3042a70SBarry Smith PetscFunctionBegin; 1442d3042a70SBarry Smith a->v = a->unplacedarray; 1443d3042a70SBarry Smith a->user_alloc = a->unplaced_user_alloc; 1444d3042a70SBarry Smith a->unplacedarray = NULL; 1445d3042a70SBarry Smith PetscFunctionReturn(0); 1446d3042a70SBarry Smith } 1447d3042a70SBarry Smith 1448e0877f53SBarry Smith static PetscErrorCode MatDestroy_SeqDense(Mat mat) 1449289bc588SBarry Smith { 1450ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)mat->data; 1451dfbe8321SBarry Smith PetscErrorCode ierr; 145290f02eecSBarry Smith 14533a40ed3dSBarry Smith PetscFunctionBegin; 1454aa482453SBarry Smith #if defined(PETSC_USE_LOG) 1455d0f46423SBarry Smith PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n); 1456a5a9c739SBarry Smith #endif 145705b42c5fSBarry Smith ierr = PetscFree(l->pivots);CHKERRQ(ierr); 1458a49dc2a2SStefano Zampini ierr = PetscFree(l->fwork);CHKERRQ(ierr); 1459abc3b08eSStefano Zampini ierr = MatDestroy(&l->ptapwork);CHKERRQ(ierr); 14606857c123SSatish Balay if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);} 1461bf0cc555SLisandro Dalcin ierr = PetscFree(mat->data);CHKERRQ(ierr); 1462dbd8c25aSHong Zhang 1463dbd8c25aSHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr); 1464bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL);CHKERRQ(ierr); 1465d3042a70SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDensePlaceArray_C",NULL);CHKERRQ(ierr); 1466d3042a70SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseResetArray_C",NULL);CHKERRQ(ierr); 1467bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL);CHKERRQ(ierr); 14688baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL);CHKERRQ(ierr); 14698baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 14708baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL);CHKERRQ(ierr); 14718baccfbdSHong Zhang #endif 1472bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL);CHKERRQ(ierr); 1473bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1474bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1475bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1476abc3b08eSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatPtAP_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 14773bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 14783bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 14793bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 148086aefd0dSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumn_C",NULL);CHKERRQ(ierr); 148186aefd0dSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumn_C",NULL);CHKERRQ(ierr); 14823a40ed3dSBarry Smith PetscFunctionReturn(0); 1483289bc588SBarry Smith } 1484289bc588SBarry Smith 1485e0877f53SBarry Smith static PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout) 1486289bc588SBarry Smith { 1487c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 14886849ba73SBarry Smith PetscErrorCode ierr; 148913f74950SBarry Smith PetscInt k,j,m,n,M; 149087828ca2SBarry Smith PetscScalar *v,tmp; 149148b35521SBarry Smith 14923a40ed3dSBarry Smith PetscFunctionBegin; 1493d0f46423SBarry Smith v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n; 14942847e3fdSStefano Zampini if (reuse == MAT_INPLACE_MATRIX && m == n) { /* in place transpose */ 1495d3e5ee88SLois Curfman McInnes for (j=0; j<m; j++) { 1496289bc588SBarry Smith for (k=0; k<j; k++) { 14971b807ce4Svictorle tmp = v[j + k*M]; 14981b807ce4Svictorle v[j + k*M] = v[k + j*M]; 14991b807ce4Svictorle v[k + j*M] = tmp; 1500289bc588SBarry Smith } 1501289bc588SBarry Smith } 15023a40ed3dSBarry Smith } else { /* out-of-place transpose */ 1503d3e5ee88SLois Curfman McInnes Mat tmat; 1504ec8511deSBarry Smith Mat_SeqDense *tmatd; 150587828ca2SBarry Smith PetscScalar *v2; 1506af36a384SStefano Zampini PetscInt M2; 1507ea709b57SSatish Balay 15082847e3fdSStefano Zampini if (reuse != MAT_REUSE_MATRIX) { 1509ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr); 1510d0f46423SBarry Smith ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr); 15117adad957SLisandro Dalcin ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 15120298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr); 1513fc4dec0aSBarry Smith } else { 1514fc4dec0aSBarry Smith tmat = *matout; 1515fc4dec0aSBarry Smith } 1516ec8511deSBarry Smith tmatd = (Mat_SeqDense*)tmat->data; 1517af36a384SStefano Zampini v = mat->v; v2 = tmatd->v; M2 = tmatd->lda; 1518d3e5ee88SLois Curfman McInnes for (j=0; j<n; j++) { 1519af36a384SStefano Zampini for (k=0; k<m; k++) v2[j + k*M2] = v[k + j*M]; 1520d3e5ee88SLois Curfman McInnes } 15216d4a8577SBarry Smith ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 15226d4a8577SBarry Smith ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 15232847e3fdSStefano Zampini if (reuse == MAT_INITIAL_MATRIX || reuse == MAT_REUSE_MATRIX) *matout = tmat; 15242847e3fdSStefano Zampini else { 15252847e3fdSStefano Zampini ierr = MatHeaderMerge(A,&tmat);CHKERRQ(ierr); 15262847e3fdSStefano Zampini } 152748b35521SBarry Smith } 15283a40ed3dSBarry Smith PetscFunctionReturn(0); 1529289bc588SBarry Smith } 1530289bc588SBarry Smith 1531e0877f53SBarry Smith static PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool *flg) 1532289bc588SBarry Smith { 1533c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data; 1534c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data; 153513f74950SBarry Smith PetscInt i,j; 1536a2ea699eSBarry Smith PetscScalar *v1,*v2; 15379ea5d5aeSSatish Balay 15383a40ed3dSBarry Smith PetscFunctionBegin; 1539d0f46423SBarry Smith if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1540d0f46423SBarry Smith if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1541d0f46423SBarry Smith for (i=0; i<A1->rmap->n; i++) { 15421b807ce4Svictorle v1 = mat1->v+i; v2 = mat2->v+i; 1543d0f46423SBarry Smith for (j=0; j<A1->cmap->n; j++) { 15443a40ed3dSBarry Smith if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 15451b807ce4Svictorle v1 += mat1->lda; v2 += mat2->lda; 15461b807ce4Svictorle } 1547289bc588SBarry Smith } 154877c4ece6SBarry Smith *flg = PETSC_TRUE; 15493a40ed3dSBarry Smith PetscFunctionReturn(0); 1550289bc588SBarry Smith } 1551289bc588SBarry Smith 1552e0877f53SBarry Smith static PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v) 1553289bc588SBarry Smith { 1554c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1555dfbe8321SBarry Smith PetscErrorCode ierr; 155613f74950SBarry Smith PetscInt i,n,len; 155787828ca2SBarry Smith PetscScalar *x,zero = 0.0; 155844cd7ae7SLois Curfman McInnes 15593a40ed3dSBarry Smith PetscFunctionBegin; 15602dcb1b2aSMatthew Knepley ierr = VecSet(v,zero);CHKERRQ(ierr); 15617a97a34bSBarry Smith ierr = VecGetSize(v,&n);CHKERRQ(ierr); 15621ebc52fbSHong Zhang ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1563d0f46423SBarry Smith len = PetscMin(A->rmap->n,A->cmap->n); 1564e32f2f54SBarry Smith if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec"); 156544cd7ae7SLois Curfman McInnes for (i=0; i<len; i++) { 15661b807ce4Svictorle x[i] = mat->v[i*mat->lda + i]; 1567289bc588SBarry Smith } 15681ebc52fbSHong Zhang ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 15693a40ed3dSBarry Smith PetscFunctionReturn(0); 1570289bc588SBarry Smith } 1571289bc588SBarry Smith 1572e0877f53SBarry Smith static PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr) 1573289bc588SBarry Smith { 1574c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1575f1ceaac6SMatthew G. Knepley const PetscScalar *l,*r; 1576f1ceaac6SMatthew G. Knepley PetscScalar x,*v; 1577dfbe8321SBarry Smith PetscErrorCode ierr; 1578d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n; 157955659b69SBarry Smith 15803a40ed3dSBarry Smith PetscFunctionBegin; 158128988994SBarry Smith if (ll) { 15827a97a34bSBarry Smith ierr = VecGetSize(ll,&m);CHKERRQ(ierr); 1583f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(ll,&l);CHKERRQ(ierr); 1584e32f2f54SBarry Smith if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size"); 1585da3a660dSBarry Smith for (i=0; i<m; i++) { 1586da3a660dSBarry Smith x = l[i]; 1587da3a660dSBarry Smith v = mat->v + i; 1588b43bac26SStefano Zampini for (j=0; j<n; j++) { (*v) *= x; v+= mat->lda;} 1589da3a660dSBarry Smith } 1590f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(ll,&l);CHKERRQ(ierr); 1591eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr); 1592da3a660dSBarry Smith } 159328988994SBarry Smith if (rr) { 15947a97a34bSBarry Smith ierr = VecGetSize(rr,&n);CHKERRQ(ierr); 1595f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(rr,&r);CHKERRQ(ierr); 1596e32f2f54SBarry Smith if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size"); 1597da3a660dSBarry Smith for (i=0; i<n; i++) { 1598da3a660dSBarry Smith x = r[i]; 1599b43bac26SStefano Zampini v = mat->v + i*mat->lda; 16002205254eSKarl Rupp for (j=0; j<m; j++) (*v++) *= x; 1601da3a660dSBarry Smith } 1602f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(rr,&r);CHKERRQ(ierr); 1603eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr); 1604da3a660dSBarry Smith } 16053a40ed3dSBarry Smith PetscFunctionReturn(0); 1606289bc588SBarry Smith } 1607289bc588SBarry Smith 1608e0877f53SBarry Smith static PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm) 1609289bc588SBarry Smith { 1610c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 161187828ca2SBarry Smith PetscScalar *v = mat->v; 1612329f5518SBarry Smith PetscReal sum = 0.0; 1613d0f46423SBarry Smith PetscInt lda =mat->lda,m=A->rmap->n,i,j; 1614efee365bSSatish Balay PetscErrorCode ierr; 161555659b69SBarry Smith 16163a40ed3dSBarry Smith PetscFunctionBegin; 1617289bc588SBarry Smith if (type == NORM_FROBENIUS) { 1618a5ce6ee0Svictorle if (lda>m) { 1619d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1620a5ce6ee0Svictorle v = mat->v+j*lda; 1621a5ce6ee0Svictorle for (i=0; i<m; i++) { 1622a5ce6ee0Svictorle sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1623a5ce6ee0Svictorle } 1624a5ce6ee0Svictorle } 1625a5ce6ee0Svictorle } else { 1626570b7f6dSBarry Smith #if defined(PETSC_USE_REAL___FP16) 1627570b7f6dSBarry Smith PetscBLASInt one = 1,cnt = A->cmap->n*A->rmap->n; 1628570b7f6dSBarry Smith *nrm = BLASnrm2_(&cnt,v,&one); 1629570b7f6dSBarry Smith } 1630570b7f6dSBarry Smith #else 1631d0f46423SBarry Smith for (i=0; i<A->cmap->n*A->rmap->n; i++) { 1632329f5518SBarry Smith sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1633289bc588SBarry Smith } 1634a5ce6ee0Svictorle } 16358f1a2a5eSBarry Smith *nrm = PetscSqrtReal(sum); 1636570b7f6dSBarry Smith #endif 1637dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 16383a40ed3dSBarry Smith } else if (type == NORM_1) { 1639064f8208SBarry Smith *nrm = 0.0; 1640d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 16411b807ce4Svictorle v = mat->v + j*mat->lda; 1642289bc588SBarry Smith sum = 0.0; 1643d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 164433a8263dSBarry Smith sum += PetscAbsScalar(*v); v++; 1645289bc588SBarry Smith } 1646064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1647289bc588SBarry Smith } 1648eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 16493a40ed3dSBarry Smith } else if (type == NORM_INFINITY) { 1650064f8208SBarry Smith *nrm = 0.0; 1651d0f46423SBarry Smith for (j=0; j<A->rmap->n; j++) { 1652289bc588SBarry Smith v = mat->v + j; 1653289bc588SBarry Smith sum = 0.0; 1654d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) { 16551b807ce4Svictorle sum += PetscAbsScalar(*v); v += mat->lda; 1656289bc588SBarry Smith } 1657064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1658289bc588SBarry Smith } 1659eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 1660e7e72b3dSBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm"); 16613a40ed3dSBarry Smith PetscFunctionReturn(0); 1662289bc588SBarry Smith } 1663289bc588SBarry Smith 1664e0877f53SBarry Smith static PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg) 1665289bc588SBarry Smith { 1666c0bbcb79SLois Curfman McInnes Mat_SeqDense *aij = (Mat_SeqDense*)A->data; 166763ba0a88SBarry Smith PetscErrorCode ierr; 166867e560aaSBarry Smith 16693a40ed3dSBarry Smith PetscFunctionBegin; 1670b5a2b587SKris Buschelman switch (op) { 1671b5a2b587SKris Buschelman case MAT_ROW_ORIENTED: 16724e0d8c25SBarry Smith aij->roworiented = flg; 1673b5a2b587SKris Buschelman break; 1674512a5fc5SBarry Smith case MAT_NEW_NONZERO_LOCATIONS: 1675b5a2b587SKris Buschelman case MAT_NEW_NONZERO_LOCATION_ERR: 16763971808eSMatthew Knepley case MAT_NEW_NONZERO_ALLOCATION_ERR: 16774e0d8c25SBarry Smith case MAT_NEW_DIAGONALS: 167813fa8e87SLisandro Dalcin case MAT_KEEP_NONZERO_PATTERN: 1679b5a2b587SKris Buschelman case MAT_IGNORE_OFF_PROC_ENTRIES: 1680b5a2b587SKris Buschelman case MAT_USE_HASH_TABLE: 16810f8fb01aSBarry Smith case MAT_IGNORE_ZERO_ENTRIES: 16825021d80fSJed Brown case MAT_IGNORE_LOWER_TRIANGULAR: 16835021d80fSJed Brown ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr); 16845021d80fSJed Brown break; 16855021d80fSJed Brown case MAT_SPD: 168677e54ba9SKris Buschelman case MAT_SYMMETRIC: 168777e54ba9SKris Buschelman case MAT_STRUCTURALLY_SYMMETRIC: 16889a4540c5SBarry Smith case MAT_HERMITIAN: 16899a4540c5SBarry Smith case MAT_SYMMETRY_ETERNAL: 16905021d80fSJed Brown /* These options are handled directly by MatSetOption() */ 169177e54ba9SKris Buschelman break; 1692b5a2b587SKris Buschelman default: 1693e32f2f54SBarry Smith SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]); 16943a40ed3dSBarry Smith } 16953a40ed3dSBarry Smith PetscFunctionReturn(0); 1696289bc588SBarry Smith } 1697289bc588SBarry Smith 1698e0877f53SBarry Smith static PetscErrorCode MatZeroEntries_SeqDense(Mat A) 16996f0a148fSBarry Smith { 1700ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 17016849ba73SBarry Smith PetscErrorCode ierr; 1702d0f46423SBarry Smith PetscInt lda=l->lda,m=A->rmap->n,j; 17033a40ed3dSBarry Smith 17043a40ed3dSBarry Smith PetscFunctionBegin; 1705a5ce6ee0Svictorle if (lda>m) { 1706d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1707a5ce6ee0Svictorle ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 1708a5ce6ee0Svictorle } 1709a5ce6ee0Svictorle } else { 1710d0f46423SBarry Smith ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1711a5ce6ee0Svictorle } 17123a40ed3dSBarry Smith PetscFunctionReturn(0); 17136f0a148fSBarry Smith } 17146f0a148fSBarry Smith 1715e0877f53SBarry Smith static PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b) 17166f0a148fSBarry Smith { 171797b48c8fSBarry Smith PetscErrorCode ierr; 1718ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 1719b9679d65SBarry Smith PetscInt m = l->lda, n = A->cmap->n, i,j; 172097b48c8fSBarry Smith PetscScalar *slot,*bb; 172197b48c8fSBarry Smith const PetscScalar *xx; 172255659b69SBarry Smith 17233a40ed3dSBarry Smith PetscFunctionBegin; 1724b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG) 1725b9679d65SBarry Smith for (i=0; i<N; i++) { 1726b9679d65SBarry Smith if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed"); 1727b9679d65SBarry 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); 1728b9679d65SBarry Smith } 1729b9679d65SBarry Smith #endif 1730b9679d65SBarry Smith 173197b48c8fSBarry Smith /* fix right hand side if needed */ 173297b48c8fSBarry Smith if (x && b) { 173397b48c8fSBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 173497b48c8fSBarry Smith ierr = VecGetArray(b,&bb);CHKERRQ(ierr); 17352205254eSKarl Rupp for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]]; 173697b48c8fSBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 173797b48c8fSBarry Smith ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr); 173897b48c8fSBarry Smith } 173997b48c8fSBarry Smith 17406f0a148fSBarry Smith for (i=0; i<N; i++) { 17416f0a148fSBarry Smith slot = l->v + rows[i]; 1742b9679d65SBarry Smith for (j=0; j<n; j++) { *slot = 0.0; slot += m;} 17436f0a148fSBarry Smith } 1744f4df32b1SMatthew Knepley if (diag != 0.0) { 1745b9679d65SBarry Smith if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 17466f0a148fSBarry Smith for (i=0; i<N; i++) { 1747b9679d65SBarry Smith slot = l->v + (m+1)*rows[i]; 1748f4df32b1SMatthew Knepley *slot = diag; 17496f0a148fSBarry Smith } 17506f0a148fSBarry Smith } 17513a40ed3dSBarry Smith PetscFunctionReturn(0); 17526f0a148fSBarry Smith } 1753557bce09SLois Curfman McInnes 1754e0877f53SBarry Smith static PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar *array[]) 175564e87e97SBarry Smith { 1756c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 17573a40ed3dSBarry Smith 17583a40ed3dSBarry Smith PetscFunctionBegin; 1759e32f2f54SBarry 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"); 176064e87e97SBarry Smith *array = mat->v; 17613a40ed3dSBarry Smith PetscFunctionReturn(0); 176264e87e97SBarry Smith } 17630754003eSLois Curfman McInnes 1764e0877f53SBarry Smith static PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar *array[]) 1765ff14e315SSatish Balay { 17663a40ed3dSBarry Smith PetscFunctionBegin; 17673a40ed3dSBarry Smith PetscFunctionReturn(0); 1768ff14e315SSatish Balay } 17690754003eSLois Curfman McInnes 1770dec5eb66SMatthew G Knepley /*@C 17718c778c55SBarry Smith MatDenseGetArray - gives access to the array where the data for a SeqDense matrix is stored 177273a71a0fSBarry Smith 17738572280aSBarry Smith Logically Collective on Mat 177473a71a0fSBarry Smith 177573a71a0fSBarry Smith Input Parameter: 1776579dbff0SBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 177773a71a0fSBarry Smith 177873a71a0fSBarry Smith Output Parameter: 177973a71a0fSBarry Smith . array - pointer to the data 178073a71a0fSBarry Smith 178173a71a0fSBarry Smith Level: intermediate 178273a71a0fSBarry Smith 17838572280aSBarry Smith .seealso: MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead() 178473a71a0fSBarry Smith @*/ 17858c778c55SBarry Smith PetscErrorCode MatDenseGetArray(Mat A,PetscScalar **array) 178673a71a0fSBarry Smith { 178773a71a0fSBarry Smith PetscErrorCode ierr; 178873a71a0fSBarry Smith 178973a71a0fSBarry Smith PetscFunctionBegin; 17908c778c55SBarry Smith ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 179173a71a0fSBarry Smith PetscFunctionReturn(0); 179273a71a0fSBarry Smith } 179373a71a0fSBarry Smith 1794dec5eb66SMatthew G Knepley /*@C 1795579dbff0SBarry Smith MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray() 179673a71a0fSBarry Smith 17978572280aSBarry Smith Logically Collective on Mat 17988572280aSBarry Smith 17998572280aSBarry Smith Input Parameters: 1800*a2b725a8SWilliam Gropp + mat - a MATSEQDENSE or MATMPIDENSE matrix 1801*a2b725a8SWilliam Gropp - array - pointer to the data 18028572280aSBarry Smith 18038572280aSBarry Smith Level: intermediate 18048572280aSBarry Smith 18058572280aSBarry Smith .seealso: MatDenseGetArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead() 18068572280aSBarry Smith @*/ 18078572280aSBarry Smith PetscErrorCode MatDenseRestoreArray(Mat A,PetscScalar **array) 18088572280aSBarry Smith { 18098572280aSBarry Smith PetscErrorCode ierr; 18108572280aSBarry Smith 18118572280aSBarry Smith PetscFunctionBegin; 18128572280aSBarry Smith ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 18138572280aSBarry Smith if (array) *array = NULL; 18148572280aSBarry Smith ierr = PetscObjectStateIncrease((PetscObject)A);CHKERRQ(ierr); 18158572280aSBarry Smith PetscFunctionReturn(0); 18168572280aSBarry Smith } 18178572280aSBarry Smith 18188572280aSBarry Smith /*@C 18198572280aSBarry Smith MatDenseGetArrayRead - gives access to the array where the data for a SeqDense matrix is stored 18208572280aSBarry Smith 18218572280aSBarry Smith Not Collective 18228572280aSBarry Smith 18238572280aSBarry Smith Input Parameter: 18248572280aSBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 18258572280aSBarry Smith 18268572280aSBarry Smith Output Parameter: 18278572280aSBarry Smith . array - pointer to the data 18288572280aSBarry Smith 18298572280aSBarry Smith Level: intermediate 18308572280aSBarry Smith 18318572280aSBarry Smith .seealso: MatDenseRestoreArray(), MatDenseGetArray(), MatDenseRestoreArrayRead() 18328572280aSBarry Smith @*/ 18338572280aSBarry Smith PetscErrorCode MatDenseGetArrayRead(Mat A,const PetscScalar **array) 18348572280aSBarry Smith { 18358572280aSBarry Smith PetscErrorCode ierr; 18368572280aSBarry Smith 18378572280aSBarry Smith PetscFunctionBegin; 18388572280aSBarry Smith ierr = PetscUseMethod(A,"MatDenseGetArrayRead_C",(Mat,const PetscScalar**),(A,array));CHKERRQ(ierr); 18398572280aSBarry Smith PetscFunctionReturn(0); 18408572280aSBarry Smith } 18418572280aSBarry Smith 18428572280aSBarry Smith /*@C 18438572280aSBarry Smith MatDenseRestoreArrayRead - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray() 18448572280aSBarry Smith 184573a71a0fSBarry Smith Not Collective 184673a71a0fSBarry Smith 184773a71a0fSBarry Smith Input Parameters: 1848*a2b725a8SWilliam Gropp + mat - a MATSEQDENSE or MATMPIDENSE matrix 1849*a2b725a8SWilliam Gropp - array - pointer to the data 185073a71a0fSBarry Smith 185173a71a0fSBarry Smith Level: intermediate 185273a71a0fSBarry Smith 18538572280aSBarry Smith .seealso: MatDenseGetArray(), MatDenseGetArrayRead(), MatDenseRestoreArray() 185473a71a0fSBarry Smith @*/ 18558572280aSBarry Smith PetscErrorCode MatDenseRestoreArrayRead(Mat A,const PetscScalar **array) 185673a71a0fSBarry Smith { 185773a71a0fSBarry Smith PetscErrorCode ierr; 185873a71a0fSBarry Smith 185973a71a0fSBarry Smith PetscFunctionBegin; 18608572280aSBarry Smith ierr = PetscUseMethod(A,"MatDenseRestoreArrayRead_C",(Mat,const PetscScalar**),(A,array));CHKERRQ(ierr); 18618572280aSBarry Smith if (array) *array = NULL; 186273a71a0fSBarry Smith PetscFunctionReturn(0); 186373a71a0fSBarry Smith } 186473a71a0fSBarry Smith 18657dae84e0SHong Zhang static PetscErrorCode MatCreateSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B) 18660754003eSLois Curfman McInnes { 1867c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 18686849ba73SBarry Smith PetscErrorCode ierr; 18695d0c19d7SBarry Smith PetscInt i,j,nrows,ncols; 18705d0c19d7SBarry Smith const PetscInt *irow,*icol; 187187828ca2SBarry Smith PetscScalar *av,*bv,*v = mat->v; 18720754003eSLois Curfman McInnes Mat newmat; 18730754003eSLois Curfman McInnes 18743a40ed3dSBarry Smith PetscFunctionBegin; 187578b31e54SBarry Smith ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr); 187678b31e54SBarry Smith ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr); 1877e03a110bSBarry Smith ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr); 1878e03a110bSBarry Smith ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr); 18790754003eSLois Curfman McInnes 1880182d2002SSatish Balay /* Check submatrixcall */ 1881182d2002SSatish Balay if (scall == MAT_REUSE_MATRIX) { 188213f74950SBarry Smith PetscInt n_cols,n_rows; 1883182d2002SSatish Balay ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr); 188421a2c019SBarry Smith if (n_rows != nrows || n_cols != ncols) { 1885f746d493SDmitry Karpeev /* resize the result matrix to match number of requested rows/columns */ 1886c61587bbSBarry Smith ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 188721a2c019SBarry Smith } 1888182d2002SSatish Balay newmat = *B; 1889182d2002SSatish Balay } else { 18900754003eSLois Curfman McInnes /* Create and fill new matrix */ 1891ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr); 1892f69a0ea3SMatthew Knepley ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 18937adad957SLisandro Dalcin ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 18940298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr); 1895182d2002SSatish Balay } 1896182d2002SSatish Balay 1897182d2002SSatish Balay /* Now extract the data pointers and do the copy,column at a time */ 1898182d2002SSatish Balay bv = ((Mat_SeqDense*)newmat->data)->v; 1899182d2002SSatish Balay 1900182d2002SSatish Balay for (i=0; i<ncols; i++) { 19016de62eeeSBarry Smith av = v + mat->lda*icol[i]; 19022205254eSKarl Rupp for (j=0; j<nrows; j++) *bv++ = av[irow[j]]; 19030754003eSLois Curfman McInnes } 1904182d2002SSatish Balay 1905182d2002SSatish Balay /* Assemble the matrices so that the correct flags are set */ 19066d4a8577SBarry Smith ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 19076d4a8577SBarry Smith ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 19080754003eSLois Curfman McInnes 19090754003eSLois Curfman McInnes /* Free work space */ 191078b31e54SBarry Smith ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr); 191178b31e54SBarry Smith ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr); 1912182d2002SSatish Balay *B = newmat; 19133a40ed3dSBarry Smith PetscFunctionReturn(0); 19140754003eSLois Curfman McInnes } 19150754003eSLois Curfman McInnes 19167dae84e0SHong Zhang static PetscErrorCode MatCreateSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[]) 1917905e6a2fSBarry Smith { 19186849ba73SBarry Smith PetscErrorCode ierr; 191913f74950SBarry Smith PetscInt i; 1920905e6a2fSBarry Smith 19213a40ed3dSBarry Smith PetscFunctionBegin; 1922905e6a2fSBarry Smith if (scall == MAT_INITIAL_MATRIX) { 1923df750dc8SHong Zhang ierr = PetscCalloc1(n+1,B);CHKERRQ(ierr); 1924905e6a2fSBarry Smith } 1925905e6a2fSBarry Smith 1926905e6a2fSBarry Smith for (i=0; i<n; i++) { 19277dae84e0SHong Zhang ierr = MatCreateSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr); 1928905e6a2fSBarry Smith } 19293a40ed3dSBarry Smith PetscFunctionReturn(0); 1930905e6a2fSBarry Smith } 1931905e6a2fSBarry Smith 1932e0877f53SBarry Smith static PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode) 1933c0aa2d19SHong Zhang { 1934c0aa2d19SHong Zhang PetscFunctionBegin; 1935c0aa2d19SHong Zhang PetscFunctionReturn(0); 1936c0aa2d19SHong Zhang } 1937c0aa2d19SHong Zhang 1938e0877f53SBarry Smith static PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode) 1939c0aa2d19SHong Zhang { 1940c0aa2d19SHong Zhang PetscFunctionBegin; 1941c0aa2d19SHong Zhang PetscFunctionReturn(0); 1942c0aa2d19SHong Zhang } 1943c0aa2d19SHong Zhang 1944e0877f53SBarry Smith static PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str) 19454b0e389bSBarry Smith { 19464b0e389bSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data; 19476849ba73SBarry Smith PetscErrorCode ierr; 1948d0f46423SBarry Smith PetscInt lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j; 19493a40ed3dSBarry Smith 19503a40ed3dSBarry Smith PetscFunctionBegin; 195133f4a19fSKris Buschelman /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */ 195233f4a19fSKris Buschelman if (A->ops->copy != B->ops->copy) { 1953cb5b572fSBarry Smith ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr); 19543a40ed3dSBarry Smith PetscFunctionReturn(0); 19553a40ed3dSBarry Smith } 1956e32f2f54SBarry Smith if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)"); 1957a5ce6ee0Svictorle if (lda1>m || lda2>m) { 19580dbb7854Svictorle for (j=0; j<n; j++) { 1959a5ce6ee0Svictorle ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr); 1960a5ce6ee0Svictorle } 1961a5ce6ee0Svictorle } else { 1962d0f46423SBarry Smith ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1963a5ce6ee0Svictorle } 1964cdc753b6SBarry Smith ierr = PetscObjectStateIncrease((PetscObject)B);CHKERRQ(ierr); 1965273d9f13SBarry Smith PetscFunctionReturn(0); 1966273d9f13SBarry Smith } 1967273d9f13SBarry Smith 1968e0877f53SBarry Smith static PetscErrorCode MatSetUp_SeqDense(Mat A) 1969273d9f13SBarry Smith { 1970dfbe8321SBarry Smith PetscErrorCode ierr; 1971273d9f13SBarry Smith 1972273d9f13SBarry Smith PetscFunctionBegin; 1973273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr); 19743a40ed3dSBarry Smith PetscFunctionReturn(0); 19754b0e389bSBarry Smith } 19764b0e389bSBarry Smith 1977ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A) 1978ba337c44SJed Brown { 1979ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1980ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1981ba337c44SJed Brown PetscScalar *aa = a->v; 1982ba337c44SJed Brown 1983ba337c44SJed Brown PetscFunctionBegin; 1984ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]); 1985ba337c44SJed Brown PetscFunctionReturn(0); 1986ba337c44SJed Brown } 1987ba337c44SJed Brown 1988ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A) 1989ba337c44SJed Brown { 1990ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1991ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1992ba337c44SJed Brown PetscScalar *aa = a->v; 1993ba337c44SJed Brown 1994ba337c44SJed Brown PetscFunctionBegin; 1995ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]); 1996ba337c44SJed Brown PetscFunctionReturn(0); 1997ba337c44SJed Brown } 1998ba337c44SJed Brown 1999ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A) 2000ba337c44SJed Brown { 2001ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2002ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 2003ba337c44SJed Brown PetscScalar *aa = a->v; 2004ba337c44SJed Brown 2005ba337c44SJed Brown PetscFunctionBegin; 2006ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]); 2007ba337c44SJed Brown PetscFunctionReturn(0); 2008ba337c44SJed Brown } 2009284134d9SBarry Smith 2010a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/ 2011150d2497SBarry Smith PETSC_INTERN PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 2012a9fe9ddaSSatish Balay { 2013a9fe9ddaSSatish Balay PetscErrorCode ierr; 2014a9fe9ddaSSatish Balay 2015a9fe9ddaSSatish Balay PetscFunctionBegin; 2016a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX) { 20173ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 2018a9fe9ddaSSatish Balay ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 20193ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 2020a9fe9ddaSSatish Balay } 20213ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr); 2022a9fe9ddaSSatish Balay ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 20233ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr); 2024a9fe9ddaSSatish Balay PetscFunctionReturn(0); 2025a9fe9ddaSSatish Balay } 2026a9fe9ddaSSatish Balay 2027a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 2028a9fe9ddaSSatish Balay { 2029ee16a9a1SHong Zhang PetscErrorCode ierr; 2030d0f46423SBarry Smith PetscInt m=A->rmap->n,n=B->cmap->n; 2031ee16a9a1SHong Zhang Mat Cmat; 2032a9fe9ddaSSatish Balay 2033ee16a9a1SHong Zhang PetscFunctionBegin; 2034e32f2f54SBarry 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); 2035ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 2036ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 2037ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 20380298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr); 2039d73949e8SHong Zhang 2040ee16a9a1SHong Zhang *C = Cmat; 2041ee16a9a1SHong Zhang PetscFunctionReturn(0); 2042ee16a9a1SHong Zhang } 2043a9fe9ddaSSatish Balay 2044a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 2045a9fe9ddaSSatish Balay { 2046a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2047a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 2048a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 20490805154bSBarry Smith PetscBLASInt m,n,k; 2050a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 2051c5df96a5SBarry Smith PetscErrorCode ierr; 2052fd4e9aacSBarry Smith PetscBool flg; 2053a9fe9ddaSSatish Balay 2054a9fe9ddaSSatish Balay PetscFunctionBegin; 2055fd4e9aacSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)B,MATSEQDENSE,&flg);CHKERRQ(ierr); 2056fd4e9aacSBarry Smith if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Second matrix must be dense"); 2057fd4e9aacSBarry Smith 2058fd4e9aacSBarry Smith /* Handle case where where user provided the final C matrix rather than calling MatMatMult() with MAT_INITIAL_MATRIX*/ 2059fd4e9aacSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&flg);CHKERRQ(ierr); 2060fd4e9aacSBarry Smith if (flg) { 2061fd4e9aacSBarry Smith C->ops->matmultnumeric = MatMatMultNumeric_SeqAIJ_SeqDense; 2062fd4e9aacSBarry Smith ierr = (*C->ops->matmultnumeric)(A,B,C);CHKERRQ(ierr); 2063fd4e9aacSBarry Smith PetscFunctionReturn(0); 2064fd4e9aacSBarry Smith } 2065fd4e9aacSBarry Smith 2066fd4e9aacSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQDENSE,&flg);CHKERRQ(ierr); 2067fd4e9aacSBarry Smith if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"First matrix must be dense"); 20688208b9aeSStefano Zampini ierr = PetscBLASIntCast(C->rmap->n,&m);CHKERRQ(ierr); 20698208b9aeSStefano Zampini ierr = PetscBLASIntCast(C->cmap->n,&n);CHKERRQ(ierr); 2070c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr); 207149d0e964SStefano Zampini if (!m || !n || !k) PetscFunctionReturn(0); 20725ca1cc5dSStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda)); 2073a9fe9ddaSSatish Balay PetscFunctionReturn(0); 2074a9fe9ddaSSatish Balay } 2075a9fe9ddaSSatish Balay 207669f65d41SStefano Zampini PetscErrorCode MatMatTransposeMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 207769f65d41SStefano Zampini { 207869f65d41SStefano Zampini PetscErrorCode ierr; 207969f65d41SStefano Zampini 208069f65d41SStefano Zampini PetscFunctionBegin; 208169f65d41SStefano Zampini if (scall == MAT_INITIAL_MATRIX) { 208269f65d41SStefano Zampini ierr = PetscLogEventBegin(MAT_MatTransposeMultSymbolic,A,B,0,0);CHKERRQ(ierr); 208369f65d41SStefano Zampini ierr = MatMatTransposeMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 208469f65d41SStefano Zampini ierr = PetscLogEventEnd(MAT_MatTransposeMultSymbolic,A,B,0,0);CHKERRQ(ierr); 208569f65d41SStefano Zampini } 208669f65d41SStefano Zampini ierr = PetscLogEventBegin(MAT_MatTransposeMultNumeric,A,B,0,0);CHKERRQ(ierr); 208769f65d41SStefano Zampini ierr = MatMatTransposeMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 208869f65d41SStefano Zampini ierr = PetscLogEventEnd(MAT_MatTransposeMultNumeric,A,B,0,0);CHKERRQ(ierr); 208969f65d41SStefano Zampini PetscFunctionReturn(0); 209069f65d41SStefano Zampini } 209169f65d41SStefano Zampini 209269f65d41SStefano Zampini PetscErrorCode MatMatTransposeMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 209369f65d41SStefano Zampini { 209469f65d41SStefano Zampini PetscErrorCode ierr; 209569f65d41SStefano Zampini PetscInt m=A->rmap->n,n=B->rmap->n; 209669f65d41SStefano Zampini Mat Cmat; 209769f65d41SStefano Zampini 209869f65d41SStefano Zampini PetscFunctionBegin; 209969f65d41SStefano 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); 210069f65d41SStefano Zampini ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 210169f65d41SStefano Zampini ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 210269f65d41SStefano Zampini ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 210369f65d41SStefano Zampini ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr); 210469f65d41SStefano Zampini 210569f65d41SStefano Zampini Cmat->assembled = PETSC_TRUE; 210669f65d41SStefano Zampini 210769f65d41SStefano Zampini *C = Cmat; 210869f65d41SStefano Zampini PetscFunctionReturn(0); 210969f65d41SStefano Zampini } 211069f65d41SStefano Zampini 211169f65d41SStefano Zampini PetscErrorCode MatMatTransposeMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 211269f65d41SStefano Zampini { 211369f65d41SStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 211469f65d41SStefano Zampini Mat_SeqDense *b = (Mat_SeqDense*)B->data; 211569f65d41SStefano Zampini Mat_SeqDense *c = (Mat_SeqDense*)C->data; 211669f65d41SStefano Zampini PetscBLASInt m,n,k; 211769f65d41SStefano Zampini PetscScalar _DOne=1.0,_DZero=0.0; 211869f65d41SStefano Zampini PetscErrorCode ierr; 211969f65d41SStefano Zampini 212069f65d41SStefano Zampini PetscFunctionBegin; 212149d0e964SStefano Zampini ierr = PetscBLASIntCast(C->rmap->n,&m);CHKERRQ(ierr); 212249d0e964SStefano Zampini ierr = PetscBLASIntCast(C->cmap->n,&n);CHKERRQ(ierr); 212369f65d41SStefano Zampini ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr); 212449d0e964SStefano Zampini if (!m || !n || !k) PetscFunctionReturn(0); 212569f65d41SStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("N","T",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda)); 212669f65d41SStefano Zampini PetscFunctionReturn(0); 212769f65d41SStefano Zampini } 212869f65d41SStefano Zampini 212975648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 2130a9fe9ddaSSatish Balay { 2131a9fe9ddaSSatish Balay PetscErrorCode ierr; 2132a9fe9ddaSSatish Balay 2133a9fe9ddaSSatish Balay PetscFunctionBegin; 2134a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX) { 21353ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 213675648e8dSHong Zhang ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 21373ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 2138a9fe9ddaSSatish Balay } 21393ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr); 214075648e8dSHong Zhang ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 21413ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr); 2142a9fe9ddaSSatish Balay PetscFunctionReturn(0); 2143a9fe9ddaSSatish Balay } 2144a9fe9ddaSSatish Balay 214575648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 2146a9fe9ddaSSatish Balay { 2147ee16a9a1SHong Zhang PetscErrorCode ierr; 2148d0f46423SBarry Smith PetscInt m=A->cmap->n,n=B->cmap->n; 2149ee16a9a1SHong Zhang Mat Cmat; 2150a9fe9ddaSSatish Balay 2151ee16a9a1SHong Zhang PetscFunctionBegin; 2152e32f2f54SBarry 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); 2153ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 2154ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 2155ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 21560298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr); 21572205254eSKarl Rupp 2158ee16a9a1SHong Zhang Cmat->assembled = PETSC_TRUE; 21592205254eSKarl Rupp 2160ee16a9a1SHong Zhang *C = Cmat; 2161ee16a9a1SHong Zhang PetscFunctionReturn(0); 2162ee16a9a1SHong Zhang } 2163a9fe9ddaSSatish Balay 216475648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 2165a9fe9ddaSSatish Balay { 2166a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2167a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 2168a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 21690805154bSBarry Smith PetscBLASInt m,n,k; 2170a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 2171c5df96a5SBarry Smith PetscErrorCode ierr; 2172a9fe9ddaSSatish Balay 2173a9fe9ddaSSatish Balay PetscFunctionBegin; 21748208b9aeSStefano Zampini ierr = PetscBLASIntCast(C->rmap->n,&m);CHKERRQ(ierr); 21758208b9aeSStefano Zampini ierr = PetscBLASIntCast(C->cmap->n,&n);CHKERRQ(ierr); 2176c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr); 217749d0e964SStefano Zampini if (!m || !n || !k) PetscFunctionReturn(0); 21785ca1cc5dSStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda)); 2179a9fe9ddaSSatish Balay PetscFunctionReturn(0); 2180a9fe9ddaSSatish Balay } 2181985db425SBarry Smith 2182e0877f53SBarry Smith static PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[]) 2183985db425SBarry Smith { 2184985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2185985db425SBarry Smith PetscErrorCode ierr; 2186d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 2187985db425SBarry Smith PetscScalar *x; 2188985db425SBarry Smith MatScalar *aa = a->v; 2189985db425SBarry Smith 2190985db425SBarry Smith PetscFunctionBegin; 2191e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2192985db425SBarry Smith 2193985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 2194985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2195985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 2196e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2197985db425SBarry Smith for (i=0; i<m; i++) { 2198985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 2199985db425SBarry Smith for (j=1; j<n; j++) { 2200985db425SBarry Smith if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 2201985db425SBarry Smith } 2202985db425SBarry Smith } 2203985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2204985db425SBarry Smith PetscFunctionReturn(0); 2205985db425SBarry Smith } 2206985db425SBarry Smith 2207e0877f53SBarry Smith static PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[]) 2208985db425SBarry Smith { 2209985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2210985db425SBarry Smith PetscErrorCode ierr; 2211d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 2212985db425SBarry Smith PetscScalar *x; 2213985db425SBarry Smith PetscReal atmp; 2214985db425SBarry Smith MatScalar *aa = a->v; 2215985db425SBarry Smith 2216985db425SBarry Smith PetscFunctionBegin; 2217e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2218985db425SBarry Smith 2219985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 2220985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2221985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 2222e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2223985db425SBarry Smith for (i=0; i<m; i++) { 22249189402eSHong Zhang x[i] = PetscAbsScalar(aa[i]); 2225985db425SBarry Smith for (j=1; j<n; j++) { 2226985db425SBarry Smith atmp = PetscAbsScalar(aa[i+m*j]); 2227985db425SBarry Smith if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;} 2228985db425SBarry Smith } 2229985db425SBarry Smith } 2230985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2231985db425SBarry Smith PetscFunctionReturn(0); 2232985db425SBarry Smith } 2233985db425SBarry Smith 2234e0877f53SBarry Smith static PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[]) 2235985db425SBarry Smith { 2236985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2237985db425SBarry Smith PetscErrorCode ierr; 2238d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 2239985db425SBarry Smith PetscScalar *x; 2240985db425SBarry Smith MatScalar *aa = a->v; 2241985db425SBarry Smith 2242985db425SBarry Smith PetscFunctionBegin; 2243e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2244985db425SBarry Smith 2245985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 2246985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2247985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 2248e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2249985db425SBarry Smith for (i=0; i<m; i++) { 2250985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 2251985db425SBarry Smith for (j=1; j<n; j++) { 2252985db425SBarry Smith if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 2253985db425SBarry Smith } 2254985db425SBarry Smith } 2255985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2256985db425SBarry Smith PetscFunctionReturn(0); 2257985db425SBarry Smith } 2258985db425SBarry Smith 2259e0877f53SBarry Smith static PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col) 22608d0534beSBarry Smith { 22618d0534beSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 22628d0534beSBarry Smith PetscErrorCode ierr; 22638d0534beSBarry Smith PetscScalar *x; 22648d0534beSBarry Smith 22658d0534beSBarry Smith PetscFunctionBegin; 2266e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 22678d0534beSBarry Smith 22688d0534beSBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2269d0f46423SBarry Smith ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 22708d0534beSBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 22718d0534beSBarry Smith PetscFunctionReturn(0); 22728d0534beSBarry Smith } 22738d0534beSBarry Smith 22740716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms) 22750716a85fSBarry Smith { 22760716a85fSBarry Smith PetscErrorCode ierr; 22770716a85fSBarry Smith PetscInt i,j,m,n; 22780716a85fSBarry Smith PetscScalar *a; 22790716a85fSBarry Smith 22800716a85fSBarry Smith PetscFunctionBegin; 22810716a85fSBarry Smith ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr); 22820716a85fSBarry Smith ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr); 22838c778c55SBarry Smith ierr = MatDenseGetArray(A,&a);CHKERRQ(ierr); 22840716a85fSBarry Smith if (type == NORM_2) { 22850716a85fSBarry Smith for (i=0; i<n; i++) { 22860716a85fSBarry Smith for (j=0; j<m; j++) { 22870716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]*a[j]); 22880716a85fSBarry Smith } 22890716a85fSBarry Smith a += m; 22900716a85fSBarry Smith } 22910716a85fSBarry Smith } else if (type == NORM_1) { 22920716a85fSBarry Smith for (i=0; i<n; i++) { 22930716a85fSBarry Smith for (j=0; j<m; j++) { 22940716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]); 22950716a85fSBarry Smith } 22960716a85fSBarry Smith a += m; 22970716a85fSBarry Smith } 22980716a85fSBarry Smith } else if (type == NORM_INFINITY) { 22990716a85fSBarry Smith for (i=0; i<n; i++) { 23000716a85fSBarry Smith for (j=0; j<m; j++) { 23010716a85fSBarry Smith norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]); 23020716a85fSBarry Smith } 23030716a85fSBarry Smith a += m; 23040716a85fSBarry Smith } 2305ce94432eSBarry Smith } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType"); 23068c778c55SBarry Smith ierr = MatDenseRestoreArray(A,&a);CHKERRQ(ierr); 23070716a85fSBarry Smith if (type == NORM_2) { 23088f1a2a5eSBarry Smith for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]); 23090716a85fSBarry Smith } 23100716a85fSBarry Smith PetscFunctionReturn(0); 23110716a85fSBarry Smith } 23120716a85fSBarry Smith 231373a71a0fSBarry Smith static PetscErrorCode MatSetRandom_SeqDense(Mat x,PetscRandom rctx) 231473a71a0fSBarry Smith { 231573a71a0fSBarry Smith PetscErrorCode ierr; 231673a71a0fSBarry Smith PetscScalar *a; 231773a71a0fSBarry Smith PetscInt m,n,i; 231873a71a0fSBarry Smith 231973a71a0fSBarry Smith PetscFunctionBegin; 232073a71a0fSBarry Smith ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr); 23218c778c55SBarry Smith ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr); 232273a71a0fSBarry Smith for (i=0; i<m*n; i++) { 232373a71a0fSBarry Smith ierr = PetscRandomGetValue(rctx,a+i);CHKERRQ(ierr); 232473a71a0fSBarry Smith } 23258c778c55SBarry Smith ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr); 232673a71a0fSBarry Smith PetscFunctionReturn(0); 232773a71a0fSBarry Smith } 232873a71a0fSBarry Smith 23293b49f96aSBarry Smith static PetscErrorCode MatMissingDiagonal_SeqDense(Mat A,PetscBool *missing,PetscInt *d) 23303b49f96aSBarry Smith { 23313b49f96aSBarry Smith PetscFunctionBegin; 23323b49f96aSBarry Smith *missing = PETSC_FALSE; 23333b49f96aSBarry Smith PetscFunctionReturn(0); 23343b49f96aSBarry Smith } 233573a71a0fSBarry Smith 2336af53bab2SHong Zhang static PetscErrorCode MatDenseGetColumn_SeqDense(Mat A,PetscInt col,PetscScalar **vals) 233786aefd0dSHong Zhang { 233886aefd0dSHong Zhang Mat_SeqDense *a = (Mat_SeqDense*)A->data; 233986aefd0dSHong Zhang 234086aefd0dSHong Zhang PetscFunctionBegin; 234186aefd0dSHong Zhang if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 234286aefd0dSHong Zhang *vals = a->v+col*a->lda; 234386aefd0dSHong Zhang PetscFunctionReturn(0); 234486aefd0dSHong Zhang } 234586aefd0dSHong Zhang 2346af53bab2SHong Zhang static PetscErrorCode MatDenseRestoreColumn_SeqDense(Mat A,PetscScalar **vals) 234786aefd0dSHong Zhang { 234886aefd0dSHong Zhang PetscFunctionBegin; 234986aefd0dSHong Zhang *vals = 0; /* user cannot accidently use the array later */ 235086aefd0dSHong Zhang PetscFunctionReturn(0); 235186aefd0dSHong Zhang } 2352abc3b08eSStefano Zampini 2353289bc588SBarry Smith /* -------------------------------------------------------------------*/ 2354a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense, 2355905e6a2fSBarry Smith MatGetRow_SeqDense, 2356905e6a2fSBarry Smith MatRestoreRow_SeqDense, 2357905e6a2fSBarry Smith MatMult_SeqDense, 235897304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense, 23597c922b88SBarry Smith MatMultTranspose_SeqDense, 23607c922b88SBarry Smith MatMultTransposeAdd_SeqDense, 2361db4efbfdSBarry Smith 0, 2362db4efbfdSBarry Smith 0, 2363db4efbfdSBarry Smith 0, 2364db4efbfdSBarry Smith /* 10*/ 0, 2365905e6a2fSBarry Smith MatLUFactor_SeqDense, 2366905e6a2fSBarry Smith MatCholeskyFactor_SeqDense, 236741f059aeSBarry Smith MatSOR_SeqDense, 2368ec8511deSBarry Smith MatTranspose_SeqDense, 236997304618SKris Buschelman /* 15*/ MatGetInfo_SeqDense, 2370905e6a2fSBarry Smith MatEqual_SeqDense, 2371905e6a2fSBarry Smith MatGetDiagonal_SeqDense, 2372905e6a2fSBarry Smith MatDiagonalScale_SeqDense, 2373905e6a2fSBarry Smith MatNorm_SeqDense, 2374c0aa2d19SHong Zhang /* 20*/ MatAssemblyBegin_SeqDense, 2375c0aa2d19SHong Zhang MatAssemblyEnd_SeqDense, 2376905e6a2fSBarry Smith MatSetOption_SeqDense, 2377905e6a2fSBarry Smith MatZeroEntries_SeqDense, 2378d519adbfSMatthew Knepley /* 24*/ MatZeroRows_SeqDense, 2379db4efbfdSBarry Smith 0, 2380db4efbfdSBarry Smith 0, 2381db4efbfdSBarry Smith 0, 2382db4efbfdSBarry Smith 0, 23834994cf47SJed Brown /* 29*/ MatSetUp_SeqDense, 2384273d9f13SBarry Smith 0, 2385905e6a2fSBarry Smith 0, 238673a71a0fSBarry Smith 0, 238773a71a0fSBarry Smith 0, 2388d519adbfSMatthew Knepley /* 34*/ MatDuplicate_SeqDense, 2389a5ae1ecdSBarry Smith 0, 2390a5ae1ecdSBarry Smith 0, 2391a5ae1ecdSBarry Smith 0, 2392a5ae1ecdSBarry Smith 0, 2393d519adbfSMatthew Knepley /* 39*/ MatAXPY_SeqDense, 23947dae84e0SHong Zhang MatCreateSubMatrices_SeqDense, 2395a5ae1ecdSBarry Smith 0, 23964b0e389bSBarry Smith MatGetValues_SeqDense, 2397a5ae1ecdSBarry Smith MatCopy_SeqDense, 2398d519adbfSMatthew Knepley /* 44*/ MatGetRowMax_SeqDense, 2399a5ae1ecdSBarry Smith MatScale_SeqDense, 24007d68702bSBarry Smith MatShift_Basic, 2401a5ae1ecdSBarry Smith 0, 24023f49a652SStefano Zampini MatZeroRowsColumns_SeqDense, 240373a71a0fSBarry Smith /* 49*/ MatSetRandom_SeqDense, 2404a5ae1ecdSBarry Smith 0, 2405a5ae1ecdSBarry Smith 0, 2406a5ae1ecdSBarry Smith 0, 2407a5ae1ecdSBarry Smith 0, 2408d519adbfSMatthew Knepley /* 54*/ 0, 2409a5ae1ecdSBarry Smith 0, 2410a5ae1ecdSBarry Smith 0, 2411a5ae1ecdSBarry Smith 0, 2412a5ae1ecdSBarry Smith 0, 2413d519adbfSMatthew Knepley /* 59*/ 0, 2414e03a110bSBarry Smith MatDestroy_SeqDense, 2415e03a110bSBarry Smith MatView_SeqDense, 2416357abbc8SBarry Smith 0, 241797304618SKris Buschelman 0, 2418d519adbfSMatthew Knepley /* 64*/ 0, 241997304618SKris Buschelman 0, 242097304618SKris Buschelman 0, 242197304618SKris Buschelman 0, 242297304618SKris Buschelman 0, 2423d519adbfSMatthew Knepley /* 69*/ MatGetRowMaxAbs_SeqDense, 242497304618SKris Buschelman 0, 242597304618SKris Buschelman 0, 242697304618SKris Buschelman 0, 242797304618SKris Buschelman 0, 2428d519adbfSMatthew Knepley /* 74*/ 0, 242997304618SKris Buschelman 0, 243097304618SKris Buschelman 0, 243197304618SKris Buschelman 0, 243297304618SKris Buschelman 0, 2433d519adbfSMatthew Knepley /* 79*/ 0, 243497304618SKris Buschelman 0, 243597304618SKris Buschelman 0, 243697304618SKris Buschelman 0, 24375bba2384SShri Abhyankar /* 83*/ MatLoad_SeqDense, 2438865e5f61SKris Buschelman 0, 24391cbb95d3SBarry Smith MatIsHermitian_SeqDense, 2440865e5f61SKris Buschelman 0, 2441865e5f61SKris Buschelman 0, 2442865e5f61SKris Buschelman 0, 2443d519adbfSMatthew Knepley /* 89*/ MatMatMult_SeqDense_SeqDense, 2444a9fe9ddaSSatish Balay MatMatMultSymbolic_SeqDense_SeqDense, 2445a9fe9ddaSSatish Balay MatMatMultNumeric_SeqDense_SeqDense, 2446abc3b08eSStefano Zampini MatPtAP_SeqDense_SeqDense, 2447abc3b08eSStefano Zampini MatPtAPSymbolic_SeqDense_SeqDense, 2448abc3b08eSStefano Zampini /* 94*/ MatPtAPNumeric_SeqDense_SeqDense, 244969f65d41SStefano Zampini MatMatTransposeMult_SeqDense_SeqDense, 245069f65d41SStefano Zampini MatMatTransposeMultSymbolic_SeqDense_SeqDense, 245169f65d41SStefano Zampini MatMatTransposeMultNumeric_SeqDense_SeqDense, 2452284134d9SBarry Smith 0, 2453d519adbfSMatthew Knepley /* 99*/ 0, 2454284134d9SBarry Smith 0, 2455284134d9SBarry Smith 0, 2456ba337c44SJed Brown MatConjugate_SeqDense, 2457f73d5cc4SBarry Smith 0, 2458ba337c44SJed Brown /*104*/ 0, 2459ba337c44SJed Brown MatRealPart_SeqDense, 2460ba337c44SJed Brown MatImaginaryPart_SeqDense, 2461985db425SBarry Smith 0, 2462985db425SBarry Smith 0, 24638208b9aeSStefano Zampini /*109*/ 0, 2464985db425SBarry Smith 0, 24658d0534beSBarry Smith MatGetRowMin_SeqDense, 2466aabbc4fbSShri Abhyankar MatGetColumnVector_SeqDense, 24673b49f96aSBarry Smith MatMissingDiagonal_SeqDense, 2468aabbc4fbSShri Abhyankar /*114*/ 0, 2469aabbc4fbSShri Abhyankar 0, 2470aabbc4fbSShri Abhyankar 0, 2471aabbc4fbSShri Abhyankar 0, 2472aabbc4fbSShri Abhyankar 0, 2473aabbc4fbSShri Abhyankar /*119*/ 0, 2474aabbc4fbSShri Abhyankar 0, 2475aabbc4fbSShri Abhyankar 0, 24760716a85fSBarry Smith 0, 24770716a85fSBarry Smith 0, 24780716a85fSBarry Smith /*124*/ 0, 24795df89d91SHong Zhang MatGetColumnNorms_SeqDense, 24805df89d91SHong Zhang 0, 24815df89d91SHong Zhang 0, 24825df89d91SHong Zhang 0, 24835df89d91SHong Zhang /*129*/ 0, 248475648e8dSHong Zhang MatTransposeMatMult_SeqDense_SeqDense, 248575648e8dSHong Zhang MatTransposeMatMultSymbolic_SeqDense_SeqDense, 248675648e8dSHong Zhang MatTransposeMatMultNumeric_SeqDense_SeqDense, 24873964eb88SJed Brown 0, 24883964eb88SJed Brown /*134*/ 0, 24893964eb88SJed Brown 0, 24903964eb88SJed Brown 0, 24913964eb88SJed Brown 0, 24923964eb88SJed Brown 0, 24933964eb88SJed Brown /*139*/ 0, 2494f9426fe0SMark Adams 0, 2495d528f656SJakub Kruzik 0, 2496d528f656SJakub Kruzik 0, 2497d528f656SJakub Kruzik 0, 2498d528f656SJakub Kruzik /*144*/ MatCreateMPIMatConcatenateSeqMat_SeqDense 2499985db425SBarry Smith }; 250090ace30eSBarry Smith 25014b828684SBarry Smith /*@C 2502fafbff53SBarry Smith MatCreateSeqDense - Creates a sequential dense matrix that 2503d65003e9SLois Curfman McInnes is stored in column major order (the usual Fortran 77 manner). Many 2504d65003e9SLois Curfman McInnes of the matrix operations use the BLAS and LAPACK routines. 2505289bc588SBarry Smith 2506db81eaa0SLois Curfman McInnes Collective on MPI_Comm 2507db81eaa0SLois Curfman McInnes 250820563c6bSBarry Smith Input Parameters: 2509db81eaa0SLois Curfman McInnes + comm - MPI communicator, set to PETSC_COMM_SELF 25100c775827SLois Curfman McInnes . m - number of rows 251118f449edSLois Curfman McInnes . n - number of columns 25120298fd71SBarry Smith - data - optional location of matrix data in column major order. Set data=NULL for PETSc 2513dfc5480cSLois Curfman McInnes to control all matrix memory allocation. 251420563c6bSBarry Smith 251520563c6bSBarry Smith Output Parameter: 251644cd7ae7SLois Curfman McInnes . A - the matrix 251720563c6bSBarry Smith 2518b259b22eSLois Curfman McInnes Notes: 251918f449edSLois Curfman McInnes The data input variable is intended primarily for Fortran programmers 252018f449edSLois Curfman McInnes who wish to allocate their own matrix memory space. Most users should 25210298fd71SBarry Smith set data=NULL. 252218f449edSLois Curfman McInnes 2523027ccd11SLois Curfman McInnes Level: intermediate 2524027ccd11SLois Curfman McInnes 2525dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS 2526d65003e9SLois Curfman McInnes 252769b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues() 252820563c6bSBarry Smith @*/ 25297087cfbeSBarry Smith PetscErrorCode MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A) 2530289bc588SBarry Smith { 2531dfbe8321SBarry Smith PetscErrorCode ierr; 25323b2fbd54SBarry Smith 25333a40ed3dSBarry Smith PetscFunctionBegin; 2534f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 2535f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr); 2536273d9f13SBarry Smith ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr); 2537273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr); 2538273d9f13SBarry Smith PetscFunctionReturn(0); 2539273d9f13SBarry Smith } 2540273d9f13SBarry Smith 2541273d9f13SBarry Smith /*@C 2542273d9f13SBarry Smith MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements 2543273d9f13SBarry Smith 2544273d9f13SBarry Smith Collective on MPI_Comm 2545273d9f13SBarry Smith 2546273d9f13SBarry Smith Input Parameters: 25471c4f3114SJed Brown + B - the matrix 25480298fd71SBarry Smith - data - the array (or NULL) 2549273d9f13SBarry Smith 2550273d9f13SBarry Smith Notes: 2551273d9f13SBarry Smith The data input variable is intended primarily for Fortran programmers 2552273d9f13SBarry Smith who wish to allocate their own matrix memory space. Most users should 2553284134d9SBarry Smith need not call this routine. 2554273d9f13SBarry Smith 2555273d9f13SBarry Smith Level: intermediate 2556273d9f13SBarry Smith 2557273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS 2558273d9f13SBarry Smith 255969b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA() 2560867c911aSBarry Smith 2561273d9f13SBarry Smith @*/ 25627087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation(Mat B,PetscScalar data[]) 2563273d9f13SBarry Smith { 25644ac538c5SBarry Smith PetscErrorCode ierr; 2565a23d5eceSKris Buschelman 2566a23d5eceSKris Buschelman PetscFunctionBegin; 25674ac538c5SBarry Smith ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr); 2568a23d5eceSKris Buschelman PetscFunctionReturn(0); 2569a23d5eceSKris Buschelman } 2570a23d5eceSKris Buschelman 25717087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data) 2572a23d5eceSKris Buschelman { 2573273d9f13SBarry Smith Mat_SeqDense *b; 2574dfbe8321SBarry Smith PetscErrorCode ierr; 2575273d9f13SBarry Smith 2576273d9f13SBarry Smith PetscFunctionBegin; 2577273d9f13SBarry Smith B->preallocated = PETSC_TRUE; 2578a868139aSShri Abhyankar 257934ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr); 258034ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr); 258134ef9618SShri Abhyankar 2582273d9f13SBarry Smith b = (Mat_SeqDense*)B->data; 258386d161a7SShri Abhyankar b->Mmax = B->rmap->n; 258486d161a7SShri Abhyankar b->Nmax = B->cmap->n; 258586d161a7SShri Abhyankar if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n; 258686d161a7SShri Abhyankar 2587220afb94SBarry Smith ierr = PetscIntMultError(b->lda,b->Nmax,NULL);CHKERRQ(ierr); 25889e8f95c4SLisandro Dalcin if (!data) { /* petsc-allocated storage */ 25899e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2590e92229d0SSatish Balay ierr = PetscCalloc1((size_t)b->lda*b->Nmax,&b->v);CHKERRQ(ierr); 25913bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr); 25922205254eSKarl Rupp 25939e8f95c4SLisandro Dalcin b->user_alloc = PETSC_FALSE; 2594273d9f13SBarry Smith } else { /* user-allocated storage */ 25959e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2596273d9f13SBarry Smith b->v = data; 2597273d9f13SBarry Smith b->user_alloc = PETSC_TRUE; 2598273d9f13SBarry Smith } 25990450473dSBarry Smith B->assembled = PETSC_TRUE; 2600273d9f13SBarry Smith PetscFunctionReturn(0); 2601273d9f13SBarry Smith } 2602273d9f13SBarry Smith 260365b80a83SHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 2604cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat) 26058baccfbdSHong Zhang { 2606d77f618aSHong Zhang Mat mat_elemental; 2607d77f618aSHong Zhang PetscErrorCode ierr; 2608d77f618aSHong Zhang PetscScalar *array,*v_colwise; 2609d77f618aSHong Zhang PetscInt M=A->rmap->N,N=A->cmap->N,i,j,k,*rows,*cols; 2610d77f618aSHong Zhang 26118baccfbdSHong Zhang PetscFunctionBegin; 2612d77f618aSHong Zhang ierr = PetscMalloc3(M*N,&v_colwise,M,&rows,N,&cols);CHKERRQ(ierr); 2613d77f618aSHong Zhang ierr = MatDenseGetArray(A,&array);CHKERRQ(ierr); 2614d77f618aSHong Zhang /* convert column-wise array into row-wise v_colwise, see MatSetValues_Elemental() */ 2615d77f618aSHong Zhang k = 0; 2616d77f618aSHong Zhang for (j=0; j<N; j++) { 2617d77f618aSHong Zhang cols[j] = j; 2618d77f618aSHong Zhang for (i=0; i<M; i++) { 2619d77f618aSHong Zhang v_colwise[j*M+i] = array[k++]; 2620d77f618aSHong Zhang } 2621d77f618aSHong Zhang } 2622d77f618aSHong Zhang for (i=0; i<M; i++) { 2623d77f618aSHong Zhang rows[i] = i; 2624d77f618aSHong Zhang } 2625d77f618aSHong Zhang ierr = MatDenseRestoreArray(A,&array);CHKERRQ(ierr); 2626d77f618aSHong Zhang 2627d77f618aSHong Zhang ierr = MatCreate(PetscObjectComm((PetscObject)A), &mat_elemental);CHKERRQ(ierr); 2628d77f618aSHong Zhang ierr = MatSetSizes(mat_elemental,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr); 2629d77f618aSHong Zhang ierr = MatSetType(mat_elemental,MATELEMENTAL);CHKERRQ(ierr); 2630d77f618aSHong Zhang ierr = MatSetUp(mat_elemental);CHKERRQ(ierr); 2631d77f618aSHong Zhang 2632d77f618aSHong Zhang /* PETSc-Elemental interaface uses axpy for setting off-processor entries, only ADD_VALUES is allowed */ 2633d77f618aSHong Zhang ierr = MatSetValues(mat_elemental,M,rows,N,cols,v_colwise,ADD_VALUES);CHKERRQ(ierr); 2634d77f618aSHong Zhang ierr = MatAssemblyBegin(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2635d77f618aSHong Zhang ierr = MatAssemblyEnd(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2636d77f618aSHong Zhang ierr = PetscFree3(v_colwise,rows,cols);CHKERRQ(ierr); 2637d77f618aSHong Zhang 2638511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 263928be2f97SBarry Smith ierr = MatHeaderReplace(A,&mat_elemental);CHKERRQ(ierr); 2640d77f618aSHong Zhang } else { 2641d77f618aSHong Zhang *newmat = mat_elemental; 2642d77f618aSHong Zhang } 26438baccfbdSHong Zhang PetscFunctionReturn(0); 26448baccfbdSHong Zhang } 264565b80a83SHong Zhang #endif 26468baccfbdSHong Zhang 26471b807ce4Svictorle /*@C 26481b807ce4Svictorle MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array 26491b807ce4Svictorle 26501b807ce4Svictorle Input parameter: 26511b807ce4Svictorle + A - the matrix 26521b807ce4Svictorle - lda - the leading dimension 26531b807ce4Svictorle 26541b807ce4Svictorle Notes: 2655867c911aSBarry Smith This routine is to be used in conjunction with MatSeqDenseSetPreallocation(); 26561b807ce4Svictorle it asserts that the preallocation has a leading dimension (the LDA parameter 26571b807ce4Svictorle of Blas and Lapack fame) larger than M, the first dimension of the matrix. 26581b807ce4Svictorle 26591b807ce4Svictorle Level: intermediate 26601b807ce4Svictorle 26611b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS 26621b807ce4Svictorle 2663284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize() 2664867c911aSBarry Smith 26651b807ce4Svictorle @*/ 26667087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetLDA(Mat B,PetscInt lda) 26671b807ce4Svictorle { 26681b807ce4Svictorle Mat_SeqDense *b = (Mat_SeqDense*)B->data; 266921a2c019SBarry Smith 26701b807ce4Svictorle PetscFunctionBegin; 2671e32f2f54SBarry 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); 26721b807ce4Svictorle b->lda = lda; 267321a2c019SBarry Smith b->changelda = PETSC_FALSE; 267421a2c019SBarry Smith b->Mmax = PetscMax(b->Mmax,lda); 26751b807ce4Svictorle PetscFunctionReturn(0); 26761b807ce4Svictorle } 26771b807ce4Svictorle 2678d528f656SJakub Kruzik PetscErrorCode MatCreateMPIMatConcatenateSeqMat_SeqDense(MPI_Comm comm,Mat inmat,PetscInt n,MatReuse scall,Mat *outmat) 2679d528f656SJakub Kruzik { 2680d528f656SJakub Kruzik PetscErrorCode ierr; 2681d528f656SJakub Kruzik PetscMPIInt size; 2682d528f656SJakub Kruzik 2683d528f656SJakub Kruzik PetscFunctionBegin; 2684d528f656SJakub Kruzik ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 2685d528f656SJakub Kruzik if (size == 1) { 2686d528f656SJakub Kruzik if (scall == MAT_INITIAL_MATRIX) { 2687d528f656SJakub Kruzik ierr = MatDuplicate(inmat,MAT_COPY_VALUES,outmat);CHKERRQ(ierr); 2688d528f656SJakub Kruzik } else { 2689d528f656SJakub Kruzik ierr = MatCopy(inmat,*outmat,SAME_NONZERO_PATTERN);CHKERRQ(ierr); 2690d528f656SJakub Kruzik } 2691d528f656SJakub Kruzik } else { 2692d528f656SJakub Kruzik ierr = MatCreateMPIMatConcatenateSeqMat_MPIDense(comm,inmat,n,scall,outmat);CHKERRQ(ierr); 2693d528f656SJakub Kruzik } 2694d528f656SJakub Kruzik PetscFunctionReturn(0); 2695d528f656SJakub Kruzik } 2696d528f656SJakub Kruzik 26970bad9183SKris Buschelman /*MC 2698fafad747SKris Buschelman MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices. 26990bad9183SKris Buschelman 27000bad9183SKris Buschelman Options Database Keys: 27010bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions() 27020bad9183SKris Buschelman 27030bad9183SKris Buschelman Level: beginner 27040bad9183SKris Buschelman 270589665df3SBarry Smith .seealso: MatCreateSeqDense() 270689665df3SBarry Smith 27070bad9183SKris Buschelman M*/ 27080bad9183SKris Buschelman 27098cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatCreate_SeqDense(Mat B) 2710273d9f13SBarry Smith { 2711273d9f13SBarry Smith Mat_SeqDense *b; 2712dfbe8321SBarry Smith PetscErrorCode ierr; 27137c334f02SBarry Smith PetscMPIInt size; 2714273d9f13SBarry Smith 2715273d9f13SBarry Smith PetscFunctionBegin; 2716ce94432eSBarry Smith ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr); 2717e32f2f54SBarry Smith if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1"); 271855659b69SBarry Smith 2719b00a9115SJed Brown ierr = PetscNewLog(B,&b);CHKERRQ(ierr); 2720549d3d68SSatish Balay ierr = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr); 272144cd7ae7SLois Curfman McInnes B->data = (void*)b; 272218f449edSLois Curfman McInnes 2723273d9f13SBarry Smith b->roworiented = PETSC_TRUE; 27244e220ebcSLois Curfman McInnes 2725bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr); 27268572280aSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr); 2727d3042a70SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDensePlaceArray_C",MatDensePlaceArray_SeqDense);CHKERRQ(ierr); 2728d3042a70SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseResetArray_C",MatDenseResetArray_SeqDense);CHKERRQ(ierr); 27298572280aSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArrayRead_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr); 2730715b7558SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArrayRead_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr); 2731bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr); 27328baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 27338baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr); 27348baccfbdSHong Zhang #endif 2735bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr); 2736bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaij_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 2737bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 2738bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 2739abc3b08eSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatPtAP_seqaij_seqdense_C",MatPtAP_SeqDense_SeqDense);CHKERRQ(ierr); 27404099cc6bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaijperm_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 27414099cc6bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaijperm_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 27424099cc6bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaijperm_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 27434099cc6bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatPtAP_seqaijperm_seqdense_C",MatPtAP_SeqDense_SeqDense);CHKERRQ(ierr); 2744e9e4f4a6SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaijsell_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 2745e9e4f4a6SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaijsell_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 2746e9e4f4a6SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaijsell_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 2747e9e4f4a6SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatPtAP_seqaijsell_seqdense_C",MatPtAP_SeqDense_SeqDense);CHKERRQ(ierr); 274896e6d5c4SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaijmkl_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 274996e6d5c4SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaijmkl_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 275096e6d5c4SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaijmkl_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 275196e6d5c4SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatPtAP_seqaijmkl_seqdense_C",MatPtAP_SeqDense_SeqDense);CHKERRQ(ierr); 275296e6d5c4SRichard Tran Mills 27533bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaij_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 27543bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 27553bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaij_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 27564099cc6bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaijperm_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 27574099cc6bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaijperm_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 27584099cc6bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaijperm_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 2759e9e4f4a6SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaijsell_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 2760e9e4f4a6SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaijsell_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 2761e9e4f4a6SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaijsell_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 276296e6d5c4SRichard Tran Mills 276396e6d5c4SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaijmkl_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 276496e6d5c4SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaijmkl_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 276596e6d5c4SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaijmkl_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 2766af53bab2SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumn_C",MatDenseGetColumn_SeqDense);CHKERRQ(ierr); 2767af53bab2SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumn_C",MatDenseRestoreColumn_SeqDense);CHKERRQ(ierr); 276817667f90SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr); 27693a40ed3dSBarry Smith PetscFunctionReturn(0); 2770289bc588SBarry Smith } 277186aefd0dSHong Zhang 277286aefd0dSHong Zhang /*@C 2773af53bab2SHong 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. 277486aefd0dSHong Zhang 277586aefd0dSHong Zhang Not Collective 277686aefd0dSHong Zhang 277786aefd0dSHong Zhang Input Parameter: 277886aefd0dSHong Zhang + mat - a MATSEQDENSE or MATMPIDENSE matrix 277986aefd0dSHong Zhang - col - column index 278086aefd0dSHong Zhang 278186aefd0dSHong Zhang Output Parameter: 278286aefd0dSHong Zhang . vals - pointer to the data 278386aefd0dSHong Zhang 278486aefd0dSHong Zhang Level: intermediate 278586aefd0dSHong Zhang 278686aefd0dSHong Zhang .seealso: MatDenseRestoreColumn() 278786aefd0dSHong Zhang @*/ 278886aefd0dSHong Zhang PetscErrorCode MatDenseGetColumn(Mat A,PetscInt col,PetscScalar **vals) 278986aefd0dSHong Zhang { 279086aefd0dSHong Zhang PetscErrorCode ierr; 279186aefd0dSHong Zhang 279286aefd0dSHong Zhang PetscFunctionBegin; 279386aefd0dSHong Zhang ierr = PetscUseMethod(A,"MatDenseGetColumn_C",(Mat,PetscInt,PetscScalar**),(A,col,vals));CHKERRQ(ierr); 279486aefd0dSHong Zhang PetscFunctionReturn(0); 279586aefd0dSHong Zhang } 279686aefd0dSHong Zhang 279786aefd0dSHong Zhang /*@C 279886aefd0dSHong Zhang MatDenseRestoreColumn - returns access to a column of a dense matrix which is returned by MatDenseGetColumn(). 279986aefd0dSHong Zhang 280086aefd0dSHong Zhang Not Collective 280186aefd0dSHong Zhang 280286aefd0dSHong Zhang Input Parameter: 280386aefd0dSHong Zhang . mat - a MATSEQDENSE or MATMPIDENSE matrix 280486aefd0dSHong Zhang 280586aefd0dSHong Zhang Output Parameter: 280686aefd0dSHong Zhang . vals - pointer to the data 280786aefd0dSHong Zhang 280886aefd0dSHong Zhang Level: intermediate 280986aefd0dSHong Zhang 281086aefd0dSHong Zhang .seealso: MatDenseGetColumn() 281186aefd0dSHong Zhang @*/ 281286aefd0dSHong Zhang PetscErrorCode MatDenseRestoreColumn(Mat A,PetscScalar **vals) 281386aefd0dSHong Zhang { 281486aefd0dSHong Zhang PetscErrorCode ierr; 281586aefd0dSHong Zhang 281686aefd0dSHong Zhang PetscFunctionBegin; 281786aefd0dSHong Zhang ierr = PetscUseMethod(A,"MatDenseRestoreColumn_C",(Mat,PetscScalar**),(A,vals));CHKERRQ(ierr); 281886aefd0dSHong Zhang PetscFunctionReturn(0); 281986aefd0dSHong Zhang } 2820