1be1d678aSKris Buschelman 267e560aaSBarry Smith /* 367e560aaSBarry Smith Defines the basic matrix operations for sequential dense. 467e560aaSBarry Smith */ 5289bc588SBarry Smith 6dec5eb66SMatthew G Knepley #include <../src/mat/impls/dense/seq/dense.h> /*I "petscmat.h" I*/ 7c6db04a5SJed Brown #include <petscblaslapack.h> 8289bc588SBarry Smith 96a63e612SBarry Smith #include <../src/mat/impls/aij/seq/aij.h> 10b2573a8aSBarry Smith 11ca15aa20SStefano Zampini PetscErrorCode MatSeqDenseSymmetrize_Private(Mat A, PetscBool hermitian) 128c178816SStefano Zampini { 138c178816SStefano Zampini Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 148c178816SStefano Zampini PetscInt j, k, n = A->rmap->n; 15ca15aa20SStefano Zampini PetscScalar *v; 16ca15aa20SStefano Zampini PetscErrorCode ierr; 178c178816SStefano Zampini 188c178816SStefano Zampini PetscFunctionBegin; 198c178816SStefano Zampini if (A->rmap->n != A->cmap->n) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_SUP,"Cannot symmetrize a rectangular matrix"); 20ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr); 218c178816SStefano Zampini if (!hermitian) { 228c178816SStefano Zampini for (k=0;k<n;k++) { 238c178816SStefano Zampini for (j=k;j<n;j++) { 24ca15aa20SStefano Zampini v[j*mat->lda + k] = v[k*mat->lda + j]; 258c178816SStefano Zampini } 268c178816SStefano Zampini } 278c178816SStefano Zampini } else { 288c178816SStefano Zampini for (k=0;k<n;k++) { 298c178816SStefano Zampini for (j=k;j<n;j++) { 30ca15aa20SStefano Zampini v[j*mat->lda + k] = PetscConj(v[k*mat->lda + j]); 318c178816SStefano Zampini } 328c178816SStefano Zampini } 338c178816SStefano Zampini } 34ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr); 358c178816SStefano Zampini PetscFunctionReturn(0); 368c178816SStefano Zampini } 378c178816SStefano Zampini 3805709791SSatish Balay PETSC_EXTERN PetscErrorCode MatSeqDenseInvertFactors_Private(Mat A) 398c178816SStefano Zampini { 408c178816SStefano Zampini #if defined(PETSC_MISSING_LAPACK_POTRF) 418c178816SStefano Zampini PetscFunctionBegin; 428c178816SStefano Zampini SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable."); 438c178816SStefano Zampini #else 448c178816SStefano Zampini Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 458c178816SStefano Zampini PetscErrorCode ierr; 468c178816SStefano Zampini PetscBLASInt info,n; 478c178816SStefano Zampini 488c178816SStefano Zampini PetscFunctionBegin; 498c178816SStefano Zampini if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 508c178816SStefano Zampini ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 518c178816SStefano Zampini if (A->factortype == MAT_FACTOR_LU) { 528c178816SStefano Zampini if (!mat->pivots) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Pivots not present"); 538c178816SStefano Zampini if (!mat->fwork) { 548c178816SStefano Zampini mat->lfwork = n; 558c178816SStefano Zampini ierr = PetscMalloc1(mat->lfwork,&mat->fwork);CHKERRQ(ierr); 568c178816SStefano Zampini ierr = PetscLogObjectMemory((PetscObject)A,mat->lfwork*sizeof(PetscBLASInt));CHKERRQ(ierr); 578c178816SStefano Zampini } 5800121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 598c178816SStefano Zampini PetscStackCallBLAS("LAPACKgetri",LAPACKgetri_(&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&mat->lfwork,&info)); 6000121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 61ca15aa20SStefano Zampini ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr); 628c178816SStefano Zampini } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 638c178816SStefano Zampini if (A->spd) { 6400121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 658c178816SStefano Zampini PetscStackCallBLAS("LAPACKpotri",LAPACKpotri_("L",&n,mat->v,&mat->lda,&info)); 6600121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 678c178816SStefano Zampini ierr = MatSeqDenseSymmetrize_Private(A,PETSC_TRUE);CHKERRQ(ierr); 688c178816SStefano Zampini #if defined(PETSC_USE_COMPLEX) 698c178816SStefano Zampini } else if (A->hermitian) { 708c178816SStefano Zampini if (!mat->pivots) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Pivots not present"); 718c178816SStefano Zampini if (!mat->fwork) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Fwork not present"); 7200121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 738c178816SStefano Zampini PetscStackCallBLAS("LAPACKhetri",LAPACKhetri_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&info)); 7400121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 758c178816SStefano Zampini ierr = MatSeqDenseSymmetrize_Private(A,PETSC_TRUE);CHKERRQ(ierr); 768c178816SStefano Zampini #endif 778c178816SStefano Zampini } else { /* symmetric case */ 788c178816SStefano Zampini if (!mat->pivots) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Pivots not present"); 798c178816SStefano Zampini if (!mat->fwork) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Fwork not present"); 8000121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 818c178816SStefano Zampini PetscStackCallBLAS("LAPACKsytri",LAPACKsytri_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&info)); 8200121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 838c178816SStefano Zampini ierr = MatSeqDenseSymmetrize_Private(A,PETSC_FALSE);CHKERRQ(ierr); 848c178816SStefano Zampini } 858c178816SStefano Zampini if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad Inversion: zero pivot in row %D",(PetscInt)info-1); 86ca15aa20SStefano Zampini ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr); 878c178816SStefano Zampini } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 888c178816SStefano Zampini #endif 898c178816SStefano Zampini 908c178816SStefano Zampini A->ops->solve = NULL; 918c178816SStefano Zampini A->ops->matsolve = NULL; 928c178816SStefano Zampini A->ops->solvetranspose = NULL; 938c178816SStefano Zampini A->ops->matsolvetranspose = NULL; 948c178816SStefano Zampini A->ops->solveadd = NULL; 958c178816SStefano Zampini A->ops->solvetransposeadd = NULL; 968c178816SStefano Zampini A->factortype = MAT_FACTOR_NONE; 978c178816SStefano Zampini ierr = PetscFree(A->solvertype);CHKERRQ(ierr); 988c178816SStefano Zampini PetscFunctionReturn(0); 998c178816SStefano Zampini } 1008c178816SStefano Zampini 1013f49a652SStefano Zampini PetscErrorCode MatZeroRowsColumns_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b) 1023f49a652SStefano Zampini { 1033f49a652SStefano Zampini PetscErrorCode ierr; 1043f49a652SStefano Zampini Mat_SeqDense *l = (Mat_SeqDense*)A->data; 1053f49a652SStefano Zampini PetscInt m = l->lda, n = A->cmap->n,r = A->rmap->n, i,j; 106ca15aa20SStefano Zampini PetscScalar *slot,*bb,*v; 1073f49a652SStefano Zampini const PetscScalar *xx; 1083f49a652SStefano Zampini 1093f49a652SStefano Zampini PetscFunctionBegin; 1103f49a652SStefano Zampini #if defined(PETSC_USE_DEBUG) 1113f49a652SStefano Zampini for (i=0; i<N; i++) { 1123f49a652SStefano Zampini if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed"); 1133f49a652SStefano 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); 1143f49a652SStefano 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); 1153f49a652SStefano Zampini } 1163f49a652SStefano Zampini #endif 117ca15aa20SStefano Zampini if (!N) PetscFunctionReturn(0); 1183f49a652SStefano Zampini 1193f49a652SStefano Zampini /* fix right hand side if needed */ 1203f49a652SStefano Zampini if (x && b) { 1216c4d906cSStefano Zampini Vec xt; 1226c4d906cSStefano Zampini 1236c4d906cSStefano Zampini if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 1246c4d906cSStefano Zampini ierr = VecDuplicate(x,&xt);CHKERRQ(ierr); 1256c4d906cSStefano Zampini ierr = VecCopy(x,xt);CHKERRQ(ierr); 1266c4d906cSStefano Zampini ierr = VecScale(xt,-1.0);CHKERRQ(ierr); 1276c4d906cSStefano Zampini ierr = MatMultAdd(A,xt,b,b);CHKERRQ(ierr); 1286c4d906cSStefano Zampini ierr = VecDestroy(&xt);CHKERRQ(ierr); 1293f49a652SStefano Zampini ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 1303f49a652SStefano Zampini ierr = VecGetArray(b,&bb);CHKERRQ(ierr); 1313f49a652SStefano Zampini for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]]; 1323f49a652SStefano Zampini ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 1333f49a652SStefano Zampini ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr); 1343f49a652SStefano Zampini } 1353f49a652SStefano Zampini 136ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr); 1373f49a652SStefano Zampini for (i=0; i<N; i++) { 138ca15aa20SStefano Zampini slot = v + rows[i]*m; 139580bdb30SBarry Smith ierr = PetscArrayzero(slot,r);CHKERRQ(ierr); 1403f49a652SStefano Zampini } 1413f49a652SStefano Zampini for (i=0; i<N; i++) { 142ca15aa20SStefano Zampini slot = v + rows[i]; 1433f49a652SStefano Zampini for (j=0; j<n; j++) { *slot = 0.0; slot += m;} 1443f49a652SStefano Zampini } 1453f49a652SStefano Zampini if (diag != 0.0) { 1463f49a652SStefano Zampini if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 1473f49a652SStefano Zampini for (i=0; i<N; i++) { 148ca15aa20SStefano Zampini slot = v + (m+1)*rows[i]; 1493f49a652SStefano Zampini *slot = diag; 1503f49a652SStefano Zampini } 1513f49a652SStefano Zampini } 152ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr); 1533f49a652SStefano Zampini PetscFunctionReturn(0); 1543f49a652SStefano Zampini } 1553f49a652SStefano Zampini 156abc3b08eSStefano Zampini PetscErrorCode MatPtAPNumeric_SeqDense_SeqDense(Mat A,Mat P,Mat C) 157abc3b08eSStefano Zampini { 158abc3b08eSStefano Zampini Mat_SeqDense *c = (Mat_SeqDense*)(C->data); 159abc3b08eSStefano Zampini PetscErrorCode ierr; 160abc3b08eSStefano Zampini 161abc3b08eSStefano Zampini PetscFunctionBegin; 162ca15aa20SStefano Zampini if (c->ptapwork) { 163ca15aa20SStefano Zampini ierr = (*C->ops->matmultnumeric)(A,P,c->ptapwork);CHKERRQ(ierr); 164ca15aa20SStefano Zampini ierr = (*C->ops->transposematmultnumeric)(P,c->ptapwork,C);CHKERRQ(ierr); 165ca15aa20SStefano Zampini } else { /* first time went trough the basic. Should we add better dispatching for subclasses? */ 166ca15aa20SStefano Zampini ierr = MatPtAP_Basic(A,P,MAT_REUSE_MATRIX,PETSC_DEFAULT,&C);CHKERRQ(ierr); 167ca15aa20SStefano Zampini } 168abc3b08eSStefano Zampini PetscFunctionReturn(0); 169abc3b08eSStefano Zampini } 170abc3b08eSStefano Zampini 171abc3b08eSStefano Zampini PetscErrorCode MatPtAPSymbolic_SeqDense_SeqDense(Mat A,Mat P,PetscReal fill,Mat *C) 172abc3b08eSStefano Zampini { 173abc3b08eSStefano Zampini Mat_SeqDense *c; 174ca15aa20SStefano Zampini PetscBool flg; 175abc3b08eSStefano Zampini PetscErrorCode ierr; 176abc3b08eSStefano Zampini 177abc3b08eSStefano Zampini PetscFunctionBegin; 178ca15aa20SStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)P,((PetscObject)A)->type_name,&flg);CHKERRQ(ierr); 179ca15aa20SStefano Zampini ierr = MatCreate(PetscObjectComm((PetscObject)A),C);CHKERRQ(ierr); 180ca15aa20SStefano Zampini ierr = MatSetSizes(*C,P->cmap->n,P->cmap->n,P->cmap->N,P->cmap->N);CHKERRQ(ierr); 181ca15aa20SStefano Zampini ierr = MatSetType(*C,flg ? ((PetscObject)A)->type_name : MATDENSE);CHKERRQ(ierr); 182ca15aa20SStefano Zampini ierr = MatSeqDenseSetPreallocation(*C,NULL);CHKERRQ(ierr); 183abc3b08eSStefano Zampini c = (Mat_SeqDense*)((*C)->data); 184ca15aa20SStefano Zampini ierr = MatCreate(PetscObjectComm((PetscObject)A),&c->ptapwork);CHKERRQ(ierr); 185ca15aa20SStefano Zampini ierr = MatSetSizes(c->ptapwork,A->rmap->n,P->cmap->n,A->rmap->N,P->cmap->N);CHKERRQ(ierr); 186ca15aa20SStefano Zampini ierr = MatSetType(c->ptapwork,flg ? ((PetscObject)A)->type_name : MATDENSE);CHKERRQ(ierr); 187ca15aa20SStefano Zampini ierr = MatSeqDenseSetPreallocation(c->ptapwork,NULL);CHKERRQ(ierr); 188abc3b08eSStefano Zampini PetscFunctionReturn(0); 189abc3b08eSStefano Zampini } 190abc3b08eSStefano Zampini 191150d2497SBarry Smith PETSC_INTERN PetscErrorCode MatPtAP_SeqDense_SeqDense(Mat A,Mat P,MatReuse reuse,PetscReal fill,Mat *C) 192abc3b08eSStefano Zampini { 193abc3b08eSStefano Zampini PetscErrorCode ierr; 194abc3b08eSStefano Zampini 195abc3b08eSStefano Zampini PetscFunctionBegin; 196abc3b08eSStefano Zampini if (reuse == MAT_INITIAL_MATRIX) { 197abc3b08eSStefano Zampini ierr = MatPtAPSymbolic_SeqDense_SeqDense(A,P,fill,C);CHKERRQ(ierr); 198abc3b08eSStefano Zampini } 199abc3b08eSStefano Zampini ierr = PetscLogEventBegin(MAT_PtAPNumeric,A,P,0,0);CHKERRQ(ierr); 200abc3b08eSStefano Zampini ierr = (*(*C)->ops->ptapnumeric)(A,P,*C);CHKERRQ(ierr); 201abc3b08eSStefano Zampini ierr = PetscLogEventEnd(MAT_PtAPNumeric,A,P,0,0);CHKERRQ(ierr); 202abc3b08eSStefano Zampini PetscFunctionReturn(0); 203abc3b08eSStefano Zampini } 204abc3b08eSStefano Zampini 205cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqAIJ_SeqDense(Mat A,MatType newtype,MatReuse reuse,Mat *newmat) 206b49cda9fSStefano Zampini { 207a13144ffSStefano Zampini Mat B = NULL; 208b49cda9fSStefano Zampini Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 209b49cda9fSStefano Zampini Mat_SeqDense *b; 210b49cda9fSStefano Zampini PetscErrorCode ierr; 211b49cda9fSStefano Zampini PetscInt *ai=a->i,*aj=a->j,m=A->rmap->N,n=A->cmap->N,i; 212b49cda9fSStefano Zampini MatScalar *av=a->a; 213a13144ffSStefano Zampini PetscBool isseqdense; 214b49cda9fSStefano Zampini 215b49cda9fSStefano Zampini PetscFunctionBegin; 216a13144ffSStefano Zampini if (reuse == MAT_REUSE_MATRIX) { 217a13144ffSStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)*newmat,MATSEQDENSE,&isseqdense);CHKERRQ(ierr); 218a32993e3SJed Brown if (!isseqdense) SETERRQ1(PetscObjectComm((PetscObject)*newmat),PETSC_ERR_USER,"Cannot reuse matrix of type %s",((PetscObject)(*newmat))->type_name); 219a13144ffSStefano Zampini } 220a13144ffSStefano Zampini if (reuse != MAT_REUSE_MATRIX) { 221b49cda9fSStefano Zampini ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); 222b49cda9fSStefano Zampini ierr = MatSetSizes(B,m,n,m,n);CHKERRQ(ierr); 223b49cda9fSStefano Zampini ierr = MatSetType(B,MATSEQDENSE);CHKERRQ(ierr); 224b49cda9fSStefano Zampini ierr = MatSeqDenseSetPreallocation(B,NULL);CHKERRQ(ierr); 225b49cda9fSStefano Zampini b = (Mat_SeqDense*)(B->data); 226a13144ffSStefano Zampini } else { 227a13144ffSStefano Zampini b = (Mat_SeqDense*)((*newmat)->data); 228580bdb30SBarry Smith ierr = PetscArrayzero(b->v,m*n);CHKERRQ(ierr); 229a13144ffSStefano Zampini } 230b49cda9fSStefano Zampini for (i=0; i<m; i++) { 231b49cda9fSStefano Zampini PetscInt j; 232b49cda9fSStefano Zampini for (j=0;j<ai[1]-ai[0];j++) { 233b49cda9fSStefano Zampini b->v[*aj*m+i] = *av; 234b49cda9fSStefano Zampini aj++; 235b49cda9fSStefano Zampini av++; 236b49cda9fSStefano Zampini } 237b49cda9fSStefano Zampini ai++; 238b49cda9fSStefano Zampini } 239b49cda9fSStefano Zampini 240511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 241a13144ffSStefano Zampini ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 242a13144ffSStefano Zampini ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 24328be2f97SBarry Smith ierr = MatHeaderReplace(A,&B);CHKERRQ(ierr); 244b49cda9fSStefano Zampini } else { 245a13144ffSStefano Zampini if (B) *newmat = B; 246a13144ffSStefano Zampini ierr = MatAssemblyBegin(*newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 247a13144ffSStefano Zampini ierr = MatAssemblyEnd(*newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 248b49cda9fSStefano Zampini } 249b49cda9fSStefano Zampini PetscFunctionReturn(0); 250b49cda9fSStefano Zampini } 251b49cda9fSStefano Zampini 252cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqDense_SeqAIJ(Mat A, MatType newtype,MatReuse reuse,Mat *newmat) 2536a63e612SBarry Smith { 2546a63e612SBarry Smith Mat B; 2556a63e612SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2566a63e612SBarry Smith PetscErrorCode ierr; 2579399e1b8SMatthew G. Knepley PetscInt i, j; 2589399e1b8SMatthew G. Knepley PetscInt *rows, *nnz; 2599399e1b8SMatthew G. Knepley MatScalar *aa = a->v, *vals; 2606a63e612SBarry Smith 2616a63e612SBarry Smith PetscFunctionBegin; 262ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); 2636a63e612SBarry Smith ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 2646a63e612SBarry Smith ierr = MatSetType(B,MATSEQAIJ);CHKERRQ(ierr); 2659399e1b8SMatthew G. Knepley ierr = PetscCalloc3(A->rmap->n,&rows,A->rmap->n,&nnz,A->rmap->n,&vals);CHKERRQ(ierr); 2669399e1b8SMatthew G. Knepley for (j=0; j<A->cmap->n; j++) { 2679399e1b8SMatthew G. Knepley for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) ++nnz[i]; 2686a63e612SBarry Smith aa += a->lda; 2696a63e612SBarry Smith } 2709399e1b8SMatthew G. Knepley ierr = MatSeqAIJSetPreallocation(B,PETSC_DETERMINE,nnz);CHKERRQ(ierr); 2719399e1b8SMatthew G. Knepley aa = a->v; 2729399e1b8SMatthew G. Knepley for (j=0; j<A->cmap->n; j++) { 2739399e1b8SMatthew G. Knepley PetscInt numRows = 0; 2749399e1b8SMatthew G. Knepley for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) {rows[numRows] = i; vals[numRows++] = aa[i];} 2759399e1b8SMatthew G. Knepley ierr = MatSetValues(B,numRows,rows,1,&j,vals,INSERT_VALUES);CHKERRQ(ierr); 2769399e1b8SMatthew G. Knepley aa += a->lda; 2779399e1b8SMatthew G. Knepley } 2789399e1b8SMatthew G. Knepley ierr = PetscFree3(rows,nnz,vals);CHKERRQ(ierr); 2796a63e612SBarry Smith ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2806a63e612SBarry Smith ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2816a63e612SBarry Smith 282511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 28328be2f97SBarry Smith ierr = MatHeaderReplace(A,&B);CHKERRQ(ierr); 2846a63e612SBarry Smith } else { 2856a63e612SBarry Smith *newmat = B; 2866a63e612SBarry Smith } 2876a63e612SBarry Smith PetscFunctionReturn(0); 2886a63e612SBarry Smith } 2896a63e612SBarry Smith 290ca15aa20SStefano Zampini PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str) 2911987afe7SBarry Smith { 2921987afe7SBarry Smith Mat_SeqDense *x = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data; 293ca15aa20SStefano Zampini const PetscScalar *xv; 294ca15aa20SStefano Zampini PetscScalar *yv; 2950805154bSBarry Smith PetscBLASInt N,m,ldax,lday,one = 1; 296efee365bSSatish Balay PetscErrorCode ierr; 2973a40ed3dSBarry Smith 2983a40ed3dSBarry Smith PetscFunctionBegin; 299ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(X,&xv);CHKERRQ(ierr); 300ca15aa20SStefano Zampini ierr = MatDenseGetArray(Y,&yv);CHKERRQ(ierr); 301c5df96a5SBarry Smith ierr = PetscBLASIntCast(X->rmap->n*X->cmap->n,&N);CHKERRQ(ierr); 302c5df96a5SBarry Smith ierr = PetscBLASIntCast(X->rmap->n,&m);CHKERRQ(ierr); 303c5df96a5SBarry Smith ierr = PetscBLASIntCast(x->lda,&ldax);CHKERRQ(ierr); 304c5df96a5SBarry Smith ierr = PetscBLASIntCast(y->lda,&lday);CHKERRQ(ierr); 305a5ce6ee0Svictorle if (ldax>m || lday>m) { 306ca15aa20SStefano Zampini PetscInt j; 307ca15aa20SStefano Zampini 308d0f46423SBarry Smith for (j=0; j<X->cmap->n; j++) { 309ca15aa20SStefano Zampini PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&m,&alpha,xv+j*ldax,&one,yv+j*lday,&one)); 310a5ce6ee0Svictorle } 311a5ce6ee0Svictorle } else { 312ca15aa20SStefano Zampini PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&N,&alpha,xv,&one,yv,&one)); 313a5ce6ee0Svictorle } 314ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(X,&xv);CHKERRQ(ierr); 315ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(Y,&yv);CHKERRQ(ierr); 3160450473dSBarry Smith ierr = PetscLogFlops(PetscMax(2*N-1,0));CHKERRQ(ierr); 3173a40ed3dSBarry Smith PetscFunctionReturn(0); 3181987afe7SBarry Smith } 3191987afe7SBarry Smith 320e0877f53SBarry Smith static PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info) 321289bc588SBarry Smith { 322ca15aa20SStefano Zampini PetscLogDouble N = A->rmap->n*A->cmap->n; 3233a40ed3dSBarry Smith 3243a40ed3dSBarry Smith PetscFunctionBegin; 3254e220ebcSLois Curfman McInnes info->block_size = 1.0; 326ca15aa20SStefano Zampini info->nz_allocated = N; 327ca15aa20SStefano Zampini info->nz_used = N; 328ca15aa20SStefano Zampini info->nz_unneeded = 0; 329ca15aa20SStefano Zampini info->assemblies = A->num_ass; 3304e220ebcSLois Curfman McInnes info->mallocs = 0; 3317adad957SLisandro Dalcin info->memory = ((PetscObject)A)->mem; 3324e220ebcSLois Curfman McInnes info->fill_ratio_given = 0; 3334e220ebcSLois Curfman McInnes info->fill_ratio_needed = 0; 3344e220ebcSLois Curfman McInnes info->factor_mallocs = 0; 3353a40ed3dSBarry Smith PetscFunctionReturn(0); 336289bc588SBarry Smith } 337289bc588SBarry Smith 338e0877f53SBarry Smith static PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha) 33980cd9d93SLois Curfman McInnes { 340273d9f13SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 341ca15aa20SStefano Zampini PetscScalar *v; 342efee365bSSatish Balay PetscErrorCode ierr; 343c5df96a5SBarry Smith PetscBLASInt one = 1,j,nz,lda; 34480cd9d93SLois Curfman McInnes 3453a40ed3dSBarry Smith PetscFunctionBegin; 346ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr); 347c5df96a5SBarry Smith ierr = PetscBLASIntCast(a->lda,&lda);CHKERRQ(ierr); 348d0f46423SBarry Smith if (lda>A->rmap->n) { 349c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&nz);CHKERRQ(ierr); 350d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 351ca15aa20SStefano Zampini PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&alpha,v+j*lda,&one)); 352a5ce6ee0Svictorle } 353a5ce6ee0Svictorle } else { 354c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n*A->cmap->n,&nz);CHKERRQ(ierr); 355ca15aa20SStefano Zampini PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&alpha,v,&one)); 356a5ce6ee0Svictorle } 357efee365bSSatish Balay ierr = PetscLogFlops(nz);CHKERRQ(ierr); 358ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr); 3593a40ed3dSBarry Smith PetscFunctionReturn(0); 36080cd9d93SLois Curfman McInnes } 36180cd9d93SLois Curfman McInnes 362e0877f53SBarry Smith static PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscBool *fl) 3631cbb95d3SBarry Smith { 3641cbb95d3SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 365ca15aa20SStefano Zampini PetscInt i,j,m = A->rmap->n,N = a->lda; 366ca15aa20SStefano Zampini const PetscScalar *v; 367ca15aa20SStefano Zampini PetscErrorCode ierr; 3681cbb95d3SBarry Smith 3691cbb95d3SBarry Smith PetscFunctionBegin; 3701cbb95d3SBarry Smith *fl = PETSC_FALSE; 371d0f46423SBarry Smith if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0); 372ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&v);CHKERRQ(ierr); 3731cbb95d3SBarry Smith for (i=0; i<m; i++) { 374ca15aa20SStefano Zampini for (j=i; j<m; j++) { 3751cbb95d3SBarry Smith if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) PetscFunctionReturn(0); 3761cbb95d3SBarry Smith } 3771cbb95d3SBarry Smith } 378ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&v);CHKERRQ(ierr); 3791cbb95d3SBarry Smith *fl = PETSC_TRUE; 3801cbb95d3SBarry Smith PetscFunctionReturn(0); 3811cbb95d3SBarry Smith } 3821cbb95d3SBarry Smith 383ca15aa20SStefano Zampini PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat newi,Mat A,MatDuplicateOption cpvalues) 384b24902e0SBarry Smith { 385ca15aa20SStefano Zampini Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 386b24902e0SBarry Smith PetscErrorCode ierr; 387b24902e0SBarry Smith PetscInt lda = (PetscInt)mat->lda,j,m; 388b24902e0SBarry Smith 389b24902e0SBarry Smith PetscFunctionBegin; 390aa5ea44dSBarry Smith ierr = PetscLayoutReference(A->rmap,&newi->rmap);CHKERRQ(ierr); 391aa5ea44dSBarry Smith ierr = PetscLayoutReference(A->cmap,&newi->cmap);CHKERRQ(ierr); 3920298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newi,NULL);CHKERRQ(ierr); 393b24902e0SBarry Smith if (cpvalues == MAT_COPY_VALUES) { 394ca15aa20SStefano Zampini const PetscScalar *av; 395ca15aa20SStefano Zampini PetscScalar *v; 396ca15aa20SStefano Zampini 397ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&av);CHKERRQ(ierr); 398ca15aa20SStefano Zampini ierr = MatDenseGetArray(newi,&v);CHKERRQ(ierr); 399d0f46423SBarry Smith if (lda>A->rmap->n) { 400d0f46423SBarry Smith m = A->rmap->n; 401d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 402ca15aa20SStefano Zampini ierr = PetscArraycpy(v+j*m,av+j*lda,m);CHKERRQ(ierr); 403b24902e0SBarry Smith } 404b24902e0SBarry Smith } else { 405ca15aa20SStefano Zampini ierr = PetscArraycpy(v,av,A->rmap->n*A->cmap->n);CHKERRQ(ierr); 406b24902e0SBarry Smith } 407ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(newi,&v);CHKERRQ(ierr); 408ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&av);CHKERRQ(ierr); 409b24902e0SBarry Smith } 410b24902e0SBarry Smith PetscFunctionReturn(0); 411b24902e0SBarry Smith } 412b24902e0SBarry Smith 413ca15aa20SStefano Zampini PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat) 41402cad45dSBarry Smith { 4156849ba73SBarry Smith PetscErrorCode ierr; 41602cad45dSBarry Smith 4173a40ed3dSBarry Smith PetscFunctionBegin; 418ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),newmat);CHKERRQ(ierr); 419d0f46423SBarry Smith ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 4205c9eb25fSBarry Smith ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 421719d5645SBarry Smith ierr = MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues);CHKERRQ(ierr); 422b24902e0SBarry Smith PetscFunctionReturn(0); 423b24902e0SBarry Smith } 424b24902e0SBarry Smith 425e0877f53SBarry Smith static PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 426289bc588SBarry Smith { 4274482741eSBarry Smith MatFactorInfo info; 428a093e273SMatthew Knepley PetscErrorCode ierr; 4293a40ed3dSBarry Smith 4303a40ed3dSBarry Smith PetscFunctionBegin; 431c3ef05f6SHong Zhang ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 432ca15aa20SStefano Zampini ierr = (*fact->ops->lufactor)(fact,0,0,&info);CHKERRQ(ierr); 4333a40ed3dSBarry Smith PetscFunctionReturn(0); 434289bc588SBarry Smith } 4356ee01492SSatish Balay 436e0877f53SBarry Smith static PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy) 437289bc588SBarry Smith { 438c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 4396849ba73SBarry Smith PetscErrorCode ierr; 440f1ceaac6SMatthew G. Knepley const PetscScalar *x; 441f1ceaac6SMatthew G. Knepley PetscScalar *y; 442c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 44367e560aaSBarry Smith 4443a40ed3dSBarry Smith PetscFunctionBegin; 445c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 446f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 4471ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 448580bdb30SBarry Smith ierr = PetscArraycpy(y,x,A->rmap->n);CHKERRQ(ierr); 449d5f3da31SBarry Smith if (A->factortype == MAT_FACTOR_LU) { 450ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 451e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 452ae7cfcebSSatish Balay #else 45300121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 4548b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 45500121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 456e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 457ae7cfcebSSatish Balay #endif 458d5f3da31SBarry Smith } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 459ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 460e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 461ae7cfcebSSatish Balay #else 462a49dc2a2SStefano Zampini if (A->spd) { 46300121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 4648b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 46500121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 466e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 467a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX) 468a49dc2a2SStefano Zampini } else if (A->hermitian) { 46900121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 470a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKhetrs",LAPACKhetrs_("L",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 47100121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 472a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"HETRS Bad solve"); 473a49dc2a2SStefano Zampini #endif 474a49dc2a2SStefano Zampini } else { /* symmetric case */ 47500121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 476a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrs",LAPACKsytrs_("L",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 47700121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 478a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"SYTRS Bad solve"); 479a49dc2a2SStefano Zampini } 480ae7cfcebSSatish Balay #endif 4812205254eSKarl Rupp } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 482f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 4831ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 484dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 4853a40ed3dSBarry Smith PetscFunctionReturn(0); 486289bc588SBarry Smith } 4876ee01492SSatish Balay 488e0877f53SBarry Smith static PetscErrorCode MatMatSolve_SeqDense(Mat A,Mat B,Mat X) 48985e2c93fSHong Zhang { 49085e2c93fSHong Zhang Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 49185e2c93fSHong Zhang PetscErrorCode ierr; 4921683a169SBarry Smith const PetscScalar *b; 4931683a169SBarry Smith PetscScalar *x; 494efb80c78SLisandro Dalcin PetscInt n; 495783b601eSJed Brown PetscBLASInt nrhs,info,m; 49685e2c93fSHong Zhang 49785e2c93fSHong Zhang PetscFunctionBegin; 498c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 4990298fd71SBarry Smith ierr = MatGetSize(B,NULL,&n);CHKERRQ(ierr); 500c5df96a5SBarry Smith ierr = PetscBLASIntCast(n,&nrhs);CHKERRQ(ierr); 5011683a169SBarry Smith ierr = MatDenseGetArrayRead(B,&b);CHKERRQ(ierr); 5028c778c55SBarry Smith ierr = MatDenseGetArray(X,&x);CHKERRQ(ierr); 50385e2c93fSHong Zhang 504580bdb30SBarry Smith ierr = PetscArraycpy(x,b,m*nrhs);CHKERRQ(ierr); 50585e2c93fSHong Zhang 50685e2c93fSHong Zhang if (A->factortype == MAT_FACTOR_LU) { 50785e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_GETRS) 50885e2c93fSHong Zhang SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 50985e2c93fSHong Zhang #else 51000121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 5118b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info)); 51200121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 51385e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 51485e2c93fSHong Zhang #endif 51585e2c93fSHong Zhang } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 51685e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_POTRS) 51785e2c93fSHong Zhang SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 51885e2c93fSHong Zhang #else 519a49dc2a2SStefano Zampini if (A->spd) { 52000121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 5218b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info)); 52200121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 52385e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 524a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX) 525a49dc2a2SStefano Zampini } else if (A->hermitian) { 52600121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 527a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKhetrs",LAPACKhetrs_("L",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info)); 52800121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 529a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"HETRS Bad solve"); 530a49dc2a2SStefano Zampini #endif 531a49dc2a2SStefano Zampini } else { /* symmetric case */ 53200121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 533a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrs",LAPACKsytrs_("L",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info)); 53400121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 535a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"SYTRS Bad solve"); 536a49dc2a2SStefano Zampini } 53785e2c93fSHong Zhang #endif 5382205254eSKarl Rupp } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 53985e2c93fSHong Zhang 5401683a169SBarry Smith ierr = MatDenseRestoreArrayRead(B,&b);CHKERRQ(ierr); 5418c778c55SBarry Smith ierr = MatDenseRestoreArray(X,&x);CHKERRQ(ierr); 54285e2c93fSHong Zhang ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr); 54385e2c93fSHong Zhang PetscFunctionReturn(0); 54485e2c93fSHong Zhang } 54585e2c93fSHong Zhang 54600121966SStefano Zampini static PetscErrorCode MatConjugate_SeqDense(Mat); 54700121966SStefano Zampini 548e0877f53SBarry Smith static PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy) 549da3a660dSBarry Smith { 550c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 551dfbe8321SBarry Smith PetscErrorCode ierr; 552f1ceaac6SMatthew G. Knepley const PetscScalar *x; 553f1ceaac6SMatthew G. Knepley PetscScalar *y; 554c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 55567e560aaSBarry Smith 5563a40ed3dSBarry Smith PetscFunctionBegin; 557c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 558f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 5591ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 560580bdb30SBarry Smith ierr = PetscArraycpy(y,x,A->rmap->n);CHKERRQ(ierr); 5618208b9aeSStefano Zampini if (A->factortype == MAT_FACTOR_LU) { 562ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 563e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 564ae7cfcebSSatish Balay #else 56500121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 5668b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 56700121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 568e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve"); 569ae7cfcebSSatish Balay #endif 5708208b9aeSStefano Zampini } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 571ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 572e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 573ae7cfcebSSatish Balay #else 574a49dc2a2SStefano Zampini if (A->spd) { 57500121966SStefano Zampini #if defined(PETSC_USE_COMPLEX) 57600121966SStefano Zampini ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr); 57700121966SStefano Zampini #endif 57800121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 5798b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 58000121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 58100121966SStefano Zampini #if defined(PETSC_USE_COMPLEX) 58200121966SStefano Zampini ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr); 58300121966SStefano Zampini #endif 584a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 585a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX) 586a49dc2a2SStefano Zampini } else if (A->hermitian) { 58700121966SStefano Zampini ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr); 58800121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 58900121966SStefano Zampini PetscStackCallBLAS("LAPACKhetrs",LAPACKhetrs_("L",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 59000121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 59100121966SStefano Zampini ierr = MatConjugate_SeqDense(A);CHKERRQ(ierr); 592ae7cfcebSSatish Balay #endif 593a49dc2a2SStefano Zampini } else { /* symmetric case */ 59400121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 595a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrs",LAPACKsytrs_("L",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 59600121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 597a49dc2a2SStefano Zampini if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"SYTRS Bad solve"); 598da3a660dSBarry Smith } 599a49dc2a2SStefano Zampini #endif 600a49dc2a2SStefano Zampini } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 601f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 6021ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 603dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 6043a40ed3dSBarry Smith PetscFunctionReturn(0); 605da3a660dSBarry Smith } 6066ee01492SSatish Balay 607db4efbfdSBarry Smith /* ---------------------------------------------------------------*/ 608db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots, 609db4efbfdSBarry Smith rather than put it in the Mat->row slot.*/ 610ca15aa20SStefano Zampini PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo) 611db4efbfdSBarry Smith { 612db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF) 613db4efbfdSBarry Smith PetscFunctionBegin; 614e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable."); 615db4efbfdSBarry Smith #else 616db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 617db4efbfdSBarry Smith PetscErrorCode ierr; 618db4efbfdSBarry Smith PetscBLASInt n,m,info; 619db4efbfdSBarry Smith 620db4efbfdSBarry Smith PetscFunctionBegin; 621c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 622c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 623db4efbfdSBarry Smith if (!mat->pivots) { 6248208b9aeSStefano Zampini ierr = PetscMalloc1(A->rmap->n,&mat->pivots);CHKERRQ(ierr); 6253bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr); 626db4efbfdSBarry Smith } 627db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 6288e57ea43SSatish Balay ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 6298b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrf",LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info)); 6308e57ea43SSatish Balay ierr = PetscFPTrapPop();CHKERRQ(ierr); 6318e57ea43SSatish Balay 632e32f2f54SBarry Smith if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization"); 633e32f2f54SBarry Smith if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization"); 6348208b9aeSStefano Zampini 635db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 6368208b9aeSStefano Zampini A->ops->matsolve = MatMatSolve_SeqDense; 637db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 638d5f3da31SBarry Smith A->factortype = MAT_FACTOR_LU; 639db4efbfdSBarry Smith 640f6224b95SHong Zhang ierr = PetscFree(A->solvertype);CHKERRQ(ierr); 641f6224b95SHong Zhang ierr = PetscStrallocpy(MATSOLVERPETSC,&A->solvertype);CHKERRQ(ierr); 642f6224b95SHong Zhang 643dc0b31edSSatish Balay ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr); 644db4efbfdSBarry Smith #endif 645db4efbfdSBarry Smith PetscFunctionReturn(0); 646db4efbfdSBarry Smith } 647db4efbfdSBarry Smith 648a49dc2a2SStefano Zampini /* Cholesky as L*L^T or L*D*L^T and the symmetric/hermitian complex variants */ 649ca15aa20SStefano Zampini PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo) 650db4efbfdSBarry Smith { 651db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF) 652db4efbfdSBarry Smith PetscFunctionBegin; 653e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable."); 654db4efbfdSBarry Smith #else 655db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 656db4efbfdSBarry Smith PetscErrorCode ierr; 657c5df96a5SBarry Smith PetscBLASInt info,n; 658db4efbfdSBarry Smith 659db4efbfdSBarry Smith PetscFunctionBegin; 660c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 661db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 662a49dc2a2SStefano Zampini if (A->spd) { 66300121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 6648b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrf",LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info)); 66500121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 666a49dc2a2SStefano Zampini #if defined(PETSC_USE_COMPLEX) 667a49dc2a2SStefano Zampini } else if (A->hermitian) { 668a49dc2a2SStefano Zampini if (!mat->pivots) { 669a49dc2a2SStefano Zampini ierr = PetscMalloc1(A->rmap->n,&mat->pivots);CHKERRQ(ierr); 670a49dc2a2SStefano Zampini ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr); 671a49dc2a2SStefano Zampini } 672a49dc2a2SStefano Zampini if (!mat->fwork) { 673a49dc2a2SStefano Zampini PetscScalar dummy; 674a49dc2a2SStefano Zampini 675a49dc2a2SStefano Zampini mat->lfwork = -1; 67600121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 677a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKhetrf",LAPACKhetrf_("L",&n,mat->v,&mat->lda,mat->pivots,&dummy,&mat->lfwork,&info)); 67800121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 679a49dc2a2SStefano Zampini mat->lfwork = (PetscInt)PetscRealPart(dummy); 680a49dc2a2SStefano Zampini ierr = PetscMalloc1(mat->lfwork,&mat->fwork);CHKERRQ(ierr); 681a49dc2a2SStefano Zampini ierr = PetscLogObjectMemory((PetscObject)A,mat->lfwork*sizeof(PetscBLASInt));CHKERRQ(ierr); 682a49dc2a2SStefano Zampini } 68300121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 684a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKhetrf",LAPACKhetrf_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&mat->lfwork,&info)); 68500121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 686a49dc2a2SStefano Zampini #endif 687a49dc2a2SStefano Zampini } else { /* symmetric case */ 688a49dc2a2SStefano Zampini if (!mat->pivots) { 689a49dc2a2SStefano Zampini ierr = PetscMalloc1(A->rmap->n,&mat->pivots);CHKERRQ(ierr); 690a49dc2a2SStefano Zampini ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr); 691a49dc2a2SStefano Zampini } 692a49dc2a2SStefano Zampini if (!mat->fwork) { 693a49dc2a2SStefano Zampini PetscScalar dummy; 694a49dc2a2SStefano Zampini 695a49dc2a2SStefano Zampini mat->lfwork = -1; 69600121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 697a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrf",LAPACKsytrf_("L",&n,mat->v,&mat->lda,mat->pivots,&dummy,&mat->lfwork,&info)); 69800121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 699a49dc2a2SStefano Zampini mat->lfwork = (PetscInt)PetscRealPart(dummy); 700a49dc2a2SStefano Zampini ierr = PetscMalloc1(mat->lfwork,&mat->fwork);CHKERRQ(ierr); 701a49dc2a2SStefano Zampini ierr = PetscLogObjectMemory((PetscObject)A,mat->lfwork*sizeof(PetscBLASInt));CHKERRQ(ierr); 702a49dc2a2SStefano Zampini } 70300121966SStefano Zampini ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 704a49dc2a2SStefano Zampini PetscStackCallBLAS("LAPACKsytrf",LAPACKsytrf_("L",&n,mat->v,&mat->lda,mat->pivots,mat->fwork,&mat->lfwork,&info)); 70500121966SStefano Zampini ierr = PetscFPTrapPop();CHKERRQ(ierr); 706a49dc2a2SStefano Zampini } 707e32f2f54SBarry Smith if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1); 7088208b9aeSStefano Zampini 709db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 7108208b9aeSStefano Zampini A->ops->matsolve = MatMatSolve_SeqDense; 711db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 712d5f3da31SBarry Smith A->factortype = MAT_FACTOR_CHOLESKY; 7132205254eSKarl Rupp 714f6224b95SHong Zhang ierr = PetscFree(A->solvertype);CHKERRQ(ierr); 715f6224b95SHong Zhang ierr = PetscStrallocpy(MATSOLVERPETSC,&A->solvertype);CHKERRQ(ierr); 716f6224b95SHong Zhang 717eb3f19e4SBarry Smith ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr); 718db4efbfdSBarry Smith #endif 719db4efbfdSBarry Smith PetscFunctionReturn(0); 720db4efbfdSBarry Smith } 721db4efbfdSBarry Smith 722db4efbfdSBarry Smith 7230481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 724db4efbfdSBarry Smith { 725db4efbfdSBarry Smith PetscErrorCode ierr; 726db4efbfdSBarry Smith MatFactorInfo info; 727db4efbfdSBarry Smith 728db4efbfdSBarry Smith PetscFunctionBegin; 729db4efbfdSBarry Smith info.fill = 1.0; 7302205254eSKarl Rupp 731c3ef05f6SHong Zhang ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 732ca15aa20SStefano Zampini ierr = (*fact->ops->choleskyfactor)(fact,0,&info);CHKERRQ(ierr); 733db4efbfdSBarry Smith PetscFunctionReturn(0); 734db4efbfdSBarry Smith } 735db4efbfdSBarry Smith 736ca15aa20SStefano Zampini PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info) 737db4efbfdSBarry Smith { 738db4efbfdSBarry Smith PetscFunctionBegin; 739c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 7401bbcc794SSatish Balay fact->preallocated = PETSC_TRUE; 741719d5645SBarry Smith fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense; 742bd443b22SStefano Zampini fact->ops->solve = MatSolve_SeqDense; 743bd443b22SStefano Zampini fact->ops->matsolve = MatMatSolve_SeqDense; 744bd443b22SStefano Zampini fact->ops->solvetranspose = MatSolveTranspose_SeqDense; 745db4efbfdSBarry Smith PetscFunctionReturn(0); 746db4efbfdSBarry Smith } 747db4efbfdSBarry Smith 748ca15aa20SStefano Zampini PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info) 749db4efbfdSBarry Smith { 750db4efbfdSBarry Smith PetscFunctionBegin; 751b66fe19dSMatthew G Knepley fact->preallocated = PETSC_TRUE; 752c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 753719d5645SBarry Smith fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense; 754bd443b22SStefano Zampini fact->ops->solve = MatSolve_SeqDense; 755bd443b22SStefano Zampini fact->ops->matsolve = MatMatSolve_SeqDense; 756bd443b22SStefano Zampini fact->ops->solvetranspose = MatSolveTranspose_SeqDense; 757db4efbfdSBarry Smith PetscFunctionReturn(0); 758db4efbfdSBarry Smith } 759db4efbfdSBarry Smith 760ca15aa20SStefano Zampini /* uses LAPACK */ 761cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact) 762db4efbfdSBarry Smith { 763db4efbfdSBarry Smith PetscErrorCode ierr; 764db4efbfdSBarry Smith 765db4efbfdSBarry Smith PetscFunctionBegin; 766ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),fact);CHKERRQ(ierr); 767db4efbfdSBarry Smith ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 768ca15aa20SStefano Zampini ierr = MatSetType(*fact,MATDENSE);CHKERRQ(ierr); 769db4efbfdSBarry Smith if (ftype == MAT_FACTOR_LU) { 770db4efbfdSBarry Smith (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense; 771db4efbfdSBarry Smith } else { 772db4efbfdSBarry Smith (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense; 773db4efbfdSBarry Smith } 774d5f3da31SBarry Smith (*fact)->factortype = ftype; 77500c67f3bSHong Zhang 77600c67f3bSHong Zhang ierr = PetscFree((*fact)->solvertype);CHKERRQ(ierr); 77700c67f3bSHong Zhang ierr = PetscStrallocpy(MATSOLVERPETSC,&(*fact)->solvertype);CHKERRQ(ierr); 778db4efbfdSBarry Smith PetscFunctionReturn(0); 779db4efbfdSBarry Smith } 780db4efbfdSBarry Smith 781289bc588SBarry Smith /* ------------------------------------------------------------------*/ 782e0877f53SBarry Smith static PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx) 783289bc588SBarry Smith { 784c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 785d9ca1df4SBarry Smith PetscScalar *x,*v = mat->v,zero = 0.0,xt; 786d9ca1df4SBarry Smith const PetscScalar *b; 787dfbe8321SBarry Smith PetscErrorCode ierr; 788d0f46423SBarry Smith PetscInt m = A->rmap->n,i; 789c5df96a5SBarry Smith PetscBLASInt o = 1,bm; 790289bc588SBarry Smith 7913a40ed3dSBarry Smith PetscFunctionBegin; 792ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA) 793ca15aa20SStefano Zampini if (A->valid_GPU_matrix == PETSC_OFFLOAD_GPU) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Not implemented"); 794ca15aa20SStefano Zampini #endif 795422a814eSBarry Smith if (shift == -1) shift = 0.0; /* negative shift indicates do not error on zero diagonal; this code never zeros on zero diagonal */ 796c5df96a5SBarry Smith ierr = PetscBLASIntCast(m,&bm);CHKERRQ(ierr); 797289bc588SBarry Smith if (flag & SOR_ZERO_INITIAL_GUESS) { 7983bffc371SBarry Smith /* this is a hack fix, should have another version without the second BLASdotu */ 7992dcb1b2aSMatthew Knepley ierr = VecSet(xx,zero);CHKERRQ(ierr); 800289bc588SBarry Smith } 8011ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 802d9ca1df4SBarry Smith ierr = VecGetArrayRead(bb,&b);CHKERRQ(ierr); 803b965ef7fSBarry Smith its = its*lits; 804e32f2f54SBarry 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); 805289bc588SBarry Smith while (its--) { 806fccaa45eSBarry Smith if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) { 807289bc588SBarry Smith for (i=0; i<m; i++) { 8083bffc371SBarry Smith PetscStackCallBLAS("BLASdotu",xt = b[i] - BLASdotu_(&bm,v+i,&bm,x,&o)); 80955a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 810289bc588SBarry Smith } 811289bc588SBarry Smith } 812fccaa45eSBarry Smith if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) { 813289bc588SBarry Smith for (i=m-1; i>=0; i--) { 8143bffc371SBarry Smith PetscStackCallBLAS("BLASdotu",xt = b[i] - BLASdotu_(&bm,v+i,&bm,x,&o)); 81555a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 816289bc588SBarry Smith } 817289bc588SBarry Smith } 818289bc588SBarry Smith } 819d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(bb,&b);CHKERRQ(ierr); 8201ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 8213a40ed3dSBarry Smith PetscFunctionReturn(0); 822289bc588SBarry Smith } 823289bc588SBarry Smith 824289bc588SBarry Smith /* -----------------------------------------------------------------*/ 825ca15aa20SStefano Zampini PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy) 826289bc588SBarry Smith { 827c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 828d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 829d9ca1df4SBarry Smith PetscScalar *y; 830dfbe8321SBarry Smith PetscErrorCode ierr; 8310805154bSBarry Smith PetscBLASInt m, n,_One=1; 832ea709b57SSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 8333a40ed3dSBarry Smith 8343a40ed3dSBarry Smith PetscFunctionBegin; 835c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 836c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 837d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 8382bf066beSStefano Zampini ierr = VecGetArrayWrite(yy,&y);CHKERRQ(ierr); 8395ac36cfcSBarry Smith if (!A->rmap->n || !A->cmap->n) { 8405ac36cfcSBarry Smith PetscBLASInt i; 8415ac36cfcSBarry Smith for (i=0; i<n; i++) y[i] = 0.0; 8425ac36cfcSBarry Smith } else { 8438b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One)); 8445ac36cfcSBarry Smith ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 8455ac36cfcSBarry Smith } 846d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 8472bf066beSStefano Zampini ierr = VecRestoreArrayWrite(yy,&y);CHKERRQ(ierr); 8483a40ed3dSBarry Smith PetscFunctionReturn(0); 849289bc588SBarry Smith } 850800995b7SMatthew Knepley 851ca15aa20SStefano Zampini PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy) 852289bc588SBarry Smith { 853c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 854d9ca1df4SBarry Smith PetscScalar *y,_DOne=1.0,_DZero=0.0; 855dfbe8321SBarry Smith PetscErrorCode ierr; 8560805154bSBarry Smith PetscBLASInt m, n, _One=1; 857d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 8583a40ed3dSBarry Smith 8593a40ed3dSBarry Smith PetscFunctionBegin; 860c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 861c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 862d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 8632bf066beSStefano Zampini ierr = VecGetArrayWrite(yy,&y);CHKERRQ(ierr); 8645ac36cfcSBarry Smith if (!A->rmap->n || !A->cmap->n) { 8655ac36cfcSBarry Smith PetscBLASInt i; 8665ac36cfcSBarry Smith for (i=0; i<m; i++) y[i] = 0.0; 8675ac36cfcSBarry Smith } else { 8688b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One)); 8695ac36cfcSBarry Smith ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr); 8705ac36cfcSBarry Smith } 871d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 8722bf066beSStefano Zampini ierr = VecRestoreArrayWrite(yy,&y);CHKERRQ(ierr); 8733a40ed3dSBarry Smith PetscFunctionReturn(0); 874289bc588SBarry Smith } 8756ee01492SSatish Balay 876ca15aa20SStefano Zampini PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 877289bc588SBarry Smith { 878c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 879d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 880d9ca1df4SBarry Smith PetscScalar *y,_DOne=1.0; 881dfbe8321SBarry Smith PetscErrorCode ierr; 8820805154bSBarry Smith PetscBLASInt m, n, _One=1; 8833a40ed3dSBarry Smith 8843a40ed3dSBarry Smith PetscFunctionBegin; 885c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 886c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 887d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 888600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 889d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 8901ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 8918b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One)); 892d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 8931ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 894dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 8953a40ed3dSBarry Smith PetscFunctionReturn(0); 896289bc588SBarry Smith } 8976ee01492SSatish Balay 898ca15aa20SStefano Zampini PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 899289bc588SBarry Smith { 900c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 901d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 902d9ca1df4SBarry Smith PetscScalar *y; 903dfbe8321SBarry Smith PetscErrorCode ierr; 9040805154bSBarry Smith PetscBLASInt m, n, _One=1; 90587828ca2SBarry Smith PetscScalar _DOne=1.0; 9063a40ed3dSBarry Smith 9073a40ed3dSBarry Smith PetscFunctionBegin; 908c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 909c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 910d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 911600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 912d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 9131ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 9148b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One)); 915d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 9161ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 917dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 9183a40ed3dSBarry Smith PetscFunctionReturn(0); 919289bc588SBarry Smith } 920289bc588SBarry Smith 921289bc588SBarry Smith /* -----------------------------------------------------------------*/ 922e0877f53SBarry Smith static PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 923289bc588SBarry Smith { 924c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 9256849ba73SBarry Smith PetscErrorCode ierr; 92613f74950SBarry Smith PetscInt i; 92767e560aaSBarry Smith 9283a40ed3dSBarry Smith PetscFunctionBegin; 929d0f46423SBarry Smith *ncols = A->cmap->n; 930289bc588SBarry Smith if (cols) { 931854ce69bSBarry Smith ierr = PetscMalloc1(A->cmap->n+1,cols);CHKERRQ(ierr); 932d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) (*cols)[i] = i; 933289bc588SBarry Smith } 934289bc588SBarry Smith if (vals) { 935ca15aa20SStefano Zampini const PetscScalar *v; 936ca15aa20SStefano Zampini 937ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&v);CHKERRQ(ierr); 938854ce69bSBarry Smith ierr = PetscMalloc1(A->cmap->n+1,vals);CHKERRQ(ierr); 939ca15aa20SStefano Zampini v += row; 940d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;} 941ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&v);CHKERRQ(ierr); 942289bc588SBarry Smith } 9433a40ed3dSBarry Smith PetscFunctionReturn(0); 944289bc588SBarry Smith } 9456ee01492SSatish Balay 946e0877f53SBarry Smith static PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 947289bc588SBarry Smith { 948dfbe8321SBarry Smith PetscErrorCode ierr; 9496e111a19SKarl Rupp 950606d414cSSatish Balay PetscFunctionBegin; 951606d414cSSatish Balay if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);} 952606d414cSSatish Balay if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); } 9533a40ed3dSBarry Smith PetscFunctionReturn(0); 954289bc588SBarry Smith } 955289bc588SBarry Smith /* ----------------------------------------------------------------*/ 956e0877f53SBarry Smith static PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv) 957289bc588SBarry Smith { 958c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 959ca15aa20SStefano Zampini PetscScalar *av; 96013f74950SBarry Smith PetscInt i,j,idx=0; 961ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA) 962ca15aa20SStefano Zampini PetscOffloadFlag oldf; 963ca15aa20SStefano Zampini #endif 964ca15aa20SStefano Zampini PetscErrorCode ierr; 965d6dfbf8fSBarry Smith 9663a40ed3dSBarry Smith PetscFunctionBegin; 967ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&av);CHKERRQ(ierr); 968289bc588SBarry Smith if (!mat->roworiented) { 969dbb450caSBarry Smith if (addv == INSERT_VALUES) { 970289bc588SBarry Smith for (j=0; j<n; j++) { 971cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 9722515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 973e32f2f54SBarry 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); 97458804f6dSBarry Smith #endif 975289bc588SBarry Smith for (i=0; i<m; i++) { 976cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 9772515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 978e32f2f54SBarry 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); 97958804f6dSBarry Smith #endif 980ca15aa20SStefano Zampini av[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 981289bc588SBarry Smith } 982289bc588SBarry Smith } 9833a40ed3dSBarry Smith } else { 984289bc588SBarry Smith for (j=0; j<n; j++) { 985cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 9862515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 987e32f2f54SBarry 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); 98858804f6dSBarry Smith #endif 989289bc588SBarry Smith for (i=0; i<m; i++) { 990cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 9912515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 992e32f2f54SBarry 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); 99358804f6dSBarry Smith #endif 994ca15aa20SStefano Zampini av[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 995289bc588SBarry Smith } 996289bc588SBarry Smith } 997289bc588SBarry Smith } 9983a40ed3dSBarry Smith } else { 999dbb450caSBarry Smith if (addv == INSERT_VALUES) { 1000e8d4e0b9SBarry Smith for (i=0; i<m; i++) { 1001cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 10022515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 1003e32f2f54SBarry 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); 100458804f6dSBarry Smith #endif 1005e8d4e0b9SBarry Smith for (j=0; j<n; j++) { 1006cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 10072515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 1008e32f2f54SBarry Smith if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1); 100958804f6dSBarry Smith #endif 1010ca15aa20SStefano Zampini av[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 1011e8d4e0b9SBarry Smith } 1012e8d4e0b9SBarry Smith } 10133a40ed3dSBarry Smith } else { 1014289bc588SBarry Smith for (i=0; i<m; i++) { 1015cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 10162515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 1017e32f2f54SBarry 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); 101858804f6dSBarry Smith #endif 1019289bc588SBarry Smith for (j=0; j<n; j++) { 1020cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 10212515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 1022e32f2f54SBarry 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); 102358804f6dSBarry Smith #endif 1024ca15aa20SStefano Zampini av[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 1025289bc588SBarry Smith } 1026289bc588SBarry Smith } 1027289bc588SBarry Smith } 1028e8d4e0b9SBarry Smith } 1029ca15aa20SStefano Zampini /* hack to prevent unneeded copy to the GPU while returning the array */ 1030ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA) 1031ca15aa20SStefano Zampini oldf = A->valid_GPU_matrix; 1032ca15aa20SStefano Zampini A->valid_GPU_matrix = PETSC_OFFLOAD_GPU; 1033ca15aa20SStefano Zampini #endif 1034ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&av);CHKERRQ(ierr); 1035ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA) 1036ca15aa20SStefano Zampini A->valid_GPU_matrix = (oldf == PETSC_OFFLOAD_UNALLOCATED ? PETSC_OFFLOAD_UNALLOCATED : PETSC_OFFLOAD_CPU); 1037ca15aa20SStefano Zampini #endif 10383a40ed3dSBarry Smith PetscFunctionReturn(0); 1039289bc588SBarry Smith } 1040e8d4e0b9SBarry Smith 1041e0877f53SBarry Smith static PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[]) 1042ae80bb75SLois Curfman McInnes { 1043ae80bb75SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1044ca15aa20SStefano Zampini const PetscScalar *vv; 104513f74950SBarry Smith PetscInt i,j; 1046ca15aa20SStefano Zampini PetscErrorCode ierr; 1047ae80bb75SLois Curfman McInnes 10483a40ed3dSBarry Smith PetscFunctionBegin; 1049ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&vv);CHKERRQ(ierr); 1050ae80bb75SLois Curfman McInnes /* row-oriented output */ 1051ae80bb75SLois Curfman McInnes for (i=0; i<m; i++) { 105297e567efSBarry Smith if (indexm[i] < 0) {v += n;continue;} 1053e32f2f54SBarry 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); 1054ae80bb75SLois Curfman McInnes for (j=0; j<n; j++) { 10556f31f424SBarry Smith if (indexn[j] < 0) {v++; continue;} 1056e32f2f54SBarry 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); 1057ca15aa20SStefano Zampini *v++ = vv[indexn[j]*mat->lda + indexm[i]]; 1058ae80bb75SLois Curfman McInnes } 1059ae80bb75SLois Curfman McInnes } 1060ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&vv);CHKERRQ(ierr); 10613a40ed3dSBarry Smith PetscFunctionReturn(0); 1062ae80bb75SLois Curfman McInnes } 1063ae80bb75SLois Curfman McInnes 1064289bc588SBarry Smith /* -----------------------------------------------------------------*/ 1065289bc588SBarry Smith 1066eb91f321SVaclav Hapla static PetscErrorCode MatLoad_SeqDense_Binary(Mat newmat,PetscViewer viewer) 1067aabbc4fbSShri Abhyankar { 1068aabbc4fbSShri Abhyankar Mat_SeqDense *a; 1069aabbc4fbSShri Abhyankar PetscErrorCode ierr; 1070aabbc4fbSShri Abhyankar PetscInt *scols,i,j,nz,header[4]; 1071aabbc4fbSShri Abhyankar int fd; 1072aabbc4fbSShri Abhyankar PetscMPIInt size; 1073aabbc4fbSShri Abhyankar PetscInt *rowlengths = 0,M,N,*cols,grows,gcols; 1074aabbc4fbSShri Abhyankar PetscScalar *vals,*svals,*v,*w; 1075ce94432eSBarry Smith MPI_Comm comm; 1076aabbc4fbSShri Abhyankar 1077aabbc4fbSShri Abhyankar PetscFunctionBegin; 1078ce94432eSBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 1079aabbc4fbSShri Abhyankar ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 1080aabbc4fbSShri Abhyankar if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor"); 1081aabbc4fbSShri Abhyankar ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 10829860990eSLisandro Dalcin ierr = PetscBinaryRead(fd,header,4,NULL,PETSC_INT);CHKERRQ(ierr); 1083aabbc4fbSShri Abhyankar if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object"); 1084aabbc4fbSShri Abhyankar M = header[1]; N = header[2]; nz = header[3]; 1085aabbc4fbSShri Abhyankar 1086aabbc4fbSShri Abhyankar /* set global size if not set already*/ 1087aabbc4fbSShri Abhyankar if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) { 1088aabbc4fbSShri Abhyankar ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr); 1089aabbc4fbSShri Abhyankar } else { 1090aabbc4fbSShri Abhyankar /* if sizes and type are already set, check if the vector global sizes are correct */ 1091aabbc4fbSShri Abhyankar ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr); 1092aabbc4fbSShri 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); 1093aabbc4fbSShri Abhyankar } 1094e6324fbbSBarry Smith a = (Mat_SeqDense*)newmat->data; 1095e6324fbbSBarry Smith if (!a->user_alloc) { 10960298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr); 1097e6324fbbSBarry Smith } 1098aabbc4fbSShri Abhyankar 1099aabbc4fbSShri Abhyankar if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */ 1100aabbc4fbSShri Abhyankar a = (Mat_SeqDense*)newmat->data; 1101aabbc4fbSShri Abhyankar v = a->v; 1102aabbc4fbSShri Abhyankar /* Allocate some temp space to read in the values and then flip them 1103aabbc4fbSShri Abhyankar from row major to column major */ 1104854ce69bSBarry Smith ierr = PetscMalloc1(M*N > 0 ? M*N : 1,&w);CHKERRQ(ierr); 1105aabbc4fbSShri Abhyankar /* read in nonzero values */ 11069860990eSLisandro Dalcin ierr = PetscBinaryRead(fd,w,M*N,NULL,PETSC_SCALAR);CHKERRQ(ierr); 1107aabbc4fbSShri Abhyankar /* now flip the values and store them in the matrix*/ 1108aabbc4fbSShri Abhyankar for (j=0; j<N; j++) { 1109aabbc4fbSShri Abhyankar for (i=0; i<M; i++) { 1110aabbc4fbSShri Abhyankar *v++ =w[i*N+j]; 1111aabbc4fbSShri Abhyankar } 1112aabbc4fbSShri Abhyankar } 1113aabbc4fbSShri Abhyankar ierr = PetscFree(w);CHKERRQ(ierr); 1114aabbc4fbSShri Abhyankar } else { 1115aabbc4fbSShri Abhyankar /* read row lengths */ 1116854ce69bSBarry Smith ierr = PetscMalloc1(M+1,&rowlengths);CHKERRQ(ierr); 11179860990eSLisandro Dalcin ierr = PetscBinaryRead(fd,rowlengths,M,NULL,PETSC_INT);CHKERRQ(ierr); 1118aabbc4fbSShri Abhyankar 1119aabbc4fbSShri Abhyankar a = (Mat_SeqDense*)newmat->data; 1120aabbc4fbSShri Abhyankar v = a->v; 1121aabbc4fbSShri Abhyankar 1122aabbc4fbSShri Abhyankar /* read column indices and nonzeros */ 1123854ce69bSBarry Smith ierr = PetscMalloc1(nz+1,&scols);CHKERRQ(ierr); 1124aabbc4fbSShri Abhyankar cols = scols; 11259860990eSLisandro Dalcin ierr = PetscBinaryRead(fd,cols,nz,NULL,PETSC_INT);CHKERRQ(ierr); 1126854ce69bSBarry Smith ierr = PetscMalloc1(nz+1,&svals);CHKERRQ(ierr); 1127aabbc4fbSShri Abhyankar vals = svals; 11289860990eSLisandro Dalcin ierr = PetscBinaryRead(fd,vals,nz,NULL,PETSC_SCALAR);CHKERRQ(ierr); 1129aabbc4fbSShri Abhyankar 1130aabbc4fbSShri Abhyankar /* insert into matrix */ 1131aabbc4fbSShri Abhyankar for (i=0; i<M; i++) { 1132aabbc4fbSShri Abhyankar for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j]; 1133aabbc4fbSShri Abhyankar svals += rowlengths[i]; scols += rowlengths[i]; 1134aabbc4fbSShri Abhyankar } 1135aabbc4fbSShri Abhyankar ierr = PetscFree(vals);CHKERRQ(ierr); 1136aabbc4fbSShri Abhyankar ierr = PetscFree(cols);CHKERRQ(ierr); 1137aabbc4fbSShri Abhyankar ierr = PetscFree(rowlengths);CHKERRQ(ierr); 1138aabbc4fbSShri Abhyankar } 1139aabbc4fbSShri Abhyankar ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1140aabbc4fbSShri Abhyankar ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1141aabbc4fbSShri Abhyankar PetscFunctionReturn(0); 1142aabbc4fbSShri Abhyankar } 1143aabbc4fbSShri Abhyankar 1144eb91f321SVaclav Hapla PetscErrorCode MatLoad_SeqDense(Mat newMat, PetscViewer viewer) 1145eb91f321SVaclav Hapla { 1146eb91f321SVaclav Hapla PetscBool isbinary, ishdf5; 1147eb91f321SVaclav Hapla PetscErrorCode ierr; 1148eb91f321SVaclav Hapla 1149eb91f321SVaclav Hapla PetscFunctionBegin; 1150eb91f321SVaclav Hapla PetscValidHeaderSpecific(newMat,MAT_CLASSID,1); 1151eb91f321SVaclav Hapla PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 1152eb91f321SVaclav Hapla /* force binary viewer to load .info file if it has not yet done so */ 1153eb91f321SVaclav Hapla ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr); 1154eb91f321SVaclav Hapla ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 1155eb91f321SVaclav Hapla ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERHDF5, &ishdf5);CHKERRQ(ierr); 1156eb91f321SVaclav Hapla if (isbinary) { 1157eb91f321SVaclav Hapla ierr = MatLoad_SeqDense_Binary(newMat,viewer);CHKERRQ(ierr); 1158eb91f321SVaclav Hapla } else if (ishdf5) { 1159eb91f321SVaclav Hapla #if defined(PETSC_HAVE_HDF5) 1160eb91f321SVaclav Hapla ierr = MatLoad_Dense_HDF5(newMat,viewer);CHKERRQ(ierr); 1161eb91f321SVaclav Hapla #else 1162eb91f321SVaclav Hapla SETERRQ(PetscObjectComm((PetscObject)newMat),PETSC_ERR_SUP,"HDF5 not supported in this build.\nPlease reconfigure using --download-hdf5"); 1163eb91f321SVaclav Hapla #endif 1164eb91f321SVaclav Hapla } else { 1165eb91f321SVaclav Hapla SETERRQ2(PetscObjectComm((PetscObject)newMat),PETSC_ERR_SUP,"Viewer type %s not yet supported for reading %s matrices",((PetscObject)viewer)->type_name,((PetscObject)newMat)->type_name); 1166eb91f321SVaclav Hapla } 1167eb91f321SVaclav Hapla PetscFunctionReturn(0); 1168eb91f321SVaclav Hapla } 1169eb91f321SVaclav Hapla 11706849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer) 1171289bc588SBarry Smith { 1172932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1173dfbe8321SBarry Smith PetscErrorCode ierr; 117413f74950SBarry Smith PetscInt i,j; 11752dcb1b2aSMatthew Knepley const char *name; 1176ca15aa20SStefano Zampini PetscScalar *v,*av; 1177f3ef73ceSBarry Smith PetscViewerFormat format; 11785f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX) 1179ace3abfcSBarry Smith PetscBool allreal = PETSC_TRUE; 11805f481a85SSatish Balay #endif 1181932b0c3eSLois Curfman McInnes 11823a40ed3dSBarry Smith PetscFunctionBegin; 1183ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,(const PetscScalar**)&av);CHKERRQ(ierr); 1184b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1185456192e2SBarry Smith if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 11863a40ed3dSBarry Smith PetscFunctionReturn(0); /* do nothing for now */ 1187fb9695e5SSatish Balay } else if (format == PETSC_VIEWER_ASCII_COMMON) { 1188d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 1189d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 1190ca15aa20SStefano Zampini v = av + i; 119177431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr); 1192d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1193aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 1194329f5518SBarry Smith if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) { 119557622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g + %g i) ",j,(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr); 1196329f5518SBarry Smith } else if (PetscRealPart(*v)) { 119757622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)PetscRealPart(*v));CHKERRQ(ierr); 11986831982aSBarry Smith } 119980cd9d93SLois Curfman McInnes #else 12006831982aSBarry Smith if (*v) { 120157622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)*v);CHKERRQ(ierr); 12026831982aSBarry Smith } 120380cd9d93SLois Curfman McInnes #endif 12041b807ce4Svictorle v += a->lda; 120580cd9d93SLois Curfman McInnes } 1206b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 120780cd9d93SLois Curfman McInnes } 1208d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 12093a40ed3dSBarry Smith } else { 1210d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 1211aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 121247989497SBarry Smith /* determine if matrix has all real values */ 1213ca15aa20SStefano Zampini v = av; 1214d0f46423SBarry Smith for (i=0; i<A->rmap->n*A->cmap->n; i++) { 1215ffac6cdbSBarry Smith if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break;} 121647989497SBarry Smith } 121747989497SBarry Smith #endif 1218fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 12193a7fca6bSBarry Smith ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr); 1220d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr); 1221d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 1222fb9695e5SSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr); 1223ffac6cdbSBarry Smith } 1224ffac6cdbSBarry Smith 1225d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 1226ca15aa20SStefano Zampini v = av + i; 1227d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1228aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 122947989497SBarry Smith if (allreal) { 1230c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr); 123147989497SBarry Smith } else { 1232c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr); 123347989497SBarry Smith } 1234289bc588SBarry Smith #else 1235c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr); 1236289bc588SBarry Smith #endif 12371b807ce4Svictorle v += a->lda; 1238289bc588SBarry Smith } 1239b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 1240289bc588SBarry Smith } 1241fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 1242b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr); 1243ffac6cdbSBarry Smith } 1244d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 1245da3a660dSBarry Smith } 1246ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,(const PetscScalar**)&av);CHKERRQ(ierr); 1247b0a32e0cSBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 12483a40ed3dSBarry Smith PetscFunctionReturn(0); 1249289bc588SBarry Smith } 1250289bc588SBarry Smith 12516849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer) 1252932b0c3eSLois Curfman McInnes { 1253932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 12546849ba73SBarry Smith PetscErrorCode ierr; 125513f74950SBarry Smith int fd; 1256d0f46423SBarry Smith PetscInt ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n; 1257ca15aa20SStefano Zampini PetscScalar *av,*v,*anonz,*vals; 1258f4403165SShri Abhyankar PetscViewerFormat format; 1259932b0c3eSLois Curfman McInnes 12603a40ed3dSBarry Smith PetscFunctionBegin; 1261b0a32e0cSBarry Smith ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 1262ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,(const PetscScalar**)&av);CHKERRQ(ierr); 1263f4403165SShri Abhyankar ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1264f4403165SShri Abhyankar if (format == PETSC_VIEWER_NATIVE) { 1265f4403165SShri Abhyankar /* store the matrix as a dense matrix */ 1266785e854fSJed Brown ierr = PetscMalloc1(4,&col_lens);CHKERRQ(ierr); 12672205254eSKarl Rupp 1268f4403165SShri Abhyankar col_lens[0] = MAT_FILE_CLASSID; 1269f4403165SShri Abhyankar col_lens[1] = m; 1270f4403165SShri Abhyankar col_lens[2] = n; 1271f4403165SShri Abhyankar col_lens[3] = MATRIX_BINARY_FORMAT_DENSE; 12722205254eSKarl Rupp 1273f4403165SShri Abhyankar ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 1274f4403165SShri Abhyankar ierr = PetscFree(col_lens);CHKERRQ(ierr); 1275f4403165SShri Abhyankar 1276f4403165SShri Abhyankar /* write out matrix, by rows */ 1277854ce69bSBarry Smith ierr = PetscMalloc1(m*n+1,&vals);CHKERRQ(ierr); 1278ca15aa20SStefano Zampini v = av; 1279f4403165SShri Abhyankar for (j=0; j<n; j++) { 1280f4403165SShri Abhyankar for (i=0; i<m; i++) { 1281f4403165SShri Abhyankar vals[j + i*n] = *v++; 1282f4403165SShri Abhyankar } 1283f4403165SShri Abhyankar } 1284f4403165SShri Abhyankar ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 1285f4403165SShri Abhyankar ierr = PetscFree(vals);CHKERRQ(ierr); 1286f4403165SShri Abhyankar } else { 1287854ce69bSBarry Smith ierr = PetscMalloc1(4+nz,&col_lens);CHKERRQ(ierr); 12882205254eSKarl Rupp 12890700a824SBarry Smith col_lens[0] = MAT_FILE_CLASSID; 1290932b0c3eSLois Curfman McInnes col_lens[1] = m; 1291932b0c3eSLois Curfman McInnes col_lens[2] = n; 1292932b0c3eSLois Curfman McInnes col_lens[3] = nz; 1293932b0c3eSLois Curfman McInnes 1294932b0c3eSLois Curfman McInnes /* store lengths of each row and write (including header) to file */ 1295932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) col_lens[4+i] = n; 12966f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 1297932b0c3eSLois Curfman McInnes 1298932b0c3eSLois Curfman McInnes /* Possibly should write in smaller increments, not whole matrix at once? */ 1299932b0c3eSLois Curfman McInnes /* store column indices (zero start index) */ 1300932b0c3eSLois Curfman McInnes ict = 0; 1301932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 1302932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) col_lens[ict++] = j; 1303932b0c3eSLois Curfman McInnes } 13046f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 1305606d414cSSatish Balay ierr = PetscFree(col_lens);CHKERRQ(ierr); 1306932b0c3eSLois Curfman McInnes 1307932b0c3eSLois Curfman McInnes /* store nonzero values */ 1308854ce69bSBarry Smith ierr = PetscMalloc1(nz+1,&anonz);CHKERRQ(ierr); 1309932b0c3eSLois Curfman McInnes ict = 0; 1310932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 1311ca15aa20SStefano Zampini v = av + i; 1312932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) { 13131b807ce4Svictorle anonz[ict++] = *v; v += a->lda; 1314932b0c3eSLois Curfman McInnes } 1315932b0c3eSLois Curfman McInnes } 13166f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 1317606d414cSSatish Balay ierr = PetscFree(anonz);CHKERRQ(ierr); 1318f4403165SShri Abhyankar } 1319ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,(const PetscScalar**)&av);CHKERRQ(ierr); 13203a40ed3dSBarry Smith PetscFunctionReturn(0); 1321932b0c3eSLois Curfman McInnes } 1322932b0c3eSLois Curfman McInnes 13239804daf3SBarry Smith #include <petscdraw.h> 1324e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa) 1325f1af5d2fSBarry Smith { 1326f1af5d2fSBarry Smith Mat A = (Mat) Aa; 13276849ba73SBarry Smith PetscErrorCode ierr; 1328383922c3SLisandro Dalcin PetscInt m = A->rmap->n,n = A->cmap->n,i,j; 1329383922c3SLisandro Dalcin int color = PETSC_DRAW_WHITE; 1330ca15aa20SStefano Zampini const PetscScalar *v; 1331b0a32e0cSBarry Smith PetscViewer viewer; 1332b05fc000SLisandro Dalcin PetscReal xl,yl,xr,yr,x_l,x_r,y_l,y_r; 1333f3ef73ceSBarry Smith PetscViewerFormat format; 1334f1af5d2fSBarry Smith 1335f1af5d2fSBarry Smith PetscFunctionBegin; 1336f1af5d2fSBarry Smith ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr); 1337b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1338b0a32e0cSBarry Smith ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr); 1339f1af5d2fSBarry Smith 1340f1af5d2fSBarry Smith /* Loop over matrix elements drawing boxes */ 1341ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&v);CHKERRQ(ierr); 1342fb9695e5SSatish Balay if (format != PETSC_VIEWER_DRAW_CONTOUR) { 1343383922c3SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 1344f1af5d2fSBarry Smith /* Blue for negative and Red for positive */ 1345f1af5d2fSBarry Smith for (j = 0; j < n; j++) { 1346383922c3SLisandro Dalcin x_l = j; x_r = x_l + 1.0; 1347f1af5d2fSBarry Smith for (i = 0; i < m; i++) { 1348f1af5d2fSBarry Smith y_l = m - i - 1.0; 1349f1af5d2fSBarry Smith y_r = y_l + 1.0; 1350ca15aa20SStefano Zampini if (PetscRealPart(v[j*m+i]) > 0.) color = PETSC_DRAW_RED; 1351ca15aa20SStefano Zampini else if (PetscRealPart(v[j*m+i]) < 0.) color = PETSC_DRAW_BLUE; 1352ca15aa20SStefano Zampini else continue; 1353b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1354f1af5d2fSBarry Smith } 1355f1af5d2fSBarry Smith } 1356383922c3SLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 1357f1af5d2fSBarry Smith } else { 1358f1af5d2fSBarry Smith /* use contour shading to indicate magnitude of values */ 1359f1af5d2fSBarry Smith /* first determine max of all nonzero values */ 1360b05fc000SLisandro Dalcin PetscReal minv = 0.0, maxv = 0.0; 1361b05fc000SLisandro Dalcin PetscDraw popup; 1362b05fc000SLisandro Dalcin 1363f1af5d2fSBarry Smith for (i=0; i < m*n; i++) { 1364f1af5d2fSBarry Smith if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]); 1365f1af5d2fSBarry Smith } 1366383922c3SLisandro Dalcin if (minv >= maxv) maxv = minv + PETSC_SMALL; 1367b0a32e0cSBarry Smith ierr = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr); 136845f3bb6eSLisandro Dalcin ierr = PetscDrawScalePopup(popup,minv,maxv);CHKERRQ(ierr); 1369383922c3SLisandro Dalcin 1370383922c3SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 1371f1af5d2fSBarry Smith for (j=0; j<n; j++) { 1372f1af5d2fSBarry Smith x_l = j; 1373f1af5d2fSBarry Smith x_r = x_l + 1.0; 1374f1af5d2fSBarry Smith for (i=0; i<m; i++) { 1375f1af5d2fSBarry Smith y_l = m - i - 1.0; 1376f1af5d2fSBarry Smith y_r = y_l + 1.0; 1377b05fc000SLisandro Dalcin color = PetscDrawRealToColor(PetscAbsScalar(v[j*m+i]),minv,maxv); 1378b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1379f1af5d2fSBarry Smith } 1380f1af5d2fSBarry Smith } 1381383922c3SLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 1382f1af5d2fSBarry Smith } 1383ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&v);CHKERRQ(ierr); 1384f1af5d2fSBarry Smith PetscFunctionReturn(0); 1385f1af5d2fSBarry Smith } 1386f1af5d2fSBarry Smith 1387e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer) 1388f1af5d2fSBarry Smith { 1389b0a32e0cSBarry Smith PetscDraw draw; 1390ace3abfcSBarry Smith PetscBool isnull; 1391329f5518SBarry Smith PetscReal xr,yr,xl,yl,h,w; 1392dfbe8321SBarry Smith PetscErrorCode ierr; 1393f1af5d2fSBarry Smith 1394f1af5d2fSBarry Smith PetscFunctionBegin; 1395b0a32e0cSBarry Smith ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr); 1396b0a32e0cSBarry Smith ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 1397abc0a331SBarry Smith if (isnull) PetscFunctionReturn(0); 1398f1af5d2fSBarry Smith 1399d0f46423SBarry Smith xr = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0; 1400f1af5d2fSBarry Smith xr += w; yr += h; xl = -w; yl = -h; 1401b0a32e0cSBarry Smith ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr); 1402832b7cebSLisandro Dalcin ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr); 1403b0a32e0cSBarry Smith ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr); 14040298fd71SBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr); 1405832b7cebSLisandro Dalcin ierr = PetscDrawSave(draw);CHKERRQ(ierr); 1406f1af5d2fSBarry Smith PetscFunctionReturn(0); 1407f1af5d2fSBarry Smith } 1408f1af5d2fSBarry Smith 1409dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer) 1410932b0c3eSLois Curfman McInnes { 1411dfbe8321SBarry Smith PetscErrorCode ierr; 1412ace3abfcSBarry Smith PetscBool iascii,isbinary,isdraw; 1413932b0c3eSLois Curfman McInnes 14143a40ed3dSBarry Smith PetscFunctionBegin; 1415251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 1416251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 1417251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 14180f5bd95cSBarry Smith 1419c45a1595SBarry Smith if (iascii) { 1420c45a1595SBarry Smith ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr); 14210f5bd95cSBarry Smith } else if (isbinary) { 14223a40ed3dSBarry Smith ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr); 1423f1af5d2fSBarry Smith } else if (isdraw) { 1424f1af5d2fSBarry Smith ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr); 1425932b0c3eSLois Curfman McInnes } 14263a40ed3dSBarry Smith PetscFunctionReturn(0); 1427932b0c3eSLois Curfman McInnes } 1428289bc588SBarry Smith 1429d3042a70SBarry Smith static PetscErrorCode MatDensePlaceArray_SeqDense(Mat A,const PetscScalar array[]) 1430d3042a70SBarry Smith { 1431d3042a70SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1432d3042a70SBarry Smith 1433d3042a70SBarry Smith PetscFunctionBegin; 1434d3042a70SBarry Smith a->unplacedarray = a->v; 1435d3042a70SBarry Smith a->unplaced_user_alloc = a->user_alloc; 1436d3042a70SBarry Smith a->v = (PetscScalar*) array; 1437ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA) 1438ca15aa20SStefano Zampini A->valid_GPU_matrix = PETSC_OFFLOAD_CPU; 1439ca15aa20SStefano Zampini #endif 1440d3042a70SBarry Smith PetscFunctionReturn(0); 1441d3042a70SBarry Smith } 1442d3042a70SBarry Smith 1443d3042a70SBarry Smith static PetscErrorCode MatDenseResetArray_SeqDense(Mat A) 1444d3042a70SBarry Smith { 1445d3042a70SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1446d3042a70SBarry Smith 1447d3042a70SBarry Smith PetscFunctionBegin; 1448d3042a70SBarry Smith a->v = a->unplacedarray; 1449d3042a70SBarry Smith a->user_alloc = a->unplaced_user_alloc; 1450d3042a70SBarry Smith a->unplacedarray = NULL; 1451ca15aa20SStefano Zampini #if defined(PETSC_HAVE_CUDA) 1452ca15aa20SStefano Zampini A->valid_GPU_matrix = PETSC_OFFLOAD_CPU; 1453ca15aa20SStefano Zampini #endif 1454d3042a70SBarry Smith PetscFunctionReturn(0); 1455d3042a70SBarry Smith } 1456d3042a70SBarry Smith 1457ca15aa20SStefano Zampini PetscErrorCode MatDestroy_SeqDense(Mat mat) 1458289bc588SBarry Smith { 1459ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)mat->data; 1460dfbe8321SBarry Smith PetscErrorCode ierr; 146190f02eecSBarry Smith 14623a40ed3dSBarry Smith PetscFunctionBegin; 1463aa482453SBarry Smith #if defined(PETSC_USE_LOG) 1464d0f46423SBarry Smith PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n); 1465a5a9c739SBarry Smith #endif 146605b42c5fSBarry Smith ierr = PetscFree(l->pivots);CHKERRQ(ierr); 1467a49dc2a2SStefano Zampini ierr = PetscFree(l->fwork);CHKERRQ(ierr); 1468abc3b08eSStefano Zampini ierr = MatDestroy(&l->ptapwork);CHKERRQ(ierr); 14696857c123SSatish Balay if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);} 1470bf0cc555SLisandro Dalcin ierr = PetscFree(mat->data);CHKERRQ(ierr); 1471dbd8c25aSHong Zhang 1472dbd8c25aSHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr); 147349a6ff4bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetLDA_C",NULL);CHKERRQ(ierr); 1474bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL);CHKERRQ(ierr); 1475*52c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL);CHKERRQ(ierr); 1476d3042a70SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDensePlaceArray_C",NULL);CHKERRQ(ierr); 1477d3042a70SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseResetArray_C",NULL);CHKERRQ(ierr); 1478*52c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArrayRead_C",NULL);CHKERRQ(ierr); 1479*52c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArrayRead_C",NULL);CHKERRQ(ierr); 14808baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL);CHKERRQ(ierr); 14818baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 14828baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL);CHKERRQ(ierr); 14838baccfbdSHong Zhang #endif 14842bf066beSStefano Zampini #if defined(PETSC_HAVE_CUDA) 14852bf066beSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqdensecuda_C",NULL);CHKERRQ(ierr); 1486a4af7ca8SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqaijcusparse_seqdense_C",NULL);CHKERRQ(ierr); 1487a4af7ca8SStefano Zampini #endif 1488a4af7ca8SStefano Zampini #if defined(PETSC_HAVE_VIENNACL) 1489a4af7ca8SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqaijviennacl_seqdense_C",NULL);CHKERRQ(ierr); 14902bf066beSStefano Zampini #endif 1491bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL);CHKERRQ(ierr); 1492bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1493bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1494bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1495a001520aSPierre Jolivet ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqbaij_seqdense_C",NULL);CHKERRQ(ierr); 1496a001520aSPierre Jolivet ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqbaij_seqdense_C",NULL);CHKERRQ(ierr); 1497a001520aSPierre Jolivet ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqbaij_seqdense_C",NULL);CHKERRQ(ierr); 1498abc3b08eSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatPtAP_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1499*52c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqaijperm_seqdense_C",NULL);CHKERRQ(ierr); 1500*52c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaijperm_seqdense_C",NULL);CHKERRQ(ierr); 1501*52c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaijperm_seqdense_C",NULL);CHKERRQ(ierr); 1502*52c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatPtAP_seqaijperm_seqdense_C",NULL);CHKERRQ(ierr); 1503*52c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqaijsell_seqdense_C",NULL);CHKERRQ(ierr); 1504*52c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaijsell_seqdense_C",NULL);CHKERRQ(ierr); 1505*52c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaijsell_seqdense_C",NULL);CHKERRQ(ierr); 1506*52c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatPtAP_seqaijsell_seqdense_C",NULL);CHKERRQ(ierr); 1507*52c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqaijmkl_seqdense_C",NULL);CHKERRQ(ierr); 1508*52c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaijmkl_seqdense_C",NULL);CHKERRQ(ierr); 1509*52c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaijmkl_seqdense_C",NULL);CHKERRQ(ierr); 1510*52c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_nest_seqdense_C",NULL);CHKERRQ(ierr); 1511*52c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_nest_seqdense_C",NULL);CHKERRQ(ierr); 1512*52c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_nest_seqdense_C",NULL);CHKERRQ(ierr); 1513*52c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatPtAP_seqaijmkl_seqdense_C",NULL);CHKERRQ(ierr); 1514*52c5f739Sprj- 15153bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 15163bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 15173bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1518*52c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMult_seqaijperm_seqdense_C",NULL);CHKERRQ(ierr); 1519*52c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaijperm_seqdense_C",NULL);CHKERRQ(ierr); 1520*52c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaijperm_seqdense_C",NULL);CHKERRQ(ierr); 1521*52c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMult_seqaijsell_seqdense_C",NULL);CHKERRQ(ierr); 1522*52c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaijsell_seqdense_C",NULL);CHKERRQ(ierr); 1523*52c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaijsell_seqdense_C",NULL);CHKERRQ(ierr); 1524*52c5f739Sprj- 1525*52c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMult_seqaijmkl_seqdense_C",NULL);CHKERRQ(ierr); 1526*52c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaijmkl_seqdense_C",NULL);CHKERRQ(ierr); 1527*52c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaijmkl_seqdense_C",NULL);CHKERRQ(ierr); 152886aefd0dSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetColumn_C",NULL);CHKERRQ(ierr); 152986aefd0dSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreColumn_C",NULL);CHKERRQ(ierr); 15303a40ed3dSBarry Smith PetscFunctionReturn(0); 1531289bc588SBarry Smith } 1532289bc588SBarry Smith 1533e0877f53SBarry Smith static PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout) 1534289bc588SBarry Smith { 1535c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 15366849ba73SBarry Smith PetscErrorCode ierr; 153713f74950SBarry Smith PetscInt k,j,m,n,M; 153887828ca2SBarry Smith PetscScalar *v,tmp; 153948b35521SBarry Smith 15403a40ed3dSBarry Smith PetscFunctionBegin; 1541ca15aa20SStefano Zampini m = A->rmap->n; M = mat->lda; n = A->cmap->n; 15422847e3fdSStefano Zampini if (reuse == MAT_INPLACE_MATRIX && m == n) { /* in place transpose */ 1543ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr); 1544d3e5ee88SLois Curfman McInnes for (j=0; j<m; j++) { 1545289bc588SBarry Smith for (k=0; k<j; k++) { 15461b807ce4Svictorle tmp = v[j + k*M]; 15471b807ce4Svictorle v[j + k*M] = v[k + j*M]; 15481b807ce4Svictorle v[k + j*M] = tmp; 1549289bc588SBarry Smith } 1550289bc588SBarry Smith } 1551ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr); 15523a40ed3dSBarry Smith } else { /* out-of-place transpose */ 1553d3e5ee88SLois Curfman McInnes Mat tmat; 1554ec8511deSBarry Smith Mat_SeqDense *tmatd; 155587828ca2SBarry Smith PetscScalar *v2; 1556af36a384SStefano Zampini PetscInt M2; 1557ea709b57SSatish Balay 15582847e3fdSStefano Zampini if (reuse != MAT_REUSE_MATRIX) { 1559ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr); 1560d0f46423SBarry Smith ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr); 15617adad957SLisandro Dalcin ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 15620298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr); 1563ca15aa20SStefano Zampini } else tmat = *matout; 1564ca15aa20SStefano Zampini 1565ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,(const PetscScalar**)&v);CHKERRQ(ierr); 1566ca15aa20SStefano Zampini ierr = MatDenseGetArray(tmat,&v2);CHKERRQ(ierr); 1567ec8511deSBarry Smith tmatd = (Mat_SeqDense*)tmat->data; 1568ca15aa20SStefano Zampini M2 = tmatd->lda; 1569d3e5ee88SLois Curfman McInnes for (j=0; j<n; j++) { 1570af36a384SStefano Zampini for (k=0; k<m; k++) v2[j + k*M2] = v[k + j*M]; 1571d3e5ee88SLois Curfman McInnes } 1572ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(tmat,&v2);CHKERRQ(ierr); 1573ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,(const PetscScalar**)&v);CHKERRQ(ierr); 15746d4a8577SBarry Smith ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 15756d4a8577SBarry Smith ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 15762847e3fdSStefano Zampini if (reuse == MAT_INITIAL_MATRIX || reuse == MAT_REUSE_MATRIX) *matout = tmat; 15772847e3fdSStefano Zampini else { 15782847e3fdSStefano Zampini ierr = MatHeaderMerge(A,&tmat);CHKERRQ(ierr); 15792847e3fdSStefano Zampini } 158048b35521SBarry Smith } 15813a40ed3dSBarry Smith PetscFunctionReturn(0); 1582289bc588SBarry Smith } 1583289bc588SBarry Smith 1584e0877f53SBarry Smith static PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool *flg) 1585289bc588SBarry Smith { 1586c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data; 1587c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data; 1588ca15aa20SStefano Zampini PetscInt i; 1589ca15aa20SStefano Zampini const PetscScalar *v1,*v2; 1590ca15aa20SStefano Zampini PetscErrorCode ierr; 15919ea5d5aeSSatish Balay 15923a40ed3dSBarry Smith PetscFunctionBegin; 1593d0f46423SBarry Smith if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1594d0f46423SBarry Smith if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1595ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A1,&v1);CHKERRQ(ierr); 1596ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A2,&v2);CHKERRQ(ierr); 1597ca15aa20SStefano Zampini for (i=0; i<A1->cmap->n; i++) { 1598ca15aa20SStefano Zampini ierr = PetscArraycmp(v1,v2,A1->rmap->n,flg);CHKERRQ(ierr); 1599ca15aa20SStefano Zampini if (*flg == PETSC_FALSE) PetscFunctionReturn(0); 1600ca15aa20SStefano Zampini v1 += mat1->lda; 1601ca15aa20SStefano Zampini v2 += mat2->lda; 16021b807ce4Svictorle } 1603ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A1,&v1);CHKERRQ(ierr); 1604ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A2,&v2);CHKERRQ(ierr); 160577c4ece6SBarry Smith *flg = PETSC_TRUE; 16063a40ed3dSBarry Smith PetscFunctionReturn(0); 1607289bc588SBarry Smith } 1608289bc588SBarry Smith 1609e0877f53SBarry Smith static PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v) 1610289bc588SBarry Smith { 1611c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 161213f74950SBarry Smith PetscInt i,n,len; 1613ca15aa20SStefano Zampini PetscScalar *x; 1614ca15aa20SStefano Zampini const PetscScalar *vv; 1615ca15aa20SStefano Zampini PetscErrorCode ierr; 161644cd7ae7SLois Curfman McInnes 16173a40ed3dSBarry Smith PetscFunctionBegin; 16187a97a34bSBarry Smith ierr = VecGetSize(v,&n);CHKERRQ(ierr); 16191ebc52fbSHong Zhang ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1620d0f46423SBarry Smith len = PetscMin(A->rmap->n,A->cmap->n); 1621ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&vv);CHKERRQ(ierr); 1622e32f2f54SBarry Smith if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec"); 162344cd7ae7SLois Curfman McInnes for (i=0; i<len; i++) { 1624ca15aa20SStefano Zampini x[i] = vv[i*mat->lda + i]; 1625289bc588SBarry Smith } 1626ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&vv);CHKERRQ(ierr); 16271ebc52fbSHong Zhang ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 16283a40ed3dSBarry Smith PetscFunctionReturn(0); 1629289bc588SBarry Smith } 1630289bc588SBarry Smith 1631e0877f53SBarry Smith static PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr) 1632289bc588SBarry Smith { 1633c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1634f1ceaac6SMatthew G. Knepley const PetscScalar *l,*r; 1635ca15aa20SStefano Zampini PetscScalar x,*v,*vv; 1636dfbe8321SBarry Smith PetscErrorCode ierr; 1637d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n; 163855659b69SBarry Smith 16393a40ed3dSBarry Smith PetscFunctionBegin; 1640ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&vv);CHKERRQ(ierr); 164128988994SBarry Smith if (ll) { 16427a97a34bSBarry Smith ierr = VecGetSize(ll,&m);CHKERRQ(ierr); 1643f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(ll,&l);CHKERRQ(ierr); 1644e32f2f54SBarry Smith if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size"); 1645da3a660dSBarry Smith for (i=0; i<m; i++) { 1646da3a660dSBarry Smith x = l[i]; 1647ca15aa20SStefano Zampini v = vv + i; 1648b43bac26SStefano Zampini for (j=0; j<n; j++) { (*v) *= x; v+= mat->lda;} 1649da3a660dSBarry Smith } 1650f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(ll,&l);CHKERRQ(ierr); 1651eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr); 1652da3a660dSBarry Smith } 165328988994SBarry Smith if (rr) { 16547a97a34bSBarry Smith ierr = VecGetSize(rr,&n);CHKERRQ(ierr); 1655f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(rr,&r);CHKERRQ(ierr); 1656e32f2f54SBarry Smith if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size"); 1657da3a660dSBarry Smith for (i=0; i<n; i++) { 1658da3a660dSBarry Smith x = r[i]; 1659ca15aa20SStefano Zampini v = vv + i*mat->lda; 16602205254eSKarl Rupp for (j=0; j<m; j++) (*v++) *= x; 1661da3a660dSBarry Smith } 1662f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(rr,&r);CHKERRQ(ierr); 1663eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr); 1664da3a660dSBarry Smith } 1665ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&vv);CHKERRQ(ierr); 16663a40ed3dSBarry Smith PetscFunctionReturn(0); 1667289bc588SBarry Smith } 1668289bc588SBarry Smith 1669ca15aa20SStefano Zampini PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm) 1670289bc588SBarry Smith { 1671c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1672ca15aa20SStefano Zampini PetscScalar *v,*vv; 1673329f5518SBarry Smith PetscReal sum = 0.0; 1674d0f46423SBarry Smith PetscInt lda =mat->lda,m=A->rmap->n,i,j; 1675efee365bSSatish Balay PetscErrorCode ierr; 167655659b69SBarry Smith 16773a40ed3dSBarry Smith PetscFunctionBegin; 1678ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,(const PetscScalar**)&vv);CHKERRQ(ierr); 1679ca15aa20SStefano Zampini v = vv; 1680289bc588SBarry Smith if (type == NORM_FROBENIUS) { 1681a5ce6ee0Svictorle if (lda>m) { 1682d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1683ca15aa20SStefano Zampini v = vv+j*lda; 1684a5ce6ee0Svictorle for (i=0; i<m; i++) { 1685a5ce6ee0Svictorle sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1686a5ce6ee0Svictorle } 1687a5ce6ee0Svictorle } 1688a5ce6ee0Svictorle } else { 1689570b7f6dSBarry Smith #if defined(PETSC_USE_REAL___FP16) 1690570b7f6dSBarry Smith PetscBLASInt one = 1,cnt = A->cmap->n*A->rmap->n; 1691570b7f6dSBarry Smith *nrm = BLASnrm2_(&cnt,v,&one); 1692570b7f6dSBarry Smith } 1693570b7f6dSBarry Smith #else 1694d0f46423SBarry Smith for (i=0; i<A->cmap->n*A->rmap->n; i++) { 1695329f5518SBarry Smith sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1696289bc588SBarry Smith } 1697a5ce6ee0Svictorle } 16988f1a2a5eSBarry Smith *nrm = PetscSqrtReal(sum); 1699570b7f6dSBarry Smith #endif 1700dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 17013a40ed3dSBarry Smith } else if (type == NORM_1) { 1702064f8208SBarry Smith *nrm = 0.0; 1703d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1704ca15aa20SStefano Zampini v = vv + j*mat->lda; 1705289bc588SBarry Smith sum = 0.0; 1706d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 170733a8263dSBarry Smith sum += PetscAbsScalar(*v); v++; 1708289bc588SBarry Smith } 1709064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1710289bc588SBarry Smith } 1711eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 17123a40ed3dSBarry Smith } else if (type == NORM_INFINITY) { 1713064f8208SBarry Smith *nrm = 0.0; 1714d0f46423SBarry Smith for (j=0; j<A->rmap->n; j++) { 1715ca15aa20SStefano Zampini v = vv + j; 1716289bc588SBarry Smith sum = 0.0; 1717d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) { 17181b807ce4Svictorle sum += PetscAbsScalar(*v); v += mat->lda; 1719289bc588SBarry Smith } 1720064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1721289bc588SBarry Smith } 1722eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 1723e7e72b3dSBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm"); 1724ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,(const PetscScalar**)&vv);CHKERRQ(ierr); 17253a40ed3dSBarry Smith PetscFunctionReturn(0); 1726289bc588SBarry Smith } 1727289bc588SBarry Smith 1728e0877f53SBarry Smith static PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg) 1729289bc588SBarry Smith { 1730c0bbcb79SLois Curfman McInnes Mat_SeqDense *aij = (Mat_SeqDense*)A->data; 173163ba0a88SBarry Smith PetscErrorCode ierr; 173267e560aaSBarry Smith 17333a40ed3dSBarry Smith PetscFunctionBegin; 1734b5a2b587SKris Buschelman switch (op) { 1735b5a2b587SKris Buschelman case MAT_ROW_ORIENTED: 17364e0d8c25SBarry Smith aij->roworiented = flg; 1737b5a2b587SKris Buschelman break; 1738512a5fc5SBarry Smith case MAT_NEW_NONZERO_LOCATIONS: 1739b5a2b587SKris Buschelman case MAT_NEW_NONZERO_LOCATION_ERR: 17403971808eSMatthew Knepley case MAT_NEW_NONZERO_ALLOCATION_ERR: 17414e0d8c25SBarry Smith case MAT_NEW_DIAGONALS: 174213fa8e87SLisandro Dalcin case MAT_KEEP_NONZERO_PATTERN: 1743b5a2b587SKris Buschelman case MAT_IGNORE_OFF_PROC_ENTRIES: 1744b5a2b587SKris Buschelman case MAT_USE_HASH_TABLE: 17450f8fb01aSBarry Smith case MAT_IGNORE_ZERO_ENTRIES: 17465021d80fSJed Brown case MAT_IGNORE_LOWER_TRIANGULAR: 1747071fcb05SBarry Smith case MAT_SORTED_FULL: 17485021d80fSJed Brown ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr); 17495021d80fSJed Brown break; 17505021d80fSJed Brown case MAT_SPD: 175177e54ba9SKris Buschelman case MAT_SYMMETRIC: 175277e54ba9SKris Buschelman case MAT_STRUCTURALLY_SYMMETRIC: 17539a4540c5SBarry Smith case MAT_HERMITIAN: 17549a4540c5SBarry Smith case MAT_SYMMETRY_ETERNAL: 17555021d80fSJed Brown /* These options are handled directly by MatSetOption() */ 175677e54ba9SKris Buschelman break; 1757b5a2b587SKris Buschelman default: 1758e32f2f54SBarry Smith SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]); 17593a40ed3dSBarry Smith } 17603a40ed3dSBarry Smith PetscFunctionReturn(0); 1761289bc588SBarry Smith } 1762289bc588SBarry Smith 1763e0877f53SBarry Smith static PetscErrorCode MatZeroEntries_SeqDense(Mat A) 17646f0a148fSBarry Smith { 1765ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 17666849ba73SBarry Smith PetscErrorCode ierr; 1767d0f46423SBarry Smith PetscInt lda=l->lda,m=A->rmap->n,j; 1768ca15aa20SStefano Zampini PetscScalar *v; 17693a40ed3dSBarry Smith 17703a40ed3dSBarry Smith PetscFunctionBegin; 1771ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr); 1772a5ce6ee0Svictorle if (lda>m) { 1773d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1774ca15aa20SStefano Zampini ierr = PetscArrayzero(v+j*lda,m);CHKERRQ(ierr); 1775a5ce6ee0Svictorle } 1776a5ce6ee0Svictorle } else { 1777ca15aa20SStefano Zampini ierr = PetscArrayzero(v,A->rmap->n*A->cmap->n);CHKERRQ(ierr); 1778a5ce6ee0Svictorle } 1779ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr); 17803a40ed3dSBarry Smith PetscFunctionReturn(0); 17816f0a148fSBarry Smith } 17826f0a148fSBarry Smith 1783e0877f53SBarry Smith static PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b) 17846f0a148fSBarry Smith { 178597b48c8fSBarry Smith PetscErrorCode ierr; 1786ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 1787b9679d65SBarry Smith PetscInt m = l->lda, n = A->cmap->n, i,j; 1788ca15aa20SStefano Zampini PetscScalar *slot,*bb,*v; 178997b48c8fSBarry Smith const PetscScalar *xx; 179055659b69SBarry Smith 17913a40ed3dSBarry Smith PetscFunctionBegin; 1792b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG) 1793b9679d65SBarry Smith for (i=0; i<N; i++) { 1794b9679d65SBarry Smith if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed"); 1795b9679d65SBarry 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); 1796b9679d65SBarry Smith } 1797b9679d65SBarry Smith #endif 1798ca15aa20SStefano Zampini if (!N) PetscFunctionReturn(0); 1799b9679d65SBarry Smith 180097b48c8fSBarry Smith /* fix right hand side if needed */ 180197b48c8fSBarry Smith if (x && b) { 180297b48c8fSBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 180397b48c8fSBarry Smith ierr = VecGetArray(b,&bb);CHKERRQ(ierr); 18042205254eSKarl Rupp for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]]; 180597b48c8fSBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 180697b48c8fSBarry Smith ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr); 180797b48c8fSBarry Smith } 180897b48c8fSBarry Smith 1809ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr); 18106f0a148fSBarry Smith for (i=0; i<N; i++) { 1811ca15aa20SStefano Zampini slot = v + rows[i]; 1812b9679d65SBarry Smith for (j=0; j<n; j++) { *slot = 0.0; slot += m;} 18136f0a148fSBarry Smith } 1814f4df32b1SMatthew Knepley if (diag != 0.0) { 1815b9679d65SBarry Smith if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 18166f0a148fSBarry Smith for (i=0; i<N; i++) { 1817ca15aa20SStefano Zampini slot = v + (m+1)*rows[i]; 1818f4df32b1SMatthew Knepley *slot = diag; 18196f0a148fSBarry Smith } 18206f0a148fSBarry Smith } 1821ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr); 18223a40ed3dSBarry Smith PetscFunctionReturn(0); 18236f0a148fSBarry Smith } 1824557bce09SLois Curfman McInnes 182549a6ff4bSBarry Smith static PetscErrorCode MatDenseGetLDA_SeqDense(Mat A,PetscInt *lda) 182649a6ff4bSBarry Smith { 182749a6ff4bSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 182849a6ff4bSBarry Smith 182949a6ff4bSBarry Smith PetscFunctionBegin; 183049a6ff4bSBarry Smith *lda = mat->lda; 183149a6ff4bSBarry Smith PetscFunctionReturn(0); 183249a6ff4bSBarry Smith } 183349a6ff4bSBarry Smith 1834ca15aa20SStefano Zampini PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar *array[]) 183564e87e97SBarry Smith { 1836c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 18373a40ed3dSBarry Smith 18383a40ed3dSBarry Smith PetscFunctionBegin; 183964e87e97SBarry Smith *array = mat->v; 18403a40ed3dSBarry Smith PetscFunctionReturn(0); 184164e87e97SBarry Smith } 18420754003eSLois Curfman McInnes 1843ca15aa20SStefano Zampini PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar *array[]) 1844ff14e315SSatish Balay { 18453a40ed3dSBarry Smith PetscFunctionBegin; 18463a40ed3dSBarry Smith PetscFunctionReturn(0); 1847ff14e315SSatish Balay } 18480754003eSLois Curfman McInnes 1849dec5eb66SMatthew G Knepley /*@C 185049a6ff4bSBarry Smith MatDenseGetLDA - gets the leading dimension of the array returned from MatDenseGetArray() 185149a6ff4bSBarry Smith 185249a6ff4bSBarry Smith Logically Collective on Mat 185349a6ff4bSBarry Smith 185449a6ff4bSBarry Smith Input Parameter: 185549a6ff4bSBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 185649a6ff4bSBarry Smith 185749a6ff4bSBarry Smith Output Parameter: 185849a6ff4bSBarry Smith . lda - the leading dimension 185949a6ff4bSBarry Smith 186049a6ff4bSBarry Smith Level: intermediate 186149a6ff4bSBarry Smith 186249a6ff4bSBarry Smith .seealso: MatDenseGetArray(), MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead(), MatSeqDenseSetLDA() 186349a6ff4bSBarry Smith @*/ 186449a6ff4bSBarry Smith PetscErrorCode MatDenseGetLDA(Mat A,PetscInt *lda) 186549a6ff4bSBarry Smith { 186649a6ff4bSBarry Smith PetscErrorCode ierr; 186749a6ff4bSBarry Smith 186849a6ff4bSBarry Smith PetscFunctionBegin; 186949a6ff4bSBarry Smith ierr = PetscUseMethod(A,"MatDenseGetLDA_C",(Mat,PetscInt*),(A,lda));CHKERRQ(ierr); 187049a6ff4bSBarry Smith PetscFunctionReturn(0); 187149a6ff4bSBarry Smith } 187249a6ff4bSBarry Smith 187349a6ff4bSBarry Smith /*@C 18748c778c55SBarry Smith MatDenseGetArray - gives access to the array where the data for a SeqDense matrix is stored 187573a71a0fSBarry Smith 18768572280aSBarry Smith Logically Collective on Mat 187773a71a0fSBarry Smith 187873a71a0fSBarry Smith Input Parameter: 1879579dbff0SBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 188073a71a0fSBarry Smith 188173a71a0fSBarry Smith Output Parameter: 188273a71a0fSBarry Smith . array - pointer to the data 188373a71a0fSBarry Smith 188473a71a0fSBarry Smith Level: intermediate 188573a71a0fSBarry Smith 18868572280aSBarry Smith .seealso: MatDenseRestoreArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead() 188773a71a0fSBarry Smith @*/ 18888c778c55SBarry Smith PetscErrorCode MatDenseGetArray(Mat A,PetscScalar **array) 188973a71a0fSBarry Smith { 189073a71a0fSBarry Smith PetscErrorCode ierr; 189173a71a0fSBarry Smith 189273a71a0fSBarry Smith PetscFunctionBegin; 18938c778c55SBarry Smith ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 189473a71a0fSBarry Smith PetscFunctionReturn(0); 189573a71a0fSBarry Smith } 189673a71a0fSBarry Smith 1897dec5eb66SMatthew G Knepley /*@C 1898579dbff0SBarry Smith MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray() 189973a71a0fSBarry Smith 19008572280aSBarry Smith Logically Collective on Mat 19018572280aSBarry Smith 19028572280aSBarry Smith Input Parameters: 1903a2b725a8SWilliam Gropp + mat - a MATSEQDENSE or MATMPIDENSE matrix 1904a2b725a8SWilliam Gropp - array - pointer to the data 19058572280aSBarry Smith 19068572280aSBarry Smith Level: intermediate 19078572280aSBarry Smith 19088572280aSBarry Smith .seealso: MatDenseGetArray(), MatDenseGetArrayRead(), MatDenseRestoreArrayRead() 19098572280aSBarry Smith @*/ 19108572280aSBarry Smith PetscErrorCode MatDenseRestoreArray(Mat A,PetscScalar **array) 19118572280aSBarry Smith { 19128572280aSBarry Smith PetscErrorCode ierr; 19138572280aSBarry Smith 19148572280aSBarry Smith PetscFunctionBegin; 19158572280aSBarry Smith ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 19168572280aSBarry Smith if (array) *array = NULL; 19178572280aSBarry Smith ierr = PetscObjectStateIncrease((PetscObject)A);CHKERRQ(ierr); 19188572280aSBarry Smith PetscFunctionReturn(0); 19198572280aSBarry Smith } 19208572280aSBarry Smith 19218572280aSBarry Smith /*@C 19228572280aSBarry Smith MatDenseGetArrayRead - gives access to the array where the data for a SeqDense matrix is stored 19238572280aSBarry Smith 19248572280aSBarry Smith Not Collective 19258572280aSBarry Smith 19268572280aSBarry Smith Input Parameter: 19278572280aSBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 19288572280aSBarry Smith 19298572280aSBarry Smith Output Parameter: 19308572280aSBarry Smith . array - pointer to the data 19318572280aSBarry Smith 19328572280aSBarry Smith Level: intermediate 19338572280aSBarry Smith 19348572280aSBarry Smith .seealso: MatDenseRestoreArray(), MatDenseGetArray(), MatDenseRestoreArrayRead() 19358572280aSBarry Smith @*/ 19368572280aSBarry Smith PetscErrorCode MatDenseGetArrayRead(Mat A,const PetscScalar **array) 19378572280aSBarry Smith { 19388572280aSBarry Smith PetscErrorCode ierr; 19398572280aSBarry Smith 19408572280aSBarry Smith PetscFunctionBegin; 19418572280aSBarry Smith ierr = PetscUseMethod(A,"MatDenseGetArrayRead_C",(Mat,const PetscScalar**),(A,array));CHKERRQ(ierr); 19428572280aSBarry Smith PetscFunctionReturn(0); 19438572280aSBarry Smith } 19448572280aSBarry Smith 19458572280aSBarry Smith /*@C 19468572280aSBarry Smith MatDenseRestoreArrayRead - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray() 19478572280aSBarry Smith 194873a71a0fSBarry Smith Not Collective 194973a71a0fSBarry Smith 195073a71a0fSBarry Smith Input Parameters: 1951a2b725a8SWilliam Gropp + mat - a MATSEQDENSE or MATMPIDENSE matrix 1952a2b725a8SWilliam Gropp - array - pointer to the data 195373a71a0fSBarry Smith 195473a71a0fSBarry Smith Level: intermediate 195573a71a0fSBarry Smith 19568572280aSBarry Smith .seealso: MatDenseGetArray(), MatDenseGetArrayRead(), MatDenseRestoreArray() 195773a71a0fSBarry Smith @*/ 19588572280aSBarry Smith PetscErrorCode MatDenseRestoreArrayRead(Mat A,const PetscScalar **array) 195973a71a0fSBarry Smith { 196073a71a0fSBarry Smith PetscErrorCode ierr; 196173a71a0fSBarry Smith 196273a71a0fSBarry Smith PetscFunctionBegin; 19638572280aSBarry Smith ierr = PetscUseMethod(A,"MatDenseRestoreArrayRead_C",(Mat,const PetscScalar**),(A,array));CHKERRQ(ierr); 19648572280aSBarry Smith if (array) *array = NULL; 196573a71a0fSBarry Smith PetscFunctionReturn(0); 196673a71a0fSBarry Smith } 196773a71a0fSBarry Smith 19687dae84e0SHong Zhang static PetscErrorCode MatCreateSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B) 19690754003eSLois Curfman McInnes { 1970c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 19716849ba73SBarry Smith PetscErrorCode ierr; 1972ca15aa20SStefano Zampini PetscInt i,j,nrows,ncols,blda; 19735d0c19d7SBarry Smith const PetscInt *irow,*icol; 197487828ca2SBarry Smith PetscScalar *av,*bv,*v = mat->v; 19750754003eSLois Curfman McInnes Mat newmat; 19760754003eSLois Curfman McInnes 19773a40ed3dSBarry Smith PetscFunctionBegin; 197878b31e54SBarry Smith ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr); 197978b31e54SBarry Smith ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr); 1980e03a110bSBarry Smith ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr); 1981e03a110bSBarry Smith ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr); 19820754003eSLois Curfman McInnes 1983182d2002SSatish Balay /* Check submatrixcall */ 1984182d2002SSatish Balay if (scall == MAT_REUSE_MATRIX) { 198513f74950SBarry Smith PetscInt n_cols,n_rows; 1986182d2002SSatish Balay ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr); 198721a2c019SBarry Smith if (n_rows != nrows || n_cols != ncols) { 1988f746d493SDmitry Karpeev /* resize the result matrix to match number of requested rows/columns */ 1989c61587bbSBarry Smith ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 199021a2c019SBarry Smith } 1991182d2002SSatish Balay newmat = *B; 1992182d2002SSatish Balay } else { 19930754003eSLois Curfman McInnes /* Create and fill new matrix */ 1994ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr); 1995f69a0ea3SMatthew Knepley ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 19967adad957SLisandro Dalcin ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 19970298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr); 1998182d2002SSatish Balay } 1999182d2002SSatish Balay 2000182d2002SSatish Balay /* Now extract the data pointers and do the copy,column at a time */ 2001ca15aa20SStefano Zampini ierr = MatDenseGetArray(newmat,&bv);CHKERRQ(ierr); 2002ca15aa20SStefano Zampini ierr = MatDenseGetLDA(newmat,&blda);CHKERRQ(ierr); 2003182d2002SSatish Balay for (i=0; i<ncols; i++) { 20046de62eeeSBarry Smith av = v + mat->lda*icol[i]; 2005ca15aa20SStefano Zampini for (j=0; j<nrows; j++) bv[j] = av[irow[j]]; 2006ca15aa20SStefano Zampini bv += blda; 20070754003eSLois Curfman McInnes } 2008ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(newmat,&bv);CHKERRQ(ierr); 2009182d2002SSatish Balay 2010182d2002SSatish Balay /* Assemble the matrices so that the correct flags are set */ 20116d4a8577SBarry Smith ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 20126d4a8577SBarry Smith ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 20130754003eSLois Curfman McInnes 20140754003eSLois Curfman McInnes /* Free work space */ 201578b31e54SBarry Smith ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr); 201678b31e54SBarry Smith ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr); 2017182d2002SSatish Balay *B = newmat; 20183a40ed3dSBarry Smith PetscFunctionReturn(0); 20190754003eSLois Curfman McInnes } 20200754003eSLois Curfman McInnes 20217dae84e0SHong Zhang static PetscErrorCode MatCreateSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[]) 2022905e6a2fSBarry Smith { 20236849ba73SBarry Smith PetscErrorCode ierr; 202413f74950SBarry Smith PetscInt i; 2025905e6a2fSBarry Smith 20263a40ed3dSBarry Smith PetscFunctionBegin; 2027905e6a2fSBarry Smith if (scall == MAT_INITIAL_MATRIX) { 2028df750dc8SHong Zhang ierr = PetscCalloc1(n+1,B);CHKERRQ(ierr); 2029905e6a2fSBarry Smith } 2030905e6a2fSBarry Smith 2031905e6a2fSBarry Smith for (i=0; i<n; i++) { 20327dae84e0SHong Zhang ierr = MatCreateSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr); 2033905e6a2fSBarry Smith } 20343a40ed3dSBarry Smith PetscFunctionReturn(0); 2035905e6a2fSBarry Smith } 2036905e6a2fSBarry Smith 2037e0877f53SBarry Smith static PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode) 2038c0aa2d19SHong Zhang { 2039c0aa2d19SHong Zhang PetscFunctionBegin; 2040c0aa2d19SHong Zhang PetscFunctionReturn(0); 2041c0aa2d19SHong Zhang } 2042c0aa2d19SHong Zhang 2043e0877f53SBarry Smith static PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode) 2044c0aa2d19SHong Zhang { 2045c0aa2d19SHong Zhang PetscFunctionBegin; 2046c0aa2d19SHong Zhang PetscFunctionReturn(0); 2047c0aa2d19SHong Zhang } 2048c0aa2d19SHong Zhang 2049e0877f53SBarry Smith static PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str) 20504b0e389bSBarry Smith { 20514b0e389bSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data; 20526849ba73SBarry Smith PetscErrorCode ierr; 2053ca15aa20SStefano Zampini const PetscScalar *va; 2054ca15aa20SStefano Zampini PetscScalar *vb; 2055d0f46423SBarry Smith PetscInt lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j; 20563a40ed3dSBarry Smith 20573a40ed3dSBarry Smith PetscFunctionBegin; 205833f4a19fSKris Buschelman /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */ 205933f4a19fSKris Buschelman if (A->ops->copy != B->ops->copy) { 2060cb5b572fSBarry Smith ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr); 20613a40ed3dSBarry Smith PetscFunctionReturn(0); 20623a40ed3dSBarry Smith } 2063e32f2f54SBarry Smith if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)"); 2064ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&va);CHKERRQ(ierr); 2065ca15aa20SStefano Zampini ierr = MatDenseGetArray(B,&vb);CHKERRQ(ierr); 2066a5ce6ee0Svictorle if (lda1>m || lda2>m) { 20670dbb7854Svictorle for (j=0; j<n; j++) { 2068ca15aa20SStefano Zampini ierr = PetscArraycpy(vb+j*lda2,va+j*lda1,m);CHKERRQ(ierr); 2069a5ce6ee0Svictorle } 2070a5ce6ee0Svictorle } else { 2071ca15aa20SStefano Zampini ierr = PetscArraycpy(vb,va,A->rmap->n*A->cmap->n);CHKERRQ(ierr); 2072a5ce6ee0Svictorle } 2073ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(B,&vb);CHKERRQ(ierr); 2074ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&va);CHKERRQ(ierr); 2075ca15aa20SStefano Zampini ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2076ca15aa20SStefano Zampini ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2077273d9f13SBarry Smith PetscFunctionReturn(0); 2078273d9f13SBarry Smith } 2079273d9f13SBarry Smith 2080e0877f53SBarry Smith static PetscErrorCode MatSetUp_SeqDense(Mat A) 2081273d9f13SBarry Smith { 2082dfbe8321SBarry Smith PetscErrorCode ierr; 2083273d9f13SBarry Smith 2084273d9f13SBarry Smith PetscFunctionBegin; 2085273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr); 20863a40ed3dSBarry Smith PetscFunctionReturn(0); 20874b0e389bSBarry Smith } 20884b0e389bSBarry Smith 2089ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A) 2090ba337c44SJed Brown { 2091ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 2092ca15aa20SStefano Zampini PetscScalar *aa; 2093ca15aa20SStefano Zampini PetscErrorCode ierr; 2094ba337c44SJed Brown 2095ba337c44SJed Brown PetscFunctionBegin; 2096ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&aa);CHKERRQ(ierr); 2097ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]); 2098ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&aa);CHKERRQ(ierr); 2099ba337c44SJed Brown PetscFunctionReturn(0); 2100ba337c44SJed Brown } 2101ba337c44SJed Brown 2102ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A) 2103ba337c44SJed Brown { 2104ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 2105ca15aa20SStefano Zampini PetscScalar *aa; 2106ca15aa20SStefano Zampini PetscErrorCode ierr; 2107ba337c44SJed Brown 2108ba337c44SJed Brown PetscFunctionBegin; 2109ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&aa);CHKERRQ(ierr); 2110ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]); 2111ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&aa);CHKERRQ(ierr); 2112ba337c44SJed Brown PetscFunctionReturn(0); 2113ba337c44SJed Brown } 2114ba337c44SJed Brown 2115ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A) 2116ba337c44SJed Brown { 2117ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 2118ca15aa20SStefano Zampini PetscScalar *aa; 2119ca15aa20SStefano Zampini PetscErrorCode ierr; 2120ba337c44SJed Brown 2121ba337c44SJed Brown PetscFunctionBegin; 2122ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&aa);CHKERRQ(ierr); 2123ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]); 2124ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&aa);CHKERRQ(ierr); 2125ba337c44SJed Brown PetscFunctionReturn(0); 2126ba337c44SJed Brown } 2127284134d9SBarry Smith 2128a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/ 2129150d2497SBarry Smith PETSC_INTERN PetscErrorCode MatMatMult_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_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 2136a9fe9ddaSSatish Balay ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 21373ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 2138a9fe9ddaSSatish Balay } 21393ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr); 2140ca15aa20SStefano Zampini if ((*C)->ops->matmultnumeric) { 2141ca15aa20SStefano Zampini ierr = (*(*C)->ops->matmultnumeric)(A,B,*C);CHKERRQ(ierr); 2142ca15aa20SStefano Zampini } else { 2143a9fe9ddaSSatish Balay ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 2144ca15aa20SStefano Zampini } 21453ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr); 2146a9fe9ddaSSatish Balay PetscFunctionReturn(0); 2147a9fe9ddaSSatish Balay } 2148a9fe9ddaSSatish Balay 2149a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 2150a9fe9ddaSSatish Balay { 2151ee16a9a1SHong Zhang PetscErrorCode ierr; 2152d0f46423SBarry Smith PetscInt m=A->rmap->n,n=B->cmap->n; 2153ee16a9a1SHong Zhang Mat Cmat; 2154ca15aa20SStefano Zampini PetscBool flg; 2155a9fe9ddaSSatish Balay 2156ee16a9a1SHong Zhang PetscFunctionBegin; 2157ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 2158ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 2159ca15aa20SStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)B,((PetscObject)A)->type_name,&flg);CHKERRQ(ierr); 2160ca15aa20SStefano Zampini ierr = MatSetType(Cmat,flg ? ((PetscObject)A)->type_name : MATDENSE);CHKERRQ(ierr); 21610298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr); 2162ee16a9a1SHong Zhang *C = Cmat; 2163ee16a9a1SHong Zhang PetscFunctionReturn(0); 2164ee16a9a1SHong Zhang } 2165a9fe9ddaSSatish Balay 2166a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 2167a9fe9ddaSSatish Balay { 2168*52c5f739Sprj- Mat_SeqDense *a,*b=(Mat_SeqDense*)B->data,*c=(Mat_SeqDense*)C->data; 21690805154bSBarry Smith PetscBLASInt m,n,k; 2170ca15aa20SStefano Zampini const PetscScalar *av,*bv; 2171ca15aa20SStefano Zampini PetscScalar *cv; 2172a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 2173c5df96a5SBarry Smith PetscErrorCode ierr; 2174fd4e9aacSBarry Smith PetscBool flg; 2175a9fe9ddaSSatish Balay 2176a9fe9ddaSSatish Balay PetscFunctionBegin; 2177fd4e9aacSBarry Smith /* Handle case where where user provided the final C matrix rather than calling MatMatMult() with MAT_INITIAL_MATRIX*/ 2178fd4e9aacSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&flg);CHKERRQ(ierr); 2179fd4e9aacSBarry Smith if (flg) { 2180fd4e9aacSBarry Smith C->ops->matmultnumeric = MatMatMultNumeric_SeqAIJ_SeqDense; 2181fd4e9aacSBarry Smith ierr = (*C->ops->matmultnumeric)(A,B,C);CHKERRQ(ierr); 2182fd4e9aacSBarry Smith PetscFunctionReturn(0); 2183fd4e9aacSBarry Smith } 2184a001520aSPierre Jolivet ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQBAIJ,&flg);CHKERRQ(ierr); 2185a001520aSPierre Jolivet if (flg) { 2186a001520aSPierre Jolivet C->ops->matmultnumeric = MatMatMultNumeric_SeqBAIJ_SeqDense; 2187a001520aSPierre Jolivet ierr = (*C->ops->matmultnumeric)(A,B,C);CHKERRQ(ierr); 2188a001520aSPierre Jolivet PetscFunctionReturn(0); 2189a001520aSPierre Jolivet } 2190*52c5f739Sprj- ierr = PetscObjectTypeCompare((PetscObject)A,MATNEST,&flg);CHKERRQ(ierr); 2191*52c5f739Sprj- if (flg) { 2192*52c5f739Sprj- C->ops->matmultnumeric = MatMatMultNumeric_Nest_Dense; 2193*52c5f739Sprj- ierr = (*C->ops->matmultnumeric)(A,B,C);CHKERRQ(ierr); 2194*52c5f739Sprj- PetscFunctionReturn(0); 2195*52c5f739Sprj- } 2196*52c5f739Sprj- a = (Mat_SeqDense*)A->data; 21978208b9aeSStefano Zampini ierr = PetscBLASIntCast(C->rmap->n,&m);CHKERRQ(ierr); 21988208b9aeSStefano Zampini ierr = PetscBLASIntCast(C->cmap->n,&n);CHKERRQ(ierr); 2199c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr); 220049d0e964SStefano Zampini if (!m || !n || !k) PetscFunctionReturn(0); 2201ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&av);CHKERRQ(ierr); 2202ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(B,&bv);CHKERRQ(ierr); 2203ca15aa20SStefano Zampini ierr = MatDenseGetArray(C,&cv);CHKERRQ(ierr); 2204ca15aa20SStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("N","N",&m,&n,&k,&_DOne,av,&a->lda,bv,&b->lda,&_DZero,cv,&c->lda)); 2205ca15aa20SStefano Zampini ierr = PetscLogFlops(1.0*m*n*k + 1.0*m*n*(k-1));CHKERRQ(ierr); 2206ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&av);CHKERRQ(ierr); 2207ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(B,&bv);CHKERRQ(ierr); 2208ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(C,&cv);CHKERRQ(ierr); 2209a9fe9ddaSSatish Balay PetscFunctionReturn(0); 2210a9fe9ddaSSatish Balay } 2211a9fe9ddaSSatish Balay 221269f65d41SStefano Zampini PetscErrorCode MatMatTransposeMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 221369f65d41SStefano Zampini { 221469f65d41SStefano Zampini PetscErrorCode ierr; 221569f65d41SStefano Zampini 221669f65d41SStefano Zampini PetscFunctionBegin; 221769f65d41SStefano Zampini if (scall == MAT_INITIAL_MATRIX) { 221869f65d41SStefano Zampini ierr = PetscLogEventBegin(MAT_MatTransposeMultSymbolic,A,B,0,0);CHKERRQ(ierr); 221969f65d41SStefano Zampini ierr = MatMatTransposeMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 222069f65d41SStefano Zampini ierr = PetscLogEventEnd(MAT_MatTransposeMultSymbolic,A,B,0,0);CHKERRQ(ierr); 222169f65d41SStefano Zampini } 222269f65d41SStefano Zampini ierr = PetscLogEventBegin(MAT_MatTransposeMultNumeric,A,B,0,0);CHKERRQ(ierr); 222369f65d41SStefano Zampini ierr = MatMatTransposeMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 222469f65d41SStefano Zampini ierr = PetscLogEventEnd(MAT_MatTransposeMultNumeric,A,B,0,0);CHKERRQ(ierr); 222569f65d41SStefano Zampini PetscFunctionReturn(0); 222669f65d41SStefano Zampini } 222769f65d41SStefano Zampini 222869f65d41SStefano Zampini PetscErrorCode MatMatTransposeMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 222969f65d41SStefano Zampini { 223069f65d41SStefano Zampini PetscErrorCode ierr; 223169f65d41SStefano Zampini PetscInt m=A->rmap->n,n=B->rmap->n; 223269f65d41SStefano Zampini Mat Cmat; 2233ca15aa20SStefano Zampini PetscBool flg; 223469f65d41SStefano Zampini 223569f65d41SStefano Zampini PetscFunctionBegin; 223669f65d41SStefano Zampini ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 223769f65d41SStefano Zampini ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 2238ca15aa20SStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)B,((PetscObject)A)->type_name,&flg);CHKERRQ(ierr); 2239ca15aa20SStefano Zampini ierr = MatSetType(Cmat,flg ? ((PetscObject)A)->type_name : MATDENSE);CHKERRQ(ierr); 224069f65d41SStefano Zampini ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr); 224169f65d41SStefano Zampini *C = Cmat; 224269f65d41SStefano Zampini PetscFunctionReturn(0); 224369f65d41SStefano Zampini } 224469f65d41SStefano Zampini 224569f65d41SStefano Zampini PetscErrorCode MatMatTransposeMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 224669f65d41SStefano Zampini { 224769f65d41SStefano Zampini Mat_SeqDense *a = (Mat_SeqDense*)A->data; 224869f65d41SStefano Zampini Mat_SeqDense *b = (Mat_SeqDense*)B->data; 224969f65d41SStefano Zampini Mat_SeqDense *c = (Mat_SeqDense*)C->data; 225069f65d41SStefano Zampini PetscBLASInt m,n,k; 225169f65d41SStefano Zampini PetscScalar _DOne=1.0,_DZero=0.0; 225269f65d41SStefano Zampini PetscErrorCode ierr; 225369f65d41SStefano Zampini 225469f65d41SStefano Zampini PetscFunctionBegin; 225549d0e964SStefano Zampini ierr = PetscBLASIntCast(C->rmap->n,&m);CHKERRQ(ierr); 225649d0e964SStefano Zampini ierr = PetscBLASIntCast(C->cmap->n,&n);CHKERRQ(ierr); 225769f65d41SStefano Zampini ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr); 225849d0e964SStefano Zampini if (!m || !n || !k) PetscFunctionReturn(0); 225969f65d41SStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("N","T",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda)); 2260ca15aa20SStefano Zampini ierr = PetscLogFlops(1.0*m*n*k + 1.0*m*n*(k-1));CHKERRQ(ierr); 226169f65d41SStefano Zampini PetscFunctionReturn(0); 226269f65d41SStefano Zampini } 226369f65d41SStefano Zampini 226475648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 2265a9fe9ddaSSatish Balay { 2266a9fe9ddaSSatish Balay PetscErrorCode ierr; 2267a9fe9ddaSSatish Balay 2268a9fe9ddaSSatish Balay PetscFunctionBegin; 2269a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX) { 22703ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 227175648e8dSHong Zhang ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 22723ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 2273a9fe9ddaSSatish Balay } 22743ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr); 227575648e8dSHong Zhang ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 22763ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr); 2277a9fe9ddaSSatish Balay PetscFunctionReturn(0); 2278a9fe9ddaSSatish Balay } 2279a9fe9ddaSSatish Balay 228075648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 2281a9fe9ddaSSatish Balay { 2282ee16a9a1SHong Zhang PetscErrorCode ierr; 2283d0f46423SBarry Smith PetscInt m=A->cmap->n,n=B->cmap->n; 2284ee16a9a1SHong Zhang Mat Cmat; 2285ca15aa20SStefano Zampini PetscBool flg; 2286a9fe9ddaSSatish Balay 2287ee16a9a1SHong Zhang PetscFunctionBegin; 2288ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 2289ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 2290ca15aa20SStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)B,((PetscObject)A)->type_name,&flg);CHKERRQ(ierr); 2291ca15aa20SStefano Zampini ierr = MatSetType(Cmat,flg ? ((PetscObject)A)->type_name : MATDENSE);CHKERRQ(ierr); 22920298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr); 2293ee16a9a1SHong Zhang *C = Cmat; 2294ee16a9a1SHong Zhang PetscFunctionReturn(0); 2295ee16a9a1SHong Zhang } 2296a9fe9ddaSSatish Balay 229775648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 2298a9fe9ddaSSatish Balay { 2299a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2300a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 2301a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 23020805154bSBarry Smith PetscBLASInt m,n,k; 2303a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 2304c5df96a5SBarry Smith PetscErrorCode ierr; 2305a9fe9ddaSSatish Balay 2306a9fe9ddaSSatish Balay PetscFunctionBegin; 23078208b9aeSStefano Zampini ierr = PetscBLASIntCast(C->rmap->n,&m);CHKERRQ(ierr); 23088208b9aeSStefano Zampini ierr = PetscBLASIntCast(C->cmap->n,&n);CHKERRQ(ierr); 2309c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr); 231049d0e964SStefano Zampini if (!m || !n || !k) PetscFunctionReturn(0); 23115ca1cc5dSStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda)); 2312ca15aa20SStefano Zampini ierr = PetscLogFlops(1.0*m*n*k + 1.0*m*n*(k-1));CHKERRQ(ierr); 2313a9fe9ddaSSatish Balay PetscFunctionReturn(0); 2314a9fe9ddaSSatish Balay } 2315985db425SBarry Smith 2316e0877f53SBarry Smith static PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[]) 2317985db425SBarry Smith { 2318985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2319985db425SBarry Smith PetscErrorCode ierr; 2320d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 2321985db425SBarry Smith PetscScalar *x; 2322ca15aa20SStefano Zampini const PetscScalar *aa; 2323985db425SBarry Smith 2324985db425SBarry Smith PetscFunctionBegin; 2325e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2326985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2327985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 2328ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&aa);CHKERRQ(ierr); 2329e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2330985db425SBarry Smith for (i=0; i<m; i++) { 2331985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 2332985db425SBarry Smith for (j=1; j<n; j++) { 2333ca15aa20SStefano Zampini if (PetscRealPart(x[i]) < PetscRealPart(aa[i+a->lda*j])) {x[i] = aa[i + a->lda*j]; if (idx) idx[i] = j;} 2334985db425SBarry Smith } 2335985db425SBarry Smith } 2336ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&aa);CHKERRQ(ierr); 2337985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2338985db425SBarry Smith PetscFunctionReturn(0); 2339985db425SBarry Smith } 2340985db425SBarry Smith 2341e0877f53SBarry Smith static PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[]) 2342985db425SBarry Smith { 2343985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2344985db425SBarry Smith PetscErrorCode ierr; 2345d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 2346985db425SBarry Smith PetscScalar *x; 2347985db425SBarry Smith PetscReal atmp; 2348ca15aa20SStefano Zampini const PetscScalar *aa; 2349985db425SBarry Smith 2350985db425SBarry Smith PetscFunctionBegin; 2351e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2352985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2353985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 2354ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&aa);CHKERRQ(ierr); 2355e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2356985db425SBarry Smith for (i=0; i<m; i++) { 23579189402eSHong Zhang x[i] = PetscAbsScalar(aa[i]); 2358985db425SBarry Smith for (j=1; j<n; j++) { 2359ca15aa20SStefano Zampini atmp = PetscAbsScalar(aa[i+a->lda*j]); 2360985db425SBarry Smith if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;} 2361985db425SBarry Smith } 2362985db425SBarry Smith } 2363ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&aa);CHKERRQ(ierr); 2364985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2365985db425SBarry Smith PetscFunctionReturn(0); 2366985db425SBarry Smith } 2367985db425SBarry Smith 2368e0877f53SBarry Smith static PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[]) 2369985db425SBarry Smith { 2370985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2371985db425SBarry Smith PetscErrorCode ierr; 2372d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 2373985db425SBarry Smith PetscScalar *x; 2374ca15aa20SStefano Zampini const PetscScalar *aa; 2375985db425SBarry Smith 2376985db425SBarry Smith PetscFunctionBegin; 2377e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2378ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&aa);CHKERRQ(ierr); 2379985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2380985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 2381e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2382985db425SBarry Smith for (i=0; i<m; i++) { 2383985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 2384985db425SBarry Smith for (j=1; j<n; j++) { 2385ca15aa20SStefano Zampini if (PetscRealPart(x[i]) > PetscRealPart(aa[i+a->lda*j])) {x[i] = aa[i + a->lda*j]; if (idx) idx[i] = j;} 2386985db425SBarry Smith } 2387985db425SBarry Smith } 2388985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2389ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&aa);CHKERRQ(ierr); 2390985db425SBarry Smith PetscFunctionReturn(0); 2391985db425SBarry Smith } 2392985db425SBarry Smith 2393e0877f53SBarry Smith static PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col) 23948d0534beSBarry Smith { 23958d0534beSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 23968d0534beSBarry Smith PetscErrorCode ierr; 23978d0534beSBarry Smith PetscScalar *x; 2398ca15aa20SStefano Zampini const PetscScalar *aa; 23998d0534beSBarry Smith 24008d0534beSBarry Smith PetscFunctionBegin; 2401e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2402ca15aa20SStefano Zampini ierr = MatDenseGetArrayRead(A,&aa);CHKERRQ(ierr); 24038d0534beSBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2404ca15aa20SStefano Zampini ierr = PetscArraycpy(x,aa+col*a->lda,A->rmap->n);CHKERRQ(ierr); 24058d0534beSBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2406ca15aa20SStefano Zampini ierr = MatDenseRestoreArrayRead(A,&aa);CHKERRQ(ierr); 24078d0534beSBarry Smith PetscFunctionReturn(0); 24088d0534beSBarry Smith } 24098d0534beSBarry Smith 2410*52c5f739Sprj- PETSC_INTERN PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms) 24110716a85fSBarry Smith { 24120716a85fSBarry Smith PetscErrorCode ierr; 24130716a85fSBarry Smith PetscInt i,j,m,n; 24141683a169SBarry Smith const PetscScalar *a; 24150716a85fSBarry Smith 24160716a85fSBarry Smith PetscFunctionBegin; 24170716a85fSBarry Smith ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr); 2418580bdb30SBarry Smith ierr = PetscArrayzero(norms,n);CHKERRQ(ierr); 24191683a169SBarry Smith ierr = MatDenseGetArrayRead(A,&a);CHKERRQ(ierr); 24200716a85fSBarry Smith if (type == NORM_2) { 24210716a85fSBarry Smith for (i=0; i<n; i++) { 24220716a85fSBarry Smith for (j=0; j<m; j++) { 24230716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]*a[j]); 24240716a85fSBarry Smith } 24250716a85fSBarry Smith a += m; 24260716a85fSBarry Smith } 24270716a85fSBarry Smith } else if (type == NORM_1) { 24280716a85fSBarry Smith for (i=0; i<n; i++) { 24290716a85fSBarry Smith for (j=0; j<m; j++) { 24300716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]); 24310716a85fSBarry Smith } 24320716a85fSBarry Smith a += m; 24330716a85fSBarry Smith } 24340716a85fSBarry Smith } else if (type == NORM_INFINITY) { 24350716a85fSBarry Smith for (i=0; i<n; i++) { 24360716a85fSBarry Smith for (j=0; j<m; j++) { 24370716a85fSBarry Smith norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]); 24380716a85fSBarry Smith } 24390716a85fSBarry Smith a += m; 24400716a85fSBarry Smith } 2441ce94432eSBarry Smith } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType"); 24421683a169SBarry Smith ierr = MatDenseRestoreArrayRead(A,&a);CHKERRQ(ierr); 24430716a85fSBarry Smith if (type == NORM_2) { 24448f1a2a5eSBarry Smith for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]); 24450716a85fSBarry Smith } 24460716a85fSBarry Smith PetscFunctionReturn(0); 24470716a85fSBarry Smith } 24480716a85fSBarry Smith 244973a71a0fSBarry Smith static PetscErrorCode MatSetRandom_SeqDense(Mat x,PetscRandom rctx) 245073a71a0fSBarry Smith { 245173a71a0fSBarry Smith PetscErrorCode ierr; 245273a71a0fSBarry Smith PetscScalar *a; 245373a71a0fSBarry Smith PetscInt m,n,i; 245473a71a0fSBarry Smith 245573a71a0fSBarry Smith PetscFunctionBegin; 245673a71a0fSBarry Smith ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr); 24578c778c55SBarry Smith ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr); 245873a71a0fSBarry Smith for (i=0; i<m*n; i++) { 245973a71a0fSBarry Smith ierr = PetscRandomGetValue(rctx,a+i);CHKERRQ(ierr); 246073a71a0fSBarry Smith } 24618c778c55SBarry Smith ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr); 246273a71a0fSBarry Smith PetscFunctionReturn(0); 246373a71a0fSBarry Smith } 246473a71a0fSBarry Smith 24653b49f96aSBarry Smith static PetscErrorCode MatMissingDiagonal_SeqDense(Mat A,PetscBool *missing,PetscInt *d) 24663b49f96aSBarry Smith { 24673b49f96aSBarry Smith PetscFunctionBegin; 24683b49f96aSBarry Smith *missing = PETSC_FALSE; 24693b49f96aSBarry Smith PetscFunctionReturn(0); 24703b49f96aSBarry Smith } 247173a71a0fSBarry Smith 2472ca15aa20SStefano Zampini /* vals is not const */ 2473af53bab2SHong Zhang static PetscErrorCode MatDenseGetColumn_SeqDense(Mat A,PetscInt col,PetscScalar **vals) 247486aefd0dSHong Zhang { 2475ca15aa20SStefano Zampini PetscErrorCode ierr; 247686aefd0dSHong Zhang Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2477ca15aa20SStefano Zampini PetscScalar *v; 247886aefd0dSHong Zhang 247986aefd0dSHong Zhang PetscFunctionBegin; 248086aefd0dSHong Zhang if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2481ca15aa20SStefano Zampini ierr = MatDenseGetArray(A,&v);CHKERRQ(ierr); 2482ca15aa20SStefano Zampini *vals = v+col*a->lda; 2483ca15aa20SStefano Zampini ierr = MatDenseRestoreArray(A,&v);CHKERRQ(ierr); 248486aefd0dSHong Zhang PetscFunctionReturn(0); 248586aefd0dSHong Zhang } 248686aefd0dSHong Zhang 2487af53bab2SHong Zhang static PetscErrorCode MatDenseRestoreColumn_SeqDense(Mat A,PetscScalar **vals) 248886aefd0dSHong Zhang { 248986aefd0dSHong Zhang PetscFunctionBegin; 249086aefd0dSHong Zhang *vals = 0; /* user cannot accidently use the array later */ 249186aefd0dSHong Zhang PetscFunctionReturn(0); 249286aefd0dSHong Zhang } 2493abc3b08eSStefano Zampini 2494289bc588SBarry Smith /* -------------------------------------------------------------------*/ 2495a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense, 2496905e6a2fSBarry Smith MatGetRow_SeqDense, 2497905e6a2fSBarry Smith MatRestoreRow_SeqDense, 2498905e6a2fSBarry Smith MatMult_SeqDense, 249997304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense, 25007c922b88SBarry Smith MatMultTranspose_SeqDense, 25017c922b88SBarry Smith MatMultTransposeAdd_SeqDense, 2502db4efbfdSBarry Smith 0, 2503db4efbfdSBarry Smith 0, 2504db4efbfdSBarry Smith 0, 2505db4efbfdSBarry Smith /* 10*/ 0, 2506905e6a2fSBarry Smith MatLUFactor_SeqDense, 2507905e6a2fSBarry Smith MatCholeskyFactor_SeqDense, 250841f059aeSBarry Smith MatSOR_SeqDense, 2509ec8511deSBarry Smith MatTranspose_SeqDense, 251097304618SKris Buschelman /* 15*/ MatGetInfo_SeqDense, 2511905e6a2fSBarry Smith MatEqual_SeqDense, 2512905e6a2fSBarry Smith MatGetDiagonal_SeqDense, 2513905e6a2fSBarry Smith MatDiagonalScale_SeqDense, 2514905e6a2fSBarry Smith MatNorm_SeqDense, 2515c0aa2d19SHong Zhang /* 20*/ MatAssemblyBegin_SeqDense, 2516c0aa2d19SHong Zhang MatAssemblyEnd_SeqDense, 2517905e6a2fSBarry Smith MatSetOption_SeqDense, 2518905e6a2fSBarry Smith MatZeroEntries_SeqDense, 2519d519adbfSMatthew Knepley /* 24*/ MatZeroRows_SeqDense, 2520db4efbfdSBarry Smith 0, 2521db4efbfdSBarry Smith 0, 2522db4efbfdSBarry Smith 0, 2523db4efbfdSBarry Smith 0, 25244994cf47SJed Brown /* 29*/ MatSetUp_SeqDense, 2525273d9f13SBarry Smith 0, 2526905e6a2fSBarry Smith 0, 252773a71a0fSBarry Smith 0, 252873a71a0fSBarry Smith 0, 2529d519adbfSMatthew Knepley /* 34*/ MatDuplicate_SeqDense, 2530a5ae1ecdSBarry Smith 0, 2531a5ae1ecdSBarry Smith 0, 2532a5ae1ecdSBarry Smith 0, 2533a5ae1ecdSBarry Smith 0, 2534d519adbfSMatthew Knepley /* 39*/ MatAXPY_SeqDense, 25357dae84e0SHong Zhang MatCreateSubMatrices_SeqDense, 2536a5ae1ecdSBarry Smith 0, 25374b0e389bSBarry Smith MatGetValues_SeqDense, 2538a5ae1ecdSBarry Smith MatCopy_SeqDense, 2539d519adbfSMatthew Knepley /* 44*/ MatGetRowMax_SeqDense, 2540a5ae1ecdSBarry Smith MatScale_SeqDense, 25417d68702bSBarry Smith MatShift_Basic, 2542a5ae1ecdSBarry Smith 0, 25433f49a652SStefano Zampini MatZeroRowsColumns_SeqDense, 254473a71a0fSBarry Smith /* 49*/ MatSetRandom_SeqDense, 2545a5ae1ecdSBarry Smith 0, 2546a5ae1ecdSBarry Smith 0, 2547a5ae1ecdSBarry Smith 0, 2548a5ae1ecdSBarry Smith 0, 2549d519adbfSMatthew Knepley /* 54*/ 0, 2550a5ae1ecdSBarry Smith 0, 2551a5ae1ecdSBarry Smith 0, 2552a5ae1ecdSBarry Smith 0, 2553a5ae1ecdSBarry Smith 0, 2554d519adbfSMatthew Knepley /* 59*/ 0, 2555e03a110bSBarry Smith MatDestroy_SeqDense, 2556e03a110bSBarry Smith MatView_SeqDense, 2557357abbc8SBarry Smith 0, 255897304618SKris Buschelman 0, 2559d519adbfSMatthew Knepley /* 64*/ 0, 256097304618SKris Buschelman 0, 256197304618SKris Buschelman 0, 256297304618SKris Buschelman 0, 256397304618SKris Buschelman 0, 2564d519adbfSMatthew Knepley /* 69*/ MatGetRowMaxAbs_SeqDense, 256597304618SKris Buschelman 0, 256697304618SKris Buschelman 0, 256797304618SKris Buschelman 0, 256897304618SKris Buschelman 0, 2569d519adbfSMatthew Knepley /* 74*/ 0, 257097304618SKris Buschelman 0, 257197304618SKris Buschelman 0, 257297304618SKris Buschelman 0, 257397304618SKris Buschelman 0, 2574d519adbfSMatthew Knepley /* 79*/ 0, 257597304618SKris Buschelman 0, 257697304618SKris Buschelman 0, 257797304618SKris Buschelman 0, 25785bba2384SShri Abhyankar /* 83*/ MatLoad_SeqDense, 2579865e5f61SKris Buschelman 0, 25801cbb95d3SBarry Smith MatIsHermitian_SeqDense, 2581865e5f61SKris Buschelman 0, 2582865e5f61SKris Buschelman 0, 2583865e5f61SKris Buschelman 0, 2584d519adbfSMatthew Knepley /* 89*/ MatMatMult_SeqDense_SeqDense, 2585a9fe9ddaSSatish Balay MatMatMultSymbolic_SeqDense_SeqDense, 2586a9fe9ddaSSatish Balay MatMatMultNumeric_SeqDense_SeqDense, 2587abc3b08eSStefano Zampini MatPtAP_SeqDense_SeqDense, 2588abc3b08eSStefano Zampini MatPtAPSymbolic_SeqDense_SeqDense, 2589abc3b08eSStefano Zampini /* 94*/ MatPtAPNumeric_SeqDense_SeqDense, 259069f65d41SStefano Zampini MatMatTransposeMult_SeqDense_SeqDense, 259169f65d41SStefano Zampini MatMatTransposeMultSymbolic_SeqDense_SeqDense, 259269f65d41SStefano Zampini MatMatTransposeMultNumeric_SeqDense_SeqDense, 2593284134d9SBarry Smith 0, 2594d519adbfSMatthew Knepley /* 99*/ 0, 2595284134d9SBarry Smith 0, 2596284134d9SBarry Smith 0, 2597ba337c44SJed Brown MatConjugate_SeqDense, 2598f73d5cc4SBarry Smith 0, 2599ba337c44SJed Brown /*104*/ 0, 2600ba337c44SJed Brown MatRealPart_SeqDense, 2601ba337c44SJed Brown MatImaginaryPart_SeqDense, 2602985db425SBarry Smith 0, 2603985db425SBarry Smith 0, 26048208b9aeSStefano Zampini /*109*/ 0, 2605985db425SBarry Smith 0, 26068d0534beSBarry Smith MatGetRowMin_SeqDense, 2607aabbc4fbSShri Abhyankar MatGetColumnVector_SeqDense, 26083b49f96aSBarry Smith MatMissingDiagonal_SeqDense, 2609aabbc4fbSShri Abhyankar /*114*/ 0, 2610aabbc4fbSShri Abhyankar 0, 2611aabbc4fbSShri Abhyankar 0, 2612aabbc4fbSShri Abhyankar 0, 2613aabbc4fbSShri Abhyankar 0, 2614aabbc4fbSShri Abhyankar /*119*/ 0, 2615aabbc4fbSShri Abhyankar 0, 2616aabbc4fbSShri Abhyankar 0, 26170716a85fSBarry Smith 0, 26180716a85fSBarry Smith 0, 26190716a85fSBarry Smith /*124*/ 0, 26205df89d91SHong Zhang MatGetColumnNorms_SeqDense, 26215df89d91SHong Zhang 0, 26225df89d91SHong Zhang 0, 26235df89d91SHong Zhang 0, 26245df89d91SHong Zhang /*129*/ 0, 262575648e8dSHong Zhang MatTransposeMatMult_SeqDense_SeqDense, 262675648e8dSHong Zhang MatTransposeMatMultSymbolic_SeqDense_SeqDense, 262775648e8dSHong Zhang MatTransposeMatMultNumeric_SeqDense_SeqDense, 26283964eb88SJed Brown 0, 26293964eb88SJed Brown /*134*/ 0, 26303964eb88SJed Brown 0, 26313964eb88SJed Brown 0, 26323964eb88SJed Brown 0, 26333964eb88SJed Brown 0, 26343964eb88SJed Brown /*139*/ 0, 2635f9426fe0SMark Adams 0, 2636d528f656SJakub Kruzik 0, 2637d528f656SJakub Kruzik 0, 2638d528f656SJakub Kruzik 0, 2639d528f656SJakub Kruzik /*144*/ MatCreateMPIMatConcatenateSeqMat_SeqDense 2640985db425SBarry Smith }; 264190ace30eSBarry Smith 26424b828684SBarry Smith /*@C 2643fafbff53SBarry Smith MatCreateSeqDense - Creates a sequential dense matrix that 2644d65003e9SLois Curfman McInnes is stored in column major order (the usual Fortran 77 manner). Many 2645d65003e9SLois Curfman McInnes of the matrix operations use the BLAS and LAPACK routines. 2646289bc588SBarry Smith 2647d083f849SBarry Smith Collective 2648db81eaa0SLois Curfman McInnes 264920563c6bSBarry Smith Input Parameters: 2650db81eaa0SLois Curfman McInnes + comm - MPI communicator, set to PETSC_COMM_SELF 26510c775827SLois Curfman McInnes . m - number of rows 265218f449edSLois Curfman McInnes . n - number of columns 26530298fd71SBarry Smith - data - optional location of matrix data in column major order. Set data=NULL for PETSc 2654dfc5480cSLois Curfman McInnes to control all matrix memory allocation. 265520563c6bSBarry Smith 265620563c6bSBarry Smith Output Parameter: 265744cd7ae7SLois Curfman McInnes . A - the matrix 265820563c6bSBarry Smith 2659b259b22eSLois Curfman McInnes Notes: 266018f449edSLois Curfman McInnes The data input variable is intended primarily for Fortran programmers 266118f449edSLois Curfman McInnes who wish to allocate their own matrix memory space. Most users should 26620298fd71SBarry Smith set data=NULL. 266318f449edSLois Curfman McInnes 2664027ccd11SLois Curfman McInnes Level: intermediate 2665027ccd11SLois Curfman McInnes 266669b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues() 266720563c6bSBarry Smith @*/ 26687087cfbeSBarry Smith PetscErrorCode MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A) 2669289bc588SBarry Smith { 2670dfbe8321SBarry Smith PetscErrorCode ierr; 26713b2fbd54SBarry Smith 26723a40ed3dSBarry Smith PetscFunctionBegin; 2673f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 2674f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr); 2675273d9f13SBarry Smith ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr); 2676273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr); 2677273d9f13SBarry Smith PetscFunctionReturn(0); 2678273d9f13SBarry Smith } 2679273d9f13SBarry Smith 2680273d9f13SBarry Smith /*@C 2681273d9f13SBarry Smith MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements 2682273d9f13SBarry Smith 2683d083f849SBarry Smith Collective 2684273d9f13SBarry Smith 2685273d9f13SBarry Smith Input Parameters: 26861c4f3114SJed Brown + B - the matrix 26870298fd71SBarry Smith - data - the array (or NULL) 2688273d9f13SBarry Smith 2689273d9f13SBarry Smith Notes: 2690273d9f13SBarry Smith The data input variable is intended primarily for Fortran programmers 2691273d9f13SBarry Smith who wish to allocate their own matrix memory space. Most users should 2692284134d9SBarry Smith need not call this routine. 2693273d9f13SBarry Smith 2694273d9f13SBarry Smith Level: intermediate 2695273d9f13SBarry Smith 269669b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA() 2697867c911aSBarry Smith 2698273d9f13SBarry Smith @*/ 26997087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation(Mat B,PetscScalar data[]) 2700273d9f13SBarry Smith { 27014ac538c5SBarry Smith PetscErrorCode ierr; 2702a23d5eceSKris Buschelman 2703a23d5eceSKris Buschelman PetscFunctionBegin; 27044ac538c5SBarry Smith ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr); 2705a23d5eceSKris Buschelman PetscFunctionReturn(0); 2706a23d5eceSKris Buschelman } 2707a23d5eceSKris Buschelman 27087087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data) 2709a23d5eceSKris Buschelman { 2710273d9f13SBarry Smith Mat_SeqDense *b; 2711dfbe8321SBarry Smith PetscErrorCode ierr; 2712273d9f13SBarry Smith 2713273d9f13SBarry Smith PetscFunctionBegin; 2714273d9f13SBarry Smith B->preallocated = PETSC_TRUE; 2715a868139aSShri Abhyankar 271634ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr); 271734ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr); 271834ef9618SShri Abhyankar 2719273d9f13SBarry Smith b = (Mat_SeqDense*)B->data; 272086d161a7SShri Abhyankar b->Mmax = B->rmap->n; 272186d161a7SShri Abhyankar b->Nmax = B->cmap->n; 272286d161a7SShri Abhyankar if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n; 272386d161a7SShri Abhyankar 2724220afb94SBarry Smith ierr = PetscIntMultError(b->lda,b->Nmax,NULL);CHKERRQ(ierr); 27259e8f95c4SLisandro Dalcin if (!data) { /* petsc-allocated storage */ 27269e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2727e92229d0SSatish Balay ierr = PetscCalloc1((size_t)b->lda*b->Nmax,&b->v);CHKERRQ(ierr); 27283bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr); 27292205254eSKarl Rupp 27309e8f95c4SLisandro Dalcin b->user_alloc = PETSC_FALSE; 2731273d9f13SBarry Smith } else { /* user-allocated storage */ 27329e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2733273d9f13SBarry Smith b->v = data; 2734273d9f13SBarry Smith b->user_alloc = PETSC_TRUE; 2735273d9f13SBarry Smith } 27360450473dSBarry Smith B->assembled = PETSC_TRUE; 2737273d9f13SBarry Smith PetscFunctionReturn(0); 2738273d9f13SBarry Smith } 2739273d9f13SBarry Smith 274065b80a83SHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 2741cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat) 27428baccfbdSHong Zhang { 2743d77f618aSHong Zhang Mat mat_elemental; 2744d77f618aSHong Zhang PetscErrorCode ierr; 27451683a169SBarry Smith const PetscScalar *array; 27461683a169SBarry Smith PetscScalar *v_colwise; 2747d77f618aSHong Zhang PetscInt M=A->rmap->N,N=A->cmap->N,i,j,k,*rows,*cols; 2748d77f618aSHong Zhang 27498baccfbdSHong Zhang PetscFunctionBegin; 2750d77f618aSHong Zhang ierr = PetscMalloc3(M*N,&v_colwise,M,&rows,N,&cols);CHKERRQ(ierr); 27511683a169SBarry Smith ierr = MatDenseGetArrayRead(A,&array);CHKERRQ(ierr); 2752d77f618aSHong Zhang /* convert column-wise array into row-wise v_colwise, see MatSetValues_Elemental() */ 2753d77f618aSHong Zhang k = 0; 2754d77f618aSHong Zhang for (j=0; j<N; j++) { 2755d77f618aSHong Zhang cols[j] = j; 2756d77f618aSHong Zhang for (i=0; i<M; i++) { 2757d77f618aSHong Zhang v_colwise[j*M+i] = array[k++]; 2758d77f618aSHong Zhang } 2759d77f618aSHong Zhang } 2760d77f618aSHong Zhang for (i=0; i<M; i++) { 2761d77f618aSHong Zhang rows[i] = i; 2762d77f618aSHong Zhang } 27631683a169SBarry Smith ierr = MatDenseRestoreArrayRead(A,&array);CHKERRQ(ierr); 2764d77f618aSHong Zhang 2765d77f618aSHong Zhang ierr = MatCreate(PetscObjectComm((PetscObject)A), &mat_elemental);CHKERRQ(ierr); 2766d77f618aSHong Zhang ierr = MatSetSizes(mat_elemental,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr); 2767d77f618aSHong Zhang ierr = MatSetType(mat_elemental,MATELEMENTAL);CHKERRQ(ierr); 2768d77f618aSHong Zhang ierr = MatSetUp(mat_elemental);CHKERRQ(ierr); 2769d77f618aSHong Zhang 2770d77f618aSHong Zhang /* PETSc-Elemental interaface uses axpy for setting off-processor entries, only ADD_VALUES is allowed */ 2771d77f618aSHong Zhang ierr = MatSetValues(mat_elemental,M,rows,N,cols,v_colwise,ADD_VALUES);CHKERRQ(ierr); 2772d77f618aSHong Zhang ierr = MatAssemblyBegin(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2773d77f618aSHong Zhang ierr = MatAssemblyEnd(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2774d77f618aSHong Zhang ierr = PetscFree3(v_colwise,rows,cols);CHKERRQ(ierr); 2775d77f618aSHong Zhang 2776511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 277728be2f97SBarry Smith ierr = MatHeaderReplace(A,&mat_elemental);CHKERRQ(ierr); 2778d77f618aSHong Zhang } else { 2779d77f618aSHong Zhang *newmat = mat_elemental; 2780d77f618aSHong Zhang } 27818baccfbdSHong Zhang PetscFunctionReturn(0); 27828baccfbdSHong Zhang } 278365b80a83SHong Zhang #endif 27848baccfbdSHong Zhang 27851b807ce4Svictorle /*@C 27861b807ce4Svictorle MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array 27871b807ce4Svictorle 27881b807ce4Svictorle Input parameter: 27891b807ce4Svictorle + A - the matrix 27901b807ce4Svictorle - lda - the leading dimension 27911b807ce4Svictorle 27921b807ce4Svictorle Notes: 2793867c911aSBarry Smith This routine is to be used in conjunction with MatSeqDenseSetPreallocation(); 27941b807ce4Svictorle it asserts that the preallocation has a leading dimension (the LDA parameter 27951b807ce4Svictorle of Blas and Lapack fame) larger than M, the first dimension of the matrix. 27961b807ce4Svictorle 27971b807ce4Svictorle Level: intermediate 27981b807ce4Svictorle 2799284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize() 2800867c911aSBarry Smith 28011b807ce4Svictorle @*/ 28027087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetLDA(Mat B,PetscInt lda) 28031b807ce4Svictorle { 28041b807ce4Svictorle Mat_SeqDense *b = (Mat_SeqDense*)B->data; 280521a2c019SBarry Smith 28061b807ce4Svictorle PetscFunctionBegin; 2807e32f2f54SBarry 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); 28081b807ce4Svictorle b->lda = lda; 280921a2c019SBarry Smith b->changelda = PETSC_FALSE; 281021a2c019SBarry Smith b->Mmax = PetscMax(b->Mmax,lda); 28111b807ce4Svictorle PetscFunctionReturn(0); 28121b807ce4Svictorle } 28131b807ce4Svictorle 2814d528f656SJakub Kruzik PetscErrorCode MatCreateMPIMatConcatenateSeqMat_SeqDense(MPI_Comm comm,Mat inmat,PetscInt n,MatReuse scall,Mat *outmat) 2815d528f656SJakub Kruzik { 2816d528f656SJakub Kruzik PetscErrorCode ierr; 2817d528f656SJakub Kruzik PetscMPIInt size; 2818d528f656SJakub Kruzik 2819d528f656SJakub Kruzik PetscFunctionBegin; 2820d528f656SJakub Kruzik ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 2821d528f656SJakub Kruzik if (size == 1) { 2822d528f656SJakub Kruzik if (scall == MAT_INITIAL_MATRIX) { 2823d528f656SJakub Kruzik ierr = MatDuplicate(inmat,MAT_COPY_VALUES,outmat);CHKERRQ(ierr); 2824d528f656SJakub Kruzik } else { 2825d528f656SJakub Kruzik ierr = MatCopy(inmat,*outmat,SAME_NONZERO_PATTERN);CHKERRQ(ierr); 2826d528f656SJakub Kruzik } 2827d528f656SJakub Kruzik } else { 2828d528f656SJakub Kruzik ierr = MatCreateMPIMatConcatenateSeqMat_MPIDense(comm,inmat,n,scall,outmat);CHKERRQ(ierr); 2829d528f656SJakub Kruzik } 2830d528f656SJakub Kruzik PetscFunctionReturn(0); 2831d528f656SJakub Kruzik } 2832d528f656SJakub Kruzik 28330bad9183SKris Buschelman /*MC 2834fafad747SKris Buschelman MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices. 28350bad9183SKris Buschelman 28360bad9183SKris Buschelman Options Database Keys: 28370bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions() 28380bad9183SKris Buschelman 28390bad9183SKris Buschelman Level: beginner 28400bad9183SKris Buschelman 284189665df3SBarry Smith .seealso: MatCreateSeqDense() 284289665df3SBarry Smith 28430bad9183SKris Buschelman M*/ 2844ca15aa20SStefano Zampini PetscErrorCode MatCreate_SeqDense(Mat B) 2845273d9f13SBarry Smith { 2846273d9f13SBarry Smith Mat_SeqDense *b; 2847dfbe8321SBarry Smith PetscErrorCode ierr; 28487c334f02SBarry Smith PetscMPIInt size; 2849273d9f13SBarry Smith 2850273d9f13SBarry Smith PetscFunctionBegin; 2851ce94432eSBarry Smith ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr); 2852e32f2f54SBarry Smith if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1"); 285355659b69SBarry Smith 2854b00a9115SJed Brown ierr = PetscNewLog(B,&b);CHKERRQ(ierr); 2855549d3d68SSatish Balay ierr = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr); 285644cd7ae7SLois Curfman McInnes B->data = (void*)b; 285718f449edSLois Curfman McInnes 2858273d9f13SBarry Smith b->roworiented = PETSC_TRUE; 28594e220ebcSLois Curfman McInnes 286049a6ff4bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetLDA_C",MatDenseGetLDA_SeqDense);CHKERRQ(ierr); 2861bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr); 28628572280aSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr); 2863d3042a70SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDensePlaceArray_C",MatDensePlaceArray_SeqDense);CHKERRQ(ierr); 2864d3042a70SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseResetArray_C",MatDenseResetArray_SeqDense);CHKERRQ(ierr); 28658572280aSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArrayRead_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr); 2866715b7558SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArrayRead_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr); 2867bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr); 28688baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 28698baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr); 28708baccfbdSHong Zhang #endif 28712bf066beSStefano Zampini #if defined(PETSC_HAVE_CUDA) 28722bf066beSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqdensecuda_C",MatConvert_SeqDense_SeqDenseCUDA);CHKERRQ(ierr); 2873a4af7ca8SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaijcusparse_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 28742bf066beSStefano Zampini #endif 2875bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr); 2876bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaij_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 2877a4af7ca8SStefano Zampini #if defined(PETSC_HAVE_VIENNACL) 2878a4af7ca8SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaijviennacl_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 2879a4af7ca8SStefano Zampini #endif 2880bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 2881bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 2882a001520aSPierre Jolivet ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqbaij_seqdense_C",MatMatMult_SeqBAIJ_SeqDense);CHKERRQ(ierr); 2883a001520aSPierre Jolivet ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqbaij_seqdense_C",MatMatMultSymbolic_SeqBAIJ_SeqDense);CHKERRQ(ierr); 2884a001520aSPierre Jolivet ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqbaij_seqdense_C",MatMatMultNumeric_SeqBAIJ_SeqDense);CHKERRQ(ierr); 2885abc3b08eSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatPtAP_seqaij_seqdense_C",MatPtAP_SeqDense_SeqDense);CHKERRQ(ierr); 28864099cc6bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaijperm_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 28874099cc6bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaijperm_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 28884099cc6bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaijperm_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 28894099cc6bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatPtAP_seqaijperm_seqdense_C",MatPtAP_SeqDense_SeqDense);CHKERRQ(ierr); 2890e9e4f4a6SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaijsell_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 2891e9e4f4a6SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaijsell_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 2892e9e4f4a6SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaijsell_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 2893e9e4f4a6SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatPtAP_seqaijsell_seqdense_C",MatPtAP_SeqDense_SeqDense);CHKERRQ(ierr); 289496e6d5c4SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaijmkl_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 289596e6d5c4SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaijmkl_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 289696e6d5c4SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaijmkl_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 2897*52c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_nest_seqdense_C",MatMatMult_Nest_Dense);CHKERRQ(ierr); 2898*52c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_nest_seqdense_C",MatMatMultSymbolic_Nest_Dense);CHKERRQ(ierr); 2899*52c5f739Sprj- ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_nest_seqdense_C",MatMatMultNumeric_Nest_Dense);CHKERRQ(ierr); 290096e6d5c4SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatPtAP_seqaijmkl_seqdense_C",MatPtAP_SeqDense_SeqDense);CHKERRQ(ierr); 290196e6d5c4SRichard Tran Mills 29023bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaij_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 29033bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 29043bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaij_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 29054099cc6bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaijperm_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 29064099cc6bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaijperm_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 29074099cc6bSBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaijperm_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 2908e9e4f4a6SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaijsell_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 2909e9e4f4a6SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaijsell_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 2910e9e4f4a6SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaijsell_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 291196e6d5c4SRichard Tran Mills 291296e6d5c4SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaijmkl_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 291396e6d5c4SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaijmkl_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 291496e6d5c4SRichard Tran Mills ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaijmkl_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 2915af53bab2SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetColumn_C",MatDenseGetColumn_SeqDense);CHKERRQ(ierr); 2916af53bab2SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreColumn_C",MatDenseRestoreColumn_SeqDense);CHKERRQ(ierr); 291717667f90SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr); 29183a40ed3dSBarry Smith PetscFunctionReturn(0); 2919289bc588SBarry Smith } 292086aefd0dSHong Zhang 292186aefd0dSHong Zhang /*@C 2922af53bab2SHong 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. 292386aefd0dSHong Zhang 292486aefd0dSHong Zhang Not Collective 292586aefd0dSHong Zhang 292686aefd0dSHong Zhang Input Parameter: 292786aefd0dSHong Zhang + mat - a MATSEQDENSE or MATMPIDENSE matrix 292886aefd0dSHong Zhang - col - column index 292986aefd0dSHong Zhang 293086aefd0dSHong Zhang Output Parameter: 293186aefd0dSHong Zhang . vals - pointer to the data 293286aefd0dSHong Zhang 293386aefd0dSHong Zhang Level: intermediate 293486aefd0dSHong Zhang 293586aefd0dSHong Zhang .seealso: MatDenseRestoreColumn() 293686aefd0dSHong Zhang @*/ 293786aefd0dSHong Zhang PetscErrorCode MatDenseGetColumn(Mat A,PetscInt col,PetscScalar **vals) 293886aefd0dSHong Zhang { 293986aefd0dSHong Zhang PetscErrorCode ierr; 294086aefd0dSHong Zhang 294186aefd0dSHong Zhang PetscFunctionBegin; 294286aefd0dSHong Zhang ierr = PetscUseMethod(A,"MatDenseGetColumn_C",(Mat,PetscInt,PetscScalar**),(A,col,vals));CHKERRQ(ierr); 294386aefd0dSHong Zhang PetscFunctionReturn(0); 294486aefd0dSHong Zhang } 294586aefd0dSHong Zhang 294686aefd0dSHong Zhang /*@C 294786aefd0dSHong Zhang MatDenseRestoreColumn - returns access to a column of a dense matrix which is returned by MatDenseGetColumn(). 294886aefd0dSHong Zhang 294986aefd0dSHong Zhang Not Collective 295086aefd0dSHong Zhang 295186aefd0dSHong Zhang Input Parameter: 295286aefd0dSHong Zhang . mat - a MATSEQDENSE or MATMPIDENSE matrix 295386aefd0dSHong Zhang 295486aefd0dSHong Zhang Output Parameter: 295586aefd0dSHong Zhang . vals - pointer to the data 295686aefd0dSHong Zhang 295786aefd0dSHong Zhang Level: intermediate 295886aefd0dSHong Zhang 295986aefd0dSHong Zhang .seealso: MatDenseGetColumn() 296086aefd0dSHong Zhang @*/ 296186aefd0dSHong Zhang PetscErrorCode MatDenseRestoreColumn(Mat A,PetscScalar **vals) 296286aefd0dSHong Zhang { 296386aefd0dSHong Zhang PetscErrorCode ierr; 296486aefd0dSHong Zhang 296586aefd0dSHong Zhang PetscFunctionBegin; 296686aefd0dSHong Zhang ierr = PetscUseMethod(A,"MatDenseRestoreColumn_C",(Mat,PetscScalar**),(A,vals));CHKERRQ(ierr); 296786aefd0dSHong Zhang PetscFunctionReturn(0); 296886aefd0dSHong Zhang } 2969