1be1d678aSKris Buschelman #define PETSCMAT_DLL 2be1d678aSKris Buschelman 367e560aaSBarry Smith /* 467e560aaSBarry Smith Defines the basic matrix operations for sequential dense. 567e560aaSBarry Smith */ 6289bc588SBarry Smith 770f55243SBarry Smith #include "src/mat/impls/dense/seq/dense.h" 8b4c862e0SSatish Balay #include "petscblaslapack.h" 9289bc588SBarry Smith 104a2ae208SSatish Balay #undef __FUNCT__ 114a2ae208SSatish Balay #define __FUNCT__ "MatAXPY_SeqDense" 12f4df32b1SMatthew Knepley PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str) 131987afe7SBarry Smith { 141987afe7SBarry Smith Mat_SeqDense *x = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data; 15f4df32b1SMatthew Knepley PetscScalar oalpha = alpha; 1613f74950SBarry Smith PetscInt j; 170805154bSBarry Smith PetscBLASInt N,m,ldax,lday,one = 1; 18efee365bSSatish Balay PetscErrorCode ierr; 193a40ed3dSBarry Smith 203a40ed3dSBarry Smith PetscFunctionBegin; 21d0f46423SBarry Smith N = PetscBLASIntCast(X->rmap->n*X->cmap->n); 22d0f46423SBarry Smith m = PetscBLASIntCast(X->rmap->n); 230805154bSBarry Smith ldax = PetscBLASIntCast(x->lda); 240805154bSBarry Smith lday = PetscBLASIntCast(y->lda); 25a5ce6ee0Svictorle if (ldax>m || lday>m) { 26d0f46423SBarry Smith for (j=0; j<X->cmap->n; j++) { 27f4df32b1SMatthew Knepley BLASaxpy_(&m,&oalpha,x->v+j*ldax,&one,y->v+j*lday,&one); 28a5ce6ee0Svictorle } 29a5ce6ee0Svictorle } else { 30f4df32b1SMatthew Knepley BLASaxpy_(&N,&oalpha,x->v,&one,y->v,&one); 31a5ce6ee0Svictorle } 32efee365bSSatish Balay ierr = PetscLogFlops(2*N-1);CHKERRQ(ierr); 333a40ed3dSBarry Smith PetscFunctionReturn(0); 341987afe7SBarry Smith } 351987afe7SBarry Smith 364a2ae208SSatish Balay #undef __FUNCT__ 374a2ae208SSatish Balay #define __FUNCT__ "MatGetInfo_SeqDense" 38dfbe8321SBarry Smith PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info) 39289bc588SBarry Smith { 40d0f46423SBarry Smith PetscInt N = A->rmap->n*A->cmap->n; 413a40ed3dSBarry Smith 423a40ed3dSBarry Smith PetscFunctionBegin; 43d0f46423SBarry Smith info->rows_global = (double)A->rmap->n; 44d0f46423SBarry Smith info->columns_global = (double)A->cmap->n; 45d0f46423SBarry Smith info->rows_local = (double)A->rmap->n; 46d0f46423SBarry Smith info->columns_local = (double)A->cmap->n; 474e220ebcSLois Curfman McInnes info->block_size = 1.0; 484e220ebcSLois Curfman McInnes info->nz_allocated = (double)N; 496de62eeeSBarry Smith info->nz_used = (double)N; 506de62eeeSBarry Smith info->nz_unneeded = (double)0; 514e220ebcSLois Curfman McInnes info->assemblies = (double)A->num_ass; 524e220ebcSLois Curfman McInnes info->mallocs = 0; 537adad957SLisandro Dalcin info->memory = ((PetscObject)A)->mem; 544e220ebcSLois Curfman McInnes info->fill_ratio_given = 0; 554e220ebcSLois Curfman McInnes info->fill_ratio_needed = 0; 564e220ebcSLois Curfman McInnes info->factor_mallocs = 0; 573a40ed3dSBarry Smith PetscFunctionReturn(0); 58289bc588SBarry Smith } 59289bc588SBarry Smith 604a2ae208SSatish Balay #undef __FUNCT__ 614a2ae208SSatish Balay #define __FUNCT__ "MatScale_SeqDense" 62f4df32b1SMatthew Knepley PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha) 6380cd9d93SLois Curfman McInnes { 64273d9f13SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 65f4df32b1SMatthew Knepley PetscScalar oalpha = alpha; 66efee365bSSatish Balay PetscErrorCode ierr; 670805154bSBarry Smith PetscBLASInt one = 1,j,nz,lda = PetscBLASIntCast(a->lda); 6880cd9d93SLois Curfman McInnes 693a40ed3dSBarry Smith PetscFunctionBegin; 70d0f46423SBarry Smith if (lda>A->rmap->n) { 71d0f46423SBarry Smith nz = PetscBLASIntCast(A->rmap->n); 72d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 73f4df32b1SMatthew Knepley BLASscal_(&nz,&oalpha,a->v+j*lda,&one); 74a5ce6ee0Svictorle } 75a5ce6ee0Svictorle } else { 76d0f46423SBarry Smith nz = PetscBLASIntCast(A->rmap->n*A->cmap->n); 77f4df32b1SMatthew Knepley BLASscal_(&nz,&oalpha,a->v,&one); 78a5ce6ee0Svictorle } 79efee365bSSatish Balay ierr = PetscLogFlops(nz);CHKERRQ(ierr); 803a40ed3dSBarry Smith PetscFunctionReturn(0); 8180cd9d93SLois Curfman McInnes } 8280cd9d93SLois Curfman McInnes 831cbb95d3SBarry Smith #undef __FUNCT__ 841cbb95d3SBarry Smith #define __FUNCT__ "MatIsHermitian_SeqDense" 851cbb95d3SBarry Smith PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscTruth *fl) 861cbb95d3SBarry Smith { 871cbb95d3SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 88d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,N; 891cbb95d3SBarry Smith PetscScalar *v = a->v; 901cbb95d3SBarry Smith 911cbb95d3SBarry Smith PetscFunctionBegin; 921cbb95d3SBarry Smith *fl = PETSC_FALSE; 93d0f46423SBarry Smith if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0); 941cbb95d3SBarry Smith N = a->lda; 951cbb95d3SBarry Smith 961cbb95d3SBarry Smith for (i=0; i<m; i++) { 971cbb95d3SBarry Smith for (j=i+1; j<m; j++) { 981cbb95d3SBarry Smith if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) PetscFunctionReturn(0); 991cbb95d3SBarry Smith } 1001cbb95d3SBarry Smith } 1011cbb95d3SBarry Smith *fl = PETSC_TRUE; 1021cbb95d3SBarry Smith PetscFunctionReturn(0); 1031cbb95d3SBarry Smith } 1041cbb95d3SBarry Smith 105b24902e0SBarry Smith #undef __FUNCT__ 106b24902e0SBarry Smith #define __FUNCT__ "MatDuplicateNoCreate_SeqDense" 107719d5645SBarry Smith PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat newi,Mat A,MatDuplicateOption cpvalues) 108b24902e0SBarry Smith { 109b24902e0SBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data,*l; 110b24902e0SBarry Smith PetscErrorCode ierr; 111b24902e0SBarry Smith PetscInt lda = (PetscInt)mat->lda,j,m; 112b24902e0SBarry Smith 113b24902e0SBarry Smith PetscFunctionBegin; 114719d5645SBarry Smith ierr = MatSeqDenseSetPreallocation(newi,PETSC_NULL);CHKERRQ(ierr); 115b24902e0SBarry Smith if (cpvalues == MAT_COPY_VALUES) { 116b24902e0SBarry Smith l = (Mat_SeqDense*)newi->data; 117d0f46423SBarry Smith if (lda>A->rmap->n) { 118d0f46423SBarry Smith m = A->rmap->n; 119d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 120b24902e0SBarry Smith ierr = PetscMemcpy(l->v+j*m,mat->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 121b24902e0SBarry Smith } 122b24902e0SBarry Smith } else { 123d0f46423SBarry Smith ierr = PetscMemcpy(l->v,mat->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 124b24902e0SBarry Smith } 125b24902e0SBarry Smith } 126b24902e0SBarry Smith newi->assembled = PETSC_TRUE; 127b24902e0SBarry Smith PetscFunctionReturn(0); 128b24902e0SBarry Smith } 129b24902e0SBarry Smith 1304a2ae208SSatish Balay #undef __FUNCT__ 1314a2ae208SSatish Balay #define __FUNCT__ "MatDuplicate_SeqDense" 132dfbe8321SBarry Smith PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat) 13302cad45dSBarry Smith { 1346849ba73SBarry Smith PetscErrorCode ierr; 13502cad45dSBarry Smith 1363a40ed3dSBarry Smith PetscFunctionBegin; 1375c9eb25fSBarry Smith ierr = MatCreate(((PetscObject)A)->comm,newmat);CHKERRQ(ierr); 138d0f46423SBarry Smith ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 1395c9eb25fSBarry Smith ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 140719d5645SBarry Smith ierr = MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues);CHKERRQ(ierr); 141b24902e0SBarry Smith PetscFunctionReturn(0); 142b24902e0SBarry Smith } 143b24902e0SBarry Smith 1446ee01492SSatish Balay 145719d5645SBarry Smith extern PetscErrorCode MatLUFactor_SeqDense(Mat,IS,IS,MatFactorInfo*); 146719d5645SBarry Smith 1474a2ae208SSatish Balay #undef __FUNCT__ 1484a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorNumeric_SeqDense" 149719d5645SBarry Smith PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,MatFactorInfo *info_dummy) 150289bc588SBarry Smith { 151719d5645SBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data,*l = (Mat_SeqDense*)fact->data; 1524482741eSBarry Smith MatFactorInfo info; 153a093e273SMatthew Knepley PetscInt lda1 = mat->lda, lda2 = l->lda; 154a093e273SMatthew Knepley PetscInt m = A->rmap->n, n = A->cmap->n, j; 155a093e273SMatthew Knepley PetscErrorCode ierr; 1563a40ed3dSBarry Smith 1573a40ed3dSBarry Smith PetscFunctionBegin; 15802cad45dSBarry Smith /* copy the numerical values */ 1591b807ce4Svictorle if (lda1>m || lda2>m ) { 1601b807ce4Svictorle for (j=0; j<n; j++) { 1611b807ce4Svictorle ierr = PetscMemcpy(l->v+j*lda2,mat->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr); 1621b807ce4Svictorle } 1631b807ce4Svictorle } else { 164a093e273SMatthew Knepley ierr = PetscMemcpy(l->v,mat->v,m*n*sizeof(PetscScalar));CHKERRQ(ierr); 1651b807ce4Svictorle } 166719d5645SBarry Smith ierr = MatLUFactor_SeqDense(fact,0,0,&info);CHKERRQ(ierr); 1673a40ed3dSBarry Smith PetscFunctionReturn(0); 168289bc588SBarry Smith } 1696ee01492SSatish Balay 1700b4b3355SBarry Smith #undef __FUNCT__ 1714a2ae208SSatish Balay #define __FUNCT__ "MatSolve_SeqDense" 172dfbe8321SBarry Smith PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy) 173289bc588SBarry Smith { 174c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1756849ba73SBarry Smith PetscErrorCode ierr; 17687828ca2SBarry Smith PetscScalar *x,*y; 177d0f46423SBarry Smith PetscBLASInt one = 1,info,m = PetscBLASIntCast(A->rmap->n); 17867e560aaSBarry Smith 1793a40ed3dSBarry Smith PetscFunctionBegin; 1801ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 1811ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 182d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1835c9eb25fSBarry Smith if (A->factor == MAT_FACTOR_LU) { 184ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 18580444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 186ae7cfcebSSatish Balay #else 18771044d3cSBarry Smith LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 1884ce68768SBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"GETRS - Bad solve"); 189ae7cfcebSSatish Balay #endif 1905c9eb25fSBarry Smith } else if (A->factor == MAT_FACTOR_CHOLESKY){ 191ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 19280444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 193ae7cfcebSSatish Balay #else 19471044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 1954ce68768SBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"POTRS Bad solve"); 196ae7cfcebSSatish Balay #endif 197289bc588SBarry Smith } 19829bbc08cSBarry Smith else SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 1991ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 2001ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 201d0f46423SBarry Smith ierr = PetscLogFlops(2*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 2023a40ed3dSBarry Smith PetscFunctionReturn(0); 203289bc588SBarry Smith } 2046ee01492SSatish Balay 2054a2ae208SSatish Balay #undef __FUNCT__ 2064a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense" 207dfbe8321SBarry Smith PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy) 208da3a660dSBarry Smith { 209c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 210dfbe8321SBarry Smith PetscErrorCode ierr; 21187828ca2SBarry Smith PetscScalar *x,*y; 212d0f46423SBarry Smith PetscBLASInt one = 1,info,m = PetscBLASIntCast(A->rmap->n); 21367e560aaSBarry Smith 2143a40ed3dSBarry Smith PetscFunctionBegin; 2151ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 2161ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 217d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 218752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 219da3a660dSBarry Smith if (mat->pivots) { 220ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 22180444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 222ae7cfcebSSatish Balay #else 22371044d3cSBarry Smith LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 2244ce68768SBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"POTRS - Bad solve"); 225ae7cfcebSSatish Balay #endif 2267a97a34bSBarry Smith } else { 227ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 22880444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 229ae7cfcebSSatish Balay #else 23071044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 2314ce68768SBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"POTRS - Bad solve"); 232ae7cfcebSSatish Balay #endif 233da3a660dSBarry Smith } 2341ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 2351ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 236d0f46423SBarry Smith ierr = PetscLogFlops(2*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 2373a40ed3dSBarry Smith PetscFunctionReturn(0); 238da3a660dSBarry Smith } 2396ee01492SSatish Balay 2404a2ae208SSatish Balay #undef __FUNCT__ 2414a2ae208SSatish Balay #define __FUNCT__ "MatSolveAdd_SeqDense" 242dfbe8321SBarry Smith PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 243da3a660dSBarry Smith { 244c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 245dfbe8321SBarry Smith PetscErrorCode ierr; 24687828ca2SBarry Smith PetscScalar *x,*y,sone = 1.0; 247da3a660dSBarry Smith Vec tmp = 0; 248d0f46423SBarry Smith PetscBLASInt one = 1,info,m = PetscBLASIntCast(A->rmap->n); 24967e560aaSBarry Smith 2503a40ed3dSBarry Smith PetscFunctionBegin; 2511ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 2521ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 253d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 254da3a660dSBarry Smith if (yy == zz) { 25578b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 25652e6d16bSBarry Smith ierr = PetscLogObjectParent(A,tmp);CHKERRQ(ierr); 25778b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 258da3a660dSBarry Smith } 259d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 260752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 261da3a660dSBarry Smith if (mat->pivots) { 262ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 26380444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 264ae7cfcebSSatish Balay #else 26571044d3cSBarry Smith LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 2662ffef20aSBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve"); 267ae7cfcebSSatish Balay #endif 268a8c6a408SBarry Smith } else { 269ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 27080444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 271ae7cfcebSSatish Balay #else 27271044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 2732ffef20aSBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve"); 274ae7cfcebSSatish Balay #endif 275da3a660dSBarry Smith } 2762dcb1b2aSMatthew Knepley if (tmp) {ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); ierr = VecDestroy(tmp);CHKERRQ(ierr);} 2772dcb1b2aSMatthew Knepley else {ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);} 2781ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 2791ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 280d0f46423SBarry Smith ierr = PetscLogFlops(2*A->cmap->n*A->cmap->n);CHKERRQ(ierr); 2813a40ed3dSBarry Smith PetscFunctionReturn(0); 282da3a660dSBarry Smith } 28367e560aaSBarry Smith 2844a2ae208SSatish Balay #undef __FUNCT__ 2854a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense" 286dfbe8321SBarry Smith PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 287da3a660dSBarry Smith { 288c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 2896849ba73SBarry Smith PetscErrorCode ierr; 29087828ca2SBarry Smith PetscScalar *x,*y,sone = 1.0; 291da3a660dSBarry Smith Vec tmp; 292d0f46423SBarry Smith PetscBLASInt one = 1,info,m = PetscBLASIntCast(A->rmap->n); 29367e560aaSBarry Smith 2943a40ed3dSBarry Smith PetscFunctionBegin; 295d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 2961ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 2971ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 298da3a660dSBarry Smith if (yy == zz) { 29978b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 30052e6d16bSBarry Smith ierr = PetscLogObjectParent(A,tmp);CHKERRQ(ierr); 30178b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 302da3a660dSBarry Smith } 303d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 304752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 305da3a660dSBarry Smith if (mat->pivots) { 306ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 30780444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 308ae7cfcebSSatish Balay #else 30971044d3cSBarry Smith LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 3102ffef20aSBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve"); 311ae7cfcebSSatish Balay #endif 3123a40ed3dSBarry Smith } else { 313ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 31480444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 315ae7cfcebSSatish Balay #else 31671044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 3172ffef20aSBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve"); 318ae7cfcebSSatish Balay #endif 319da3a660dSBarry Smith } 32090f02eecSBarry Smith if (tmp) { 3212dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); 32290f02eecSBarry Smith ierr = VecDestroy(tmp);CHKERRQ(ierr); 3233a40ed3dSBarry Smith } else { 3242dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr); 32590f02eecSBarry Smith } 3261ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 3271ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 328d0f46423SBarry Smith ierr = PetscLogFlops(2*A->cmap->n*A->cmap->n);CHKERRQ(ierr); 3293a40ed3dSBarry Smith PetscFunctionReturn(0); 330da3a660dSBarry Smith } 331db4efbfdSBarry Smith 332db4efbfdSBarry Smith /* ---------------------------------------------------------------*/ 333db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots, 334db4efbfdSBarry Smith rather than put it in the Mat->row slot.*/ 335db4efbfdSBarry Smith #undef __FUNCT__ 336db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactor_SeqDense" 337db4efbfdSBarry Smith PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,MatFactorInfo *minfo) 338db4efbfdSBarry Smith { 339db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF) 340db4efbfdSBarry Smith PetscFunctionBegin; 341db4efbfdSBarry Smith SETERRQ(PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable."); 342db4efbfdSBarry Smith #else 343db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 344db4efbfdSBarry Smith PetscErrorCode ierr; 345db4efbfdSBarry Smith PetscBLASInt n,m,info; 346db4efbfdSBarry Smith 347db4efbfdSBarry Smith PetscFunctionBegin; 348db4efbfdSBarry Smith n = PetscBLASIntCast(A->cmap->n); 349db4efbfdSBarry Smith m = PetscBLASIntCast(A->rmap->n); 350db4efbfdSBarry Smith if (!mat->pivots) { 351db4efbfdSBarry Smith ierr = PetscMalloc((A->rmap->n+1)*sizeof(PetscBLASInt),&mat->pivots);CHKERRQ(ierr); 352db4efbfdSBarry Smith ierr = PetscLogObjectMemory(A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr); 353db4efbfdSBarry Smith } 354db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 355db4efbfdSBarry Smith LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info); 356db4efbfdSBarry Smith if (info<0) SETERRQ(PETSC_ERR_LIB,"Bad argument to LU factorization"); 357db4efbfdSBarry Smith if (info>0) SETERRQ(PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization"); 358db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 359db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 360db4efbfdSBarry Smith A->ops->solveadd = MatSolveAdd_SeqDense; 361db4efbfdSBarry Smith A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 362db4efbfdSBarry Smith A->factor = MAT_FACTOR_LU; 363db4efbfdSBarry Smith 364db4efbfdSBarry Smith ierr = PetscLogFlops((2*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr); 365db4efbfdSBarry Smith #endif 366db4efbfdSBarry Smith PetscFunctionReturn(0); 367db4efbfdSBarry Smith } 368db4efbfdSBarry Smith 369db4efbfdSBarry Smith #undef __FUNCT__ 370db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactor_SeqDense" 371db4efbfdSBarry Smith PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,MatFactorInfo *factinfo) 372db4efbfdSBarry Smith { 373db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF) 374db4efbfdSBarry Smith PetscFunctionBegin; 375db4efbfdSBarry Smith SETERRQ(PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable."); 376db4efbfdSBarry Smith #else 377db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 378db4efbfdSBarry Smith PetscErrorCode ierr; 379db4efbfdSBarry Smith PetscBLASInt info,n = PetscBLASIntCast(A->cmap->n); 380db4efbfdSBarry Smith 381db4efbfdSBarry Smith PetscFunctionBegin; 382db4efbfdSBarry Smith ierr = PetscFree(mat->pivots);CHKERRQ(ierr); 383db4efbfdSBarry Smith mat->pivots = 0; 384db4efbfdSBarry Smith 385db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 386db4efbfdSBarry Smith LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info); 387db4efbfdSBarry Smith if (info) SETERRQ1(PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1); 388db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 389db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 390db4efbfdSBarry Smith A->ops->solveadd = MatSolveAdd_SeqDense; 391db4efbfdSBarry Smith A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 392db4efbfdSBarry Smith A->factor = MAT_FACTOR_CHOLESKY; 393db4efbfdSBarry Smith ierr = PetscLogFlops((A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr); 394db4efbfdSBarry Smith #endif 395db4efbfdSBarry Smith PetscFunctionReturn(0); 396db4efbfdSBarry Smith } 397db4efbfdSBarry Smith 398db4efbfdSBarry Smith 399db4efbfdSBarry Smith #undef __FUNCT__ 400db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense" 401719d5645SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,MatFactorInfo *info_dummy) 402db4efbfdSBarry Smith { 403db4efbfdSBarry Smith PetscErrorCode ierr; 404db4efbfdSBarry Smith MatFactorInfo info; 405db4efbfdSBarry Smith 406db4efbfdSBarry Smith PetscFunctionBegin; 407db4efbfdSBarry Smith info.fill = 1.0; 408719d5645SBarry Smith ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr); 409db4efbfdSBarry Smith PetscFunctionReturn(0); 410db4efbfdSBarry Smith } 411db4efbfdSBarry Smith 412db4efbfdSBarry Smith #undef __FUNCT__ 413db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense" 414719d5645SBarry Smith PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,MatFactorInfo *info) 415db4efbfdSBarry Smith { 416a093e273SMatthew Knepley PetscErrorCode ierr; 417a093e273SMatthew Knepley 418db4efbfdSBarry Smith PetscFunctionBegin; 419719d5645SBarry Smith ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 420719d5645SBarry Smith fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense; 421db4efbfdSBarry Smith PetscFunctionReturn(0); 422db4efbfdSBarry Smith } 423db4efbfdSBarry Smith 424db4efbfdSBarry Smith #undef __FUNCT__ 425db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactorSymbolic_SeqDense" 426719d5645SBarry Smith PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,MatFactorInfo *info) 427db4efbfdSBarry Smith { 428a093e273SMatthew Knepley PetscErrorCode ierr; 429a093e273SMatthew Knepley 430db4efbfdSBarry Smith PetscFunctionBegin; 431719d5645SBarry Smith ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_DO_NOT_COPY_VALUES);CHKERRQ(ierr); 432719d5645SBarry Smith fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense; 433db4efbfdSBarry Smith PetscFunctionReturn(0); 434db4efbfdSBarry Smith } 435db4efbfdSBarry Smith 436db4efbfdSBarry Smith #undef __FUNCT__ 437db4efbfdSBarry Smith #define __FUNCT__ "MatGetFactor_seqdense_petsc" 438db4efbfdSBarry Smith PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact) 439db4efbfdSBarry Smith { 440db4efbfdSBarry Smith PetscErrorCode ierr; 441db4efbfdSBarry Smith 442db4efbfdSBarry Smith PetscFunctionBegin; 443db4efbfdSBarry Smith ierr = MatCreate(((PetscObject)A)->comm,fact);CHKERRQ(ierr); 444db4efbfdSBarry Smith ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 445db4efbfdSBarry Smith ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr); 446db4efbfdSBarry Smith if (ftype == MAT_FACTOR_LU){ 447db4efbfdSBarry Smith (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense; 448db4efbfdSBarry Smith } else { 449db4efbfdSBarry Smith (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense; 450db4efbfdSBarry Smith } 451db4efbfdSBarry Smith (*fact)->factor = ftype; 452db4efbfdSBarry Smith PetscFunctionReturn(0); 453db4efbfdSBarry Smith } 454db4efbfdSBarry Smith 455289bc588SBarry Smith /* ------------------------------------------------------------------*/ 4564a2ae208SSatish Balay #undef __FUNCT__ 4574a2ae208SSatish Balay #define __FUNCT__ "MatRelax_SeqDense" 45813f74950SBarry Smith PetscErrorCode MatRelax_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx) 459289bc588SBarry Smith { 460c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 46187828ca2SBarry Smith PetscScalar *x,*b,*v = mat->v,zero = 0.0,xt; 462dfbe8321SBarry Smith PetscErrorCode ierr; 463d0f46423SBarry Smith PetscInt m = A->rmap->n,i; 464aa482453SBarry Smith #if !defined(PETSC_USE_COMPLEX) 4650805154bSBarry Smith PetscBLASInt o = 1,bm = PetscBLASIntCast(m); 466bc1b551cSSatish Balay #endif 467289bc588SBarry Smith 4683a40ed3dSBarry Smith PetscFunctionBegin; 469289bc588SBarry Smith if (flag & SOR_ZERO_INITIAL_GUESS) { 47071044d3cSBarry Smith /* this is a hack fix, should have another version without the second BLASdot */ 4712dcb1b2aSMatthew Knepley ierr = VecSet(xx,zero);CHKERRQ(ierr); 472289bc588SBarry Smith } 4731ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 4741ebc52fbSHong Zhang ierr = VecGetArray(bb,&b);CHKERRQ(ierr); 475b965ef7fSBarry Smith its = its*lits; 47677431f27SBarry Smith if (its <= 0) SETERRQ2(PETSC_ERR_ARG_WRONG,"Relaxation requires global its %D and local its %D both positive",its,lits); 477289bc588SBarry Smith while (its--) { 478fccaa45eSBarry Smith if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP){ 479289bc588SBarry Smith for (i=0; i<m; i++) { 480aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 481f1747703SBarry Smith /* cannot use BLAS dot for complex because compiler/linker is 482f1747703SBarry Smith not happy about returning a double complex */ 48313f74950SBarry Smith PetscInt _i; 48487828ca2SBarry Smith PetscScalar sum = b[i]; 485f1747703SBarry Smith for (_i=0; _i<m; _i++) { 4863f6de6efSSatish Balay sum -= PetscConj(v[i+_i*m])*x[_i]; 487f1747703SBarry Smith } 488f1747703SBarry Smith xt = sum; 489f1747703SBarry Smith #else 49071044d3cSBarry Smith xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o); 491f1747703SBarry Smith #endif 49255a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 493289bc588SBarry Smith } 494289bc588SBarry Smith } 495fccaa45eSBarry Smith if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP){ 496289bc588SBarry Smith for (i=m-1; i>=0; i--) { 497aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 498f1747703SBarry Smith /* cannot use BLAS dot for complex because compiler/linker is 499f1747703SBarry Smith not happy about returning a double complex */ 50013f74950SBarry Smith PetscInt _i; 50187828ca2SBarry Smith PetscScalar sum = b[i]; 502f1747703SBarry Smith for (_i=0; _i<m; _i++) { 5033f6de6efSSatish Balay sum -= PetscConj(v[i+_i*m])*x[_i]; 504f1747703SBarry Smith } 505f1747703SBarry Smith xt = sum; 506f1747703SBarry Smith #else 50771044d3cSBarry Smith xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o); 508f1747703SBarry Smith #endif 50955a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 510289bc588SBarry Smith } 511289bc588SBarry Smith } 512289bc588SBarry Smith } 5131ebc52fbSHong Zhang ierr = VecRestoreArray(bb,&b);CHKERRQ(ierr); 5141ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 5153a40ed3dSBarry Smith PetscFunctionReturn(0); 516289bc588SBarry Smith } 517289bc588SBarry Smith 518289bc588SBarry Smith /* -----------------------------------------------------------------*/ 5194a2ae208SSatish Balay #undef __FUNCT__ 5204a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense" 521dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy) 522289bc588SBarry Smith { 523c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 52487828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y; 525dfbe8321SBarry Smith PetscErrorCode ierr; 5260805154bSBarry Smith PetscBLASInt m, n,_One=1; 527ea709b57SSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 5283a40ed3dSBarry Smith 5293a40ed3dSBarry Smith PetscFunctionBegin; 530d0f46423SBarry Smith m = PetscBLASIntCast(A->rmap->n); 531d0f46423SBarry Smith n = PetscBLASIntCast(A->cmap->n); 532d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 5331ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 5341ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 53571044d3cSBarry Smith BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One); 5361ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 5371ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 538d0f46423SBarry Smith ierr = PetscLogFlops(2*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 5393a40ed3dSBarry Smith PetscFunctionReturn(0); 540289bc588SBarry Smith } 5416ee01492SSatish Balay 5424a2ae208SSatish Balay #undef __FUNCT__ 5434a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense" 544dfbe8321SBarry Smith PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy) 545289bc588SBarry Smith { 546c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 54787828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y,_DOne=1.0,_DZero=0.0; 548dfbe8321SBarry Smith PetscErrorCode ierr; 5490805154bSBarry Smith PetscBLASInt m, n, _One=1; 5503a40ed3dSBarry Smith 5513a40ed3dSBarry Smith PetscFunctionBegin; 552d0f46423SBarry Smith m = PetscBLASIntCast(A->rmap->n); 553d0f46423SBarry Smith n = PetscBLASIntCast(A->cmap->n); 554d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 5551ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 5561ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 55771044d3cSBarry Smith BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One); 5581ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 5591ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 560d0f46423SBarry Smith ierr = PetscLogFlops(2*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr); 5613a40ed3dSBarry Smith PetscFunctionReturn(0); 562289bc588SBarry Smith } 5636ee01492SSatish Balay 5644a2ae208SSatish Balay #undef __FUNCT__ 5654a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense" 566dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 567289bc588SBarry Smith { 568c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 56987828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y,_DOne=1.0; 570dfbe8321SBarry Smith PetscErrorCode ierr; 5710805154bSBarry Smith PetscBLASInt m, n, _One=1; 5723a40ed3dSBarry Smith 5733a40ed3dSBarry Smith PetscFunctionBegin; 574d0f46423SBarry Smith m = PetscBLASIntCast(A->rmap->n); 575d0f46423SBarry Smith n = PetscBLASIntCast(A->cmap->n); 576d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 577600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 5781ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 5791ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 58071044d3cSBarry Smith BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One); 5811ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 5821ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 583d0f46423SBarry Smith ierr = PetscLogFlops(2*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 5843a40ed3dSBarry Smith PetscFunctionReturn(0); 585289bc588SBarry Smith } 5866ee01492SSatish Balay 5874a2ae208SSatish Balay #undef __FUNCT__ 5884a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense" 589dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 590289bc588SBarry Smith { 591c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 59287828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y; 593dfbe8321SBarry Smith PetscErrorCode ierr; 5940805154bSBarry Smith PetscBLASInt m, n, _One=1; 59587828ca2SBarry Smith PetscScalar _DOne=1.0; 5963a40ed3dSBarry Smith 5973a40ed3dSBarry Smith PetscFunctionBegin; 598d0f46423SBarry Smith m = PetscBLASIntCast(A->rmap->n); 599d0f46423SBarry Smith n = PetscBLASIntCast(A->cmap->n); 600d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 601600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 6021ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 6031ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 60471044d3cSBarry Smith BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One); 6051ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 6061ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 607d0f46423SBarry Smith ierr = PetscLogFlops(2*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 6083a40ed3dSBarry Smith PetscFunctionReturn(0); 609289bc588SBarry Smith } 610289bc588SBarry Smith 611289bc588SBarry Smith /* -----------------------------------------------------------------*/ 6124a2ae208SSatish Balay #undef __FUNCT__ 6134a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense" 61413f74950SBarry Smith PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 615289bc588SBarry Smith { 616c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 61787828ca2SBarry Smith PetscScalar *v; 6186849ba73SBarry Smith PetscErrorCode ierr; 61913f74950SBarry Smith PetscInt i; 62067e560aaSBarry Smith 6213a40ed3dSBarry Smith PetscFunctionBegin; 622d0f46423SBarry Smith *ncols = A->cmap->n; 623289bc588SBarry Smith if (cols) { 624d0f46423SBarry Smith ierr = PetscMalloc((A->cmap->n+1)*sizeof(PetscInt),cols);CHKERRQ(ierr); 625d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) (*cols)[i] = i; 626289bc588SBarry Smith } 627289bc588SBarry Smith if (vals) { 628d0f46423SBarry Smith ierr = PetscMalloc((A->cmap->n+1)*sizeof(PetscScalar),vals);CHKERRQ(ierr); 629289bc588SBarry Smith v = mat->v + row; 630d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;} 631289bc588SBarry Smith } 6323a40ed3dSBarry Smith PetscFunctionReturn(0); 633289bc588SBarry Smith } 6346ee01492SSatish Balay 6354a2ae208SSatish Balay #undef __FUNCT__ 6364a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense" 63713f74950SBarry Smith PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 638289bc588SBarry Smith { 639dfbe8321SBarry Smith PetscErrorCode ierr; 640606d414cSSatish Balay PetscFunctionBegin; 641606d414cSSatish Balay if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);} 642606d414cSSatish Balay if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); } 6433a40ed3dSBarry Smith PetscFunctionReturn(0); 644289bc588SBarry Smith } 645289bc588SBarry Smith /* ----------------------------------------------------------------*/ 6464a2ae208SSatish Balay #undef __FUNCT__ 6474a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense" 64813f74950SBarry Smith PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv) 649289bc588SBarry Smith { 650c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 65113f74950SBarry Smith PetscInt i,j,idx=0; 652d6dfbf8fSBarry Smith 6533a40ed3dSBarry Smith PetscFunctionBegin; 654289bc588SBarry Smith if (!mat->roworiented) { 655dbb450caSBarry Smith if (addv == INSERT_VALUES) { 656289bc588SBarry Smith for (j=0; j<n; j++) { 657cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 6582515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 659d0f46423SBarry Smith if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1); 66058804f6dSBarry Smith #endif 661289bc588SBarry Smith for (i=0; i<m; i++) { 662cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 6632515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 664d0f46423SBarry Smith if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1); 66558804f6dSBarry Smith #endif 666cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 667289bc588SBarry Smith } 668289bc588SBarry Smith } 6693a40ed3dSBarry Smith } else { 670289bc588SBarry Smith for (j=0; j<n; j++) { 671cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 6722515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 673d0f46423SBarry Smith if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1); 67458804f6dSBarry Smith #endif 675289bc588SBarry Smith for (i=0; i<m; i++) { 676cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 6772515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 678d0f46423SBarry Smith if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1); 67958804f6dSBarry Smith #endif 680cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 681289bc588SBarry Smith } 682289bc588SBarry Smith } 683289bc588SBarry Smith } 6843a40ed3dSBarry Smith } else { 685dbb450caSBarry Smith if (addv == INSERT_VALUES) { 686e8d4e0b9SBarry Smith for (i=0; i<m; i++) { 687cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 6882515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 689d0f46423SBarry Smith if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1); 69058804f6dSBarry Smith #endif 691e8d4e0b9SBarry Smith for (j=0; j<n; j++) { 692cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 6932515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 694d0f46423SBarry Smith if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1); 69558804f6dSBarry Smith #endif 696cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 697e8d4e0b9SBarry Smith } 698e8d4e0b9SBarry Smith } 6993a40ed3dSBarry Smith } else { 700289bc588SBarry Smith for (i=0; i<m; i++) { 701cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 7022515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 703d0f46423SBarry Smith if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1); 70458804f6dSBarry Smith #endif 705289bc588SBarry Smith for (j=0; j<n; j++) { 706cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 7072515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 708d0f46423SBarry Smith if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1); 70958804f6dSBarry Smith #endif 710cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 711289bc588SBarry Smith } 712289bc588SBarry Smith } 713289bc588SBarry Smith } 714e8d4e0b9SBarry Smith } 7153a40ed3dSBarry Smith PetscFunctionReturn(0); 716289bc588SBarry Smith } 717e8d4e0b9SBarry Smith 7184a2ae208SSatish Balay #undef __FUNCT__ 7194a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense" 72013f74950SBarry Smith PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[]) 721ae80bb75SLois Curfman McInnes { 722ae80bb75SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 72313f74950SBarry Smith PetscInt i,j; 724ae80bb75SLois Curfman McInnes 7253a40ed3dSBarry Smith PetscFunctionBegin; 726ae80bb75SLois Curfman McInnes /* row-oriented output */ 727ae80bb75SLois Curfman McInnes for (i=0; i<m; i++) { 72897e567efSBarry Smith if (indexm[i] < 0) {v += n;continue;} 729d0f46423SBarry Smith if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row %D requested larger than number rows %D",indexm[i],A->rmap->n); 730ae80bb75SLois Curfman McInnes for (j=0; j<n; j++) { 7316f31f424SBarry Smith if (indexn[j] < 0) {v++; continue;} 732d0f46423SBarry Smith if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column %D requested larger than number columns %D",indexn[j],A->cmap->n); 73397e567efSBarry Smith *v++ = mat->v[indexn[j]*mat->lda + indexm[i]]; 734ae80bb75SLois Curfman McInnes } 735ae80bb75SLois Curfman McInnes } 7363a40ed3dSBarry Smith PetscFunctionReturn(0); 737ae80bb75SLois Curfman McInnes } 738ae80bb75SLois Curfman McInnes 739289bc588SBarry Smith /* -----------------------------------------------------------------*/ 740289bc588SBarry Smith 741e090d566SSatish Balay #include "petscsys.h" 74288e32edaSLois Curfman McInnes 7434a2ae208SSatish Balay #undef __FUNCT__ 7444a2ae208SSatish Balay #define __FUNCT__ "MatLoad_SeqDense" 745a313700dSBarry Smith PetscErrorCode MatLoad_SeqDense(PetscViewer viewer, const MatType type,Mat *A) 74688e32edaSLois Curfman McInnes { 74788e32edaSLois Curfman McInnes Mat_SeqDense *a; 74888e32edaSLois Curfman McInnes Mat B; 7496849ba73SBarry Smith PetscErrorCode ierr; 75013f74950SBarry Smith PetscInt *scols,i,j,nz,header[4]; 75113f74950SBarry Smith int fd; 75213f74950SBarry Smith PetscMPIInt size; 75313f74950SBarry Smith PetscInt *rowlengths = 0,M,N,*cols; 75487828ca2SBarry Smith PetscScalar *vals,*svals,*v,*w; 75519bcc07fSBarry Smith MPI_Comm comm = ((PetscObject)viewer)->comm; 75688e32edaSLois Curfman McInnes 7573a40ed3dSBarry Smith PetscFunctionBegin; 758d132466eSBarry Smith ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 75929bbc08cSBarry Smith if (size > 1) SETERRQ(PETSC_ERR_ARG_WRONG,"view must have one processor"); 760b0a32e0cSBarry Smith ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 7610752156aSBarry Smith ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr); 762552e946dSBarry Smith if (header[0] != MAT_FILE_COOKIE) SETERRQ(PETSC_ERR_FILE_UNEXPECTED,"Not matrix object"); 76388e32edaSLois Curfman McInnes M = header[1]; N = header[2]; nz = header[3]; 76488e32edaSLois Curfman McInnes 76590ace30eSBarry Smith if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */ 766f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 767f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,M,N,M,N);CHKERRQ(ierr); 768be5d1d56SKris Buschelman ierr = MatSetType(*A,type);CHKERRQ(ierr); 7695c5985e7SKris Buschelman ierr = MatSeqDenseSetPreallocation(*A,PETSC_NULL);CHKERRQ(ierr); 77090ace30eSBarry Smith B = *A; 77190ace30eSBarry Smith a = (Mat_SeqDense*)B->data; 7724a41a4d3SSatish Balay v = a->v; 7734a41a4d3SSatish Balay /* Allocate some temp space to read in the values and then flip them 7744a41a4d3SSatish Balay from row major to column major */ 775b72907f3SBarry Smith ierr = PetscMalloc((M*N > 0 ? M*N : 1)*sizeof(PetscScalar),&w);CHKERRQ(ierr); 77690ace30eSBarry Smith /* read in nonzero values */ 7774a41a4d3SSatish Balay ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr); 7784a41a4d3SSatish Balay /* now flip the values and store them in the matrix*/ 7794a41a4d3SSatish Balay for (j=0; j<N; j++) { 7804a41a4d3SSatish Balay for (i=0; i<M; i++) { 7814a41a4d3SSatish Balay *v++ =w[i*N+j]; 7824a41a4d3SSatish Balay } 7834a41a4d3SSatish Balay } 784606d414cSSatish Balay ierr = PetscFree(w);CHKERRQ(ierr); 7856d4a8577SBarry Smith ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 7866d4a8577SBarry Smith ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 78790ace30eSBarry Smith } else { 78888e32edaSLois Curfman McInnes /* read row lengths */ 78913f74950SBarry Smith ierr = PetscMalloc((M+1)*sizeof(PetscInt),&rowlengths);CHKERRQ(ierr); 7900752156aSBarry Smith ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr); 79188e32edaSLois Curfman McInnes 79288e32edaSLois Curfman McInnes /* create our matrix */ 793f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 794f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,M,N,M,N);CHKERRQ(ierr); 795be5d1d56SKris Buschelman ierr = MatSetType(*A,type);CHKERRQ(ierr); 7965c5985e7SKris Buschelman ierr = MatSeqDenseSetPreallocation(*A,PETSC_NULL);CHKERRQ(ierr); 79788e32edaSLois Curfman McInnes B = *A; 79888e32edaSLois Curfman McInnes a = (Mat_SeqDense*)B->data; 79988e32edaSLois Curfman McInnes v = a->v; 80088e32edaSLois Curfman McInnes 80188e32edaSLois Curfman McInnes /* read column indices and nonzeros */ 80213f74950SBarry Smith ierr = PetscMalloc((nz+1)*sizeof(PetscInt),&scols);CHKERRQ(ierr); 803b0a32e0cSBarry Smith cols = scols; 8040752156aSBarry Smith ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr); 80587828ca2SBarry Smith ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&svals);CHKERRQ(ierr); 806b0a32e0cSBarry Smith vals = svals; 8070752156aSBarry Smith ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr); 80888e32edaSLois Curfman McInnes 80988e32edaSLois Curfman McInnes /* insert into matrix */ 81088e32edaSLois Curfman McInnes for (i=0; i<M; i++) { 81188e32edaSLois Curfman McInnes for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j]; 81288e32edaSLois Curfman McInnes svals += rowlengths[i]; scols += rowlengths[i]; 81388e32edaSLois Curfman McInnes } 814606d414cSSatish Balay ierr = PetscFree(vals);CHKERRQ(ierr); 815606d414cSSatish Balay ierr = PetscFree(cols);CHKERRQ(ierr); 816606d414cSSatish Balay ierr = PetscFree(rowlengths);CHKERRQ(ierr); 81788e32edaSLois Curfman McInnes 8186d4a8577SBarry Smith ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 8196d4a8577SBarry Smith ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 82090ace30eSBarry Smith } 8213a40ed3dSBarry Smith PetscFunctionReturn(0); 82288e32edaSLois Curfman McInnes } 82388e32edaSLois Curfman McInnes 824e090d566SSatish Balay #include "petscsys.h" 825932b0c3eSLois Curfman McInnes 8264a2ae208SSatish Balay #undef __FUNCT__ 8274a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII" 8286849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer) 829289bc588SBarry Smith { 830932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 831dfbe8321SBarry Smith PetscErrorCode ierr; 83213f74950SBarry Smith PetscInt i,j; 8332dcb1b2aSMatthew Knepley const char *name; 83487828ca2SBarry Smith PetscScalar *v; 835f3ef73ceSBarry Smith PetscViewerFormat format; 8365f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX) 8375f481a85SSatish Balay PetscTruth allreal = PETSC_TRUE; 8385f481a85SSatish Balay #endif 839932b0c3eSLois Curfman McInnes 8403a40ed3dSBarry Smith PetscFunctionBegin; 841435da068SBarry Smith ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr); 842b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 843456192e2SBarry Smith if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 8443a40ed3dSBarry Smith PetscFunctionReturn(0); /* do nothing for now */ 845fb9695e5SSatish Balay } else if (format == PETSC_VIEWER_ASCII_COMMON) { 846b0a32e0cSBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_NO);CHKERRQ(ierr); 847d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 84844cd7ae7SLois Curfman McInnes v = a->v + i; 84977431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr); 850d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 851aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 852329f5518SBarry Smith if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) { 853a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G + %G i) ",j,PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr); 854329f5518SBarry Smith } else if (PetscRealPart(*v)) { 855a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,PetscRealPart(*v));CHKERRQ(ierr); 8566831982aSBarry Smith } 85780cd9d93SLois Curfman McInnes #else 8586831982aSBarry Smith if (*v) { 859a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,*v);CHKERRQ(ierr); 8606831982aSBarry Smith } 86180cd9d93SLois Curfman McInnes #endif 8621b807ce4Svictorle v += a->lda; 86380cd9d93SLois Curfman McInnes } 864b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 86580cd9d93SLois Curfman McInnes } 866b0a32e0cSBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_YES);CHKERRQ(ierr); 8673a40ed3dSBarry Smith } else { 868b0a32e0cSBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_NO);CHKERRQ(ierr); 869aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 87047989497SBarry Smith /* determine if matrix has all real values */ 87147989497SBarry Smith v = a->v; 872d0f46423SBarry Smith for (i=0; i<A->rmap->n*A->cmap->n; i++) { 873ffac6cdbSBarry Smith if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break ;} 87447989497SBarry Smith } 87547989497SBarry Smith #endif 876fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 8773a7fca6bSBarry Smith ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr); 878d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr); 879d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 880fb9695e5SSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr); 881ffac6cdbSBarry Smith } 882ffac6cdbSBarry Smith 883d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 884932b0c3eSLois Curfman McInnes v = a->v + i; 885d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 886aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 88747989497SBarry Smith if (allreal) { 888f32d5d43SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",PetscRealPart(*v));CHKERRQ(ierr); 88947989497SBarry Smith } else { 890f32d5d43SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16e i ",PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr); 89147989497SBarry Smith } 892289bc588SBarry Smith #else 893f32d5d43SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",*v);CHKERRQ(ierr); 894289bc588SBarry Smith #endif 8951b807ce4Svictorle v += a->lda; 896289bc588SBarry Smith } 897b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 898289bc588SBarry Smith } 899fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 900b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr); 901ffac6cdbSBarry Smith } 902b0a32e0cSBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_YES);CHKERRQ(ierr); 903da3a660dSBarry Smith } 904b0a32e0cSBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 9053a40ed3dSBarry Smith PetscFunctionReturn(0); 906289bc588SBarry Smith } 907289bc588SBarry Smith 9084a2ae208SSatish Balay #undef __FUNCT__ 9094a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary" 9106849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer) 911932b0c3eSLois Curfman McInnes { 912932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 9136849ba73SBarry Smith PetscErrorCode ierr; 91413f74950SBarry Smith int fd; 915d0f46423SBarry Smith PetscInt ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n; 91687828ca2SBarry Smith PetscScalar *v,*anonz,*vals; 917f3ef73ceSBarry Smith PetscViewerFormat format; 918932b0c3eSLois Curfman McInnes 9193a40ed3dSBarry Smith PetscFunctionBegin; 920b0a32e0cSBarry Smith ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 92190ace30eSBarry Smith 922b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 923fb9695e5SSatish Balay if (format == PETSC_VIEWER_BINARY_NATIVE) { 92490ace30eSBarry Smith /* store the matrix as a dense matrix */ 92513f74950SBarry Smith ierr = PetscMalloc(4*sizeof(PetscInt),&col_lens);CHKERRQ(ierr); 926552e946dSBarry Smith col_lens[0] = MAT_FILE_COOKIE; 92790ace30eSBarry Smith col_lens[1] = m; 92890ace30eSBarry Smith col_lens[2] = n; 92990ace30eSBarry Smith col_lens[3] = MATRIX_BINARY_FORMAT_DENSE; 9306f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 931606d414cSSatish Balay ierr = PetscFree(col_lens);CHKERRQ(ierr); 93290ace30eSBarry Smith 93390ace30eSBarry Smith /* write out matrix, by rows */ 93487828ca2SBarry Smith ierr = PetscMalloc((m*n+1)*sizeof(PetscScalar),&vals);CHKERRQ(ierr); 93590ace30eSBarry Smith v = a->v; 93690ace30eSBarry Smith for (j=0; j<n; j++) { 937578230a0SSatish Balay for (i=0; i<m; i++) { 938578230a0SSatish Balay vals[j + i*n] = *v++; 93990ace30eSBarry Smith } 94090ace30eSBarry Smith } 9416f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 942606d414cSSatish Balay ierr = PetscFree(vals);CHKERRQ(ierr); 94390ace30eSBarry Smith } else { 94413f74950SBarry Smith ierr = PetscMalloc((4+nz)*sizeof(PetscInt),&col_lens);CHKERRQ(ierr); 945552e946dSBarry Smith col_lens[0] = MAT_FILE_COOKIE; 946932b0c3eSLois Curfman McInnes col_lens[1] = m; 947932b0c3eSLois Curfman McInnes col_lens[2] = n; 948932b0c3eSLois Curfman McInnes col_lens[3] = nz; 949932b0c3eSLois Curfman McInnes 950932b0c3eSLois Curfman McInnes /* store lengths of each row and write (including header) to file */ 951932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) col_lens[4+i] = n; 9526f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 953932b0c3eSLois Curfman McInnes 954932b0c3eSLois Curfman McInnes /* Possibly should write in smaller increments, not whole matrix at once? */ 955932b0c3eSLois Curfman McInnes /* store column indices (zero start index) */ 956932b0c3eSLois Curfman McInnes ict = 0; 957932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 958932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) col_lens[ict++] = j; 959932b0c3eSLois Curfman McInnes } 9606f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 961606d414cSSatish Balay ierr = PetscFree(col_lens);CHKERRQ(ierr); 962932b0c3eSLois Curfman McInnes 963932b0c3eSLois Curfman McInnes /* store nonzero values */ 96487828ca2SBarry Smith ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&anonz);CHKERRQ(ierr); 965932b0c3eSLois Curfman McInnes ict = 0; 966932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 967932b0c3eSLois Curfman McInnes v = a->v + i; 968932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) { 9691b807ce4Svictorle anonz[ict++] = *v; v += a->lda; 970932b0c3eSLois Curfman McInnes } 971932b0c3eSLois Curfman McInnes } 9726f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 973606d414cSSatish Balay ierr = PetscFree(anonz);CHKERRQ(ierr); 97490ace30eSBarry Smith } 9753a40ed3dSBarry Smith PetscFunctionReturn(0); 976932b0c3eSLois Curfman McInnes } 977932b0c3eSLois Curfman McInnes 9784a2ae208SSatish Balay #undef __FUNCT__ 9794a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom" 980dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa) 981f1af5d2fSBarry Smith { 982f1af5d2fSBarry Smith Mat A = (Mat) Aa; 983f1af5d2fSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 9846849ba73SBarry Smith PetscErrorCode ierr; 985d0f46423SBarry Smith PetscInt m = A->rmap->n,n = A->cmap->n,color,i,j; 98687828ca2SBarry Smith PetscScalar *v = a->v; 987b0a32e0cSBarry Smith PetscViewer viewer; 988b0a32e0cSBarry Smith PetscDraw popup; 989329f5518SBarry Smith PetscReal xl,yl,xr,yr,x_l,x_r,y_l,y_r,scale,maxv = 0.0; 990f3ef73ceSBarry Smith PetscViewerFormat format; 991f1af5d2fSBarry Smith 992f1af5d2fSBarry Smith PetscFunctionBegin; 993f1af5d2fSBarry Smith 994f1af5d2fSBarry Smith ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr); 995b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 996b0a32e0cSBarry Smith ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr); 997f1af5d2fSBarry Smith 998f1af5d2fSBarry Smith /* Loop over matrix elements drawing boxes */ 999fb9695e5SSatish Balay if (format != PETSC_VIEWER_DRAW_CONTOUR) { 1000f1af5d2fSBarry Smith /* Blue for negative and Red for positive */ 1001b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 1002f1af5d2fSBarry Smith for(j = 0; j < n; j++) { 1003f1af5d2fSBarry Smith x_l = j; 1004f1af5d2fSBarry Smith x_r = x_l + 1.0; 1005f1af5d2fSBarry Smith for(i = 0; i < m; i++) { 1006f1af5d2fSBarry Smith y_l = m - i - 1.0; 1007f1af5d2fSBarry Smith y_r = y_l + 1.0; 1008f1af5d2fSBarry Smith #if defined(PETSC_USE_COMPLEX) 1009329f5518SBarry Smith if (PetscRealPart(v[j*m+i]) > 0.) { 1010b0a32e0cSBarry Smith color = PETSC_DRAW_RED; 1011329f5518SBarry Smith } else if (PetscRealPart(v[j*m+i]) < 0.) { 1012b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 1013f1af5d2fSBarry Smith } else { 1014f1af5d2fSBarry Smith continue; 1015f1af5d2fSBarry Smith } 1016f1af5d2fSBarry Smith #else 1017f1af5d2fSBarry Smith if (v[j*m+i] > 0.) { 1018b0a32e0cSBarry Smith color = PETSC_DRAW_RED; 1019f1af5d2fSBarry Smith } else if (v[j*m+i] < 0.) { 1020b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 1021f1af5d2fSBarry Smith } else { 1022f1af5d2fSBarry Smith continue; 1023f1af5d2fSBarry Smith } 1024f1af5d2fSBarry Smith #endif 1025b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1026f1af5d2fSBarry Smith } 1027f1af5d2fSBarry Smith } 1028f1af5d2fSBarry Smith } else { 1029f1af5d2fSBarry Smith /* use contour shading to indicate magnitude of values */ 1030f1af5d2fSBarry Smith /* first determine max of all nonzero values */ 1031f1af5d2fSBarry Smith for(i = 0; i < m*n; i++) { 1032f1af5d2fSBarry Smith if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]); 1033f1af5d2fSBarry Smith } 1034b0a32e0cSBarry Smith scale = (245.0 - PETSC_DRAW_BASIC_COLORS)/maxv; 1035b0a32e0cSBarry Smith ierr = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr); 1036b0a32e0cSBarry Smith if (popup) {ierr = PetscDrawScalePopup(popup,0.0,maxv);CHKERRQ(ierr);} 1037f1af5d2fSBarry Smith for(j = 0; j < n; j++) { 1038f1af5d2fSBarry Smith x_l = j; 1039f1af5d2fSBarry Smith x_r = x_l + 1.0; 1040f1af5d2fSBarry Smith for(i = 0; i < m; i++) { 1041f1af5d2fSBarry Smith y_l = m - i - 1.0; 1042f1af5d2fSBarry Smith y_r = y_l + 1.0; 1043b0a32e0cSBarry Smith color = PETSC_DRAW_BASIC_COLORS + (int)(scale*PetscAbsScalar(v[j*m+i])); 1044b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1045f1af5d2fSBarry Smith } 1046f1af5d2fSBarry Smith } 1047f1af5d2fSBarry Smith } 1048f1af5d2fSBarry Smith PetscFunctionReturn(0); 1049f1af5d2fSBarry Smith } 1050f1af5d2fSBarry Smith 10514a2ae208SSatish Balay #undef __FUNCT__ 10524a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw" 1053dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer) 1054f1af5d2fSBarry Smith { 1055b0a32e0cSBarry Smith PetscDraw draw; 1056f1af5d2fSBarry Smith PetscTruth isnull; 1057329f5518SBarry Smith PetscReal xr,yr,xl,yl,h,w; 1058dfbe8321SBarry Smith PetscErrorCode ierr; 1059f1af5d2fSBarry Smith 1060f1af5d2fSBarry Smith PetscFunctionBegin; 1061b0a32e0cSBarry Smith ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr); 1062b0a32e0cSBarry Smith ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 1063abc0a331SBarry Smith if (isnull) PetscFunctionReturn(0); 1064f1af5d2fSBarry Smith 1065f1af5d2fSBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr); 1066d0f46423SBarry Smith xr = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0; 1067f1af5d2fSBarry Smith xr += w; yr += h; xl = -w; yl = -h; 1068b0a32e0cSBarry Smith ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr); 1069b0a32e0cSBarry Smith ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr); 1070f1af5d2fSBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",PETSC_NULL);CHKERRQ(ierr); 1071f1af5d2fSBarry Smith PetscFunctionReturn(0); 1072f1af5d2fSBarry Smith } 1073f1af5d2fSBarry Smith 10744a2ae208SSatish Balay #undef __FUNCT__ 10754a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense" 1076dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer) 1077932b0c3eSLois Curfman McInnes { 1078dfbe8321SBarry Smith PetscErrorCode ierr; 10796805f65bSBarry Smith PetscTruth iascii,isbinary,isdraw; 1080932b0c3eSLois Curfman McInnes 10813a40ed3dSBarry Smith PetscFunctionBegin; 108232077d6dSBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr); 1083fb9695e5SSatish Balay ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_BINARY,&isbinary);CHKERRQ(ierr); 1084fb9695e5SSatish Balay ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_DRAW,&isdraw);CHKERRQ(ierr); 10850f5bd95cSBarry Smith 1086c45a1595SBarry Smith if (iascii) { 1087c45a1595SBarry Smith ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr); 10880f5bd95cSBarry Smith } else if (isbinary) { 10893a40ed3dSBarry Smith ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr); 1090f1af5d2fSBarry Smith } else if (isdraw) { 1091f1af5d2fSBarry Smith ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr); 10925cd90555SBarry Smith } else { 1093958c9bccSBarry Smith SETERRQ1(PETSC_ERR_SUP,"Viewer type %s not supported by dense matrix",((PetscObject)viewer)->type_name); 1094932b0c3eSLois Curfman McInnes } 10953a40ed3dSBarry Smith PetscFunctionReturn(0); 1096932b0c3eSLois Curfman McInnes } 1097289bc588SBarry Smith 10984a2ae208SSatish Balay #undef __FUNCT__ 10994a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense" 1100dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqDense(Mat mat) 1101289bc588SBarry Smith { 1102ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)mat->data; 1103dfbe8321SBarry Smith PetscErrorCode ierr; 110490f02eecSBarry Smith 11053a40ed3dSBarry Smith PetscFunctionBegin; 1106aa482453SBarry Smith #if defined(PETSC_USE_LOG) 1107d0f46423SBarry Smith PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n); 1108a5a9c739SBarry Smith #endif 110905b42c5fSBarry Smith ierr = PetscFree(l->pivots);CHKERRQ(ierr); 11106857c123SSatish Balay if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);} 1111606d414cSSatish Balay ierr = PetscFree(l);CHKERRQ(ierr); 1112dbd8c25aSHong Zhang 1113dbd8c25aSHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr); 1114901853e0SKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatSeqDenseSetPreallocation_C","",PETSC_NULL);CHKERRQ(ierr); 11154ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMult_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr); 11164ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr); 11174ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr); 11183a40ed3dSBarry Smith PetscFunctionReturn(0); 1119289bc588SBarry Smith } 1120289bc588SBarry Smith 11214a2ae208SSatish Balay #undef __FUNCT__ 11224a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense" 1123fc4dec0aSBarry Smith PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout) 1124289bc588SBarry Smith { 1125c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 11266849ba73SBarry Smith PetscErrorCode ierr; 112713f74950SBarry Smith PetscInt k,j,m,n,M; 112887828ca2SBarry Smith PetscScalar *v,tmp; 112948b35521SBarry Smith 11303a40ed3dSBarry Smith PetscFunctionBegin; 1131d0f46423SBarry Smith v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n; 1132e9695a30SBarry Smith if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */ 1133a5ce6ee0Svictorle if (m != n) { 1134634064b4SBarry Smith SETERRQ(PETSC_ERR_SUP,"Can not transpose non-square matrix in place"); 1135d64ed03dSBarry Smith } else { 1136d3e5ee88SLois Curfman McInnes for (j=0; j<m; j++) { 1137289bc588SBarry Smith for (k=0; k<j; k++) { 11381b807ce4Svictorle tmp = v[j + k*M]; 11391b807ce4Svictorle v[j + k*M] = v[k + j*M]; 11401b807ce4Svictorle v[k + j*M] = tmp; 1141289bc588SBarry Smith } 1142289bc588SBarry Smith } 1143d64ed03dSBarry Smith } 11443a40ed3dSBarry Smith } else { /* out-of-place transpose */ 1145d3e5ee88SLois Curfman McInnes Mat tmat; 1146ec8511deSBarry Smith Mat_SeqDense *tmatd; 114787828ca2SBarry Smith PetscScalar *v2; 1148ea709b57SSatish Balay 1149fc4dec0aSBarry Smith if (reuse == MAT_INITIAL_MATRIX) { 11507adad957SLisandro Dalcin ierr = MatCreate(((PetscObject)A)->comm,&tmat);CHKERRQ(ierr); 1151d0f46423SBarry Smith ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr); 11527adad957SLisandro Dalcin ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 11535c5985e7SKris Buschelman ierr = MatSeqDenseSetPreallocation(tmat,PETSC_NULL);CHKERRQ(ierr); 1154fc4dec0aSBarry Smith } else { 1155fc4dec0aSBarry Smith tmat = *matout; 1156fc4dec0aSBarry Smith } 1157ec8511deSBarry Smith tmatd = (Mat_SeqDense*)tmat->data; 11580de55854SLois Curfman McInnes v = mat->v; v2 = tmatd->v; 1159d3e5ee88SLois Curfman McInnes for (j=0; j<n; j++) { 11601b807ce4Svictorle for (k=0; k<m; k++) v2[j + k*n] = v[k + j*M]; 1161d3e5ee88SLois Curfman McInnes } 11626d4a8577SBarry Smith ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 11636d4a8577SBarry Smith ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1164d3e5ee88SLois Curfman McInnes *matout = tmat; 116548b35521SBarry Smith } 11663a40ed3dSBarry Smith PetscFunctionReturn(0); 1167289bc588SBarry Smith } 1168289bc588SBarry Smith 11694a2ae208SSatish Balay #undef __FUNCT__ 11704a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense" 1171dfbe8321SBarry Smith PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscTruth *flg) 1172289bc588SBarry Smith { 1173c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data; 1174c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data; 117513f74950SBarry Smith PetscInt i,j; 117687828ca2SBarry Smith PetscScalar *v1 = mat1->v,*v2 = mat2->v; 11779ea5d5aeSSatish Balay 11783a40ed3dSBarry Smith PetscFunctionBegin; 1179d0f46423SBarry Smith if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1180d0f46423SBarry Smith if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1181d0f46423SBarry Smith for (i=0; i<A1->rmap->n; i++) { 11821b807ce4Svictorle v1 = mat1->v+i; v2 = mat2->v+i; 1183d0f46423SBarry Smith for (j=0; j<A1->cmap->n; j++) { 11843a40ed3dSBarry Smith if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 11851b807ce4Svictorle v1 += mat1->lda; v2 += mat2->lda; 11861b807ce4Svictorle } 1187289bc588SBarry Smith } 118877c4ece6SBarry Smith *flg = PETSC_TRUE; 11893a40ed3dSBarry Smith PetscFunctionReturn(0); 1190289bc588SBarry Smith } 1191289bc588SBarry Smith 11924a2ae208SSatish Balay #undef __FUNCT__ 11934a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense" 1194dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v) 1195289bc588SBarry Smith { 1196c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1197dfbe8321SBarry Smith PetscErrorCode ierr; 119813f74950SBarry Smith PetscInt i,n,len; 119987828ca2SBarry Smith PetscScalar *x,zero = 0.0; 120044cd7ae7SLois Curfman McInnes 12013a40ed3dSBarry Smith PetscFunctionBegin; 12022dcb1b2aSMatthew Knepley ierr = VecSet(v,zero);CHKERRQ(ierr); 12037a97a34bSBarry Smith ierr = VecGetSize(v,&n);CHKERRQ(ierr); 12041ebc52fbSHong Zhang ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1205d0f46423SBarry Smith len = PetscMin(A->rmap->n,A->cmap->n); 1206d0f46423SBarry Smith if (n != A->rmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec"); 120744cd7ae7SLois Curfman McInnes for (i=0; i<len; i++) { 12081b807ce4Svictorle x[i] = mat->v[i*mat->lda + i]; 1209289bc588SBarry Smith } 12101ebc52fbSHong Zhang ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 12113a40ed3dSBarry Smith PetscFunctionReturn(0); 1212289bc588SBarry Smith } 1213289bc588SBarry Smith 12144a2ae208SSatish Balay #undef __FUNCT__ 12154a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense" 1216dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr) 1217289bc588SBarry Smith { 1218c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 121987828ca2SBarry Smith PetscScalar *l,*r,x,*v; 1220dfbe8321SBarry Smith PetscErrorCode ierr; 1221d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n; 122255659b69SBarry Smith 12233a40ed3dSBarry Smith PetscFunctionBegin; 122428988994SBarry Smith if (ll) { 12257a97a34bSBarry Smith ierr = VecGetSize(ll,&m);CHKERRQ(ierr); 12261ebc52fbSHong Zhang ierr = VecGetArray(ll,&l);CHKERRQ(ierr); 1227d0f46423SBarry Smith if (m != A->rmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size"); 1228da3a660dSBarry Smith for (i=0; i<m; i++) { 1229da3a660dSBarry Smith x = l[i]; 1230da3a660dSBarry Smith v = mat->v + i; 1231da3a660dSBarry Smith for (j=0; j<n; j++) { (*v) *= x; v+= m;} 1232da3a660dSBarry Smith } 12331ebc52fbSHong Zhang ierr = VecRestoreArray(ll,&l);CHKERRQ(ierr); 1234efee365bSSatish Balay ierr = PetscLogFlops(n*m);CHKERRQ(ierr); 1235da3a660dSBarry Smith } 123628988994SBarry Smith if (rr) { 12377a97a34bSBarry Smith ierr = VecGetSize(rr,&n);CHKERRQ(ierr); 12381ebc52fbSHong Zhang ierr = VecGetArray(rr,&r);CHKERRQ(ierr); 1239d0f46423SBarry Smith if (n != A->cmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size"); 1240da3a660dSBarry Smith for (i=0; i<n; i++) { 1241da3a660dSBarry Smith x = r[i]; 1242da3a660dSBarry Smith v = mat->v + i*m; 1243da3a660dSBarry Smith for (j=0; j<m; j++) { (*v++) *= x;} 1244da3a660dSBarry Smith } 12451ebc52fbSHong Zhang ierr = VecRestoreArray(rr,&r);CHKERRQ(ierr); 1246efee365bSSatish Balay ierr = PetscLogFlops(n*m);CHKERRQ(ierr); 1247da3a660dSBarry Smith } 12483a40ed3dSBarry Smith PetscFunctionReturn(0); 1249289bc588SBarry Smith } 1250289bc588SBarry Smith 12514a2ae208SSatish Balay #undef __FUNCT__ 12524a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense" 1253dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm) 1254289bc588SBarry Smith { 1255c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 125687828ca2SBarry Smith PetscScalar *v = mat->v; 1257329f5518SBarry Smith PetscReal sum = 0.0; 1258d0f46423SBarry Smith PetscInt lda=mat->lda,m=A->rmap->n,i,j; 1259efee365bSSatish Balay PetscErrorCode ierr; 126055659b69SBarry Smith 12613a40ed3dSBarry Smith PetscFunctionBegin; 1262289bc588SBarry Smith if (type == NORM_FROBENIUS) { 1263a5ce6ee0Svictorle if (lda>m) { 1264d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1265a5ce6ee0Svictorle v = mat->v+j*lda; 1266a5ce6ee0Svictorle for (i=0; i<m; i++) { 1267a5ce6ee0Svictorle #if defined(PETSC_USE_COMPLEX) 1268a5ce6ee0Svictorle sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1269a5ce6ee0Svictorle #else 1270a5ce6ee0Svictorle sum += (*v)*(*v); v++; 1271a5ce6ee0Svictorle #endif 1272a5ce6ee0Svictorle } 1273a5ce6ee0Svictorle } 1274a5ce6ee0Svictorle } else { 1275d0f46423SBarry Smith for (i=0; i<A->cmap->n*A->rmap->n; i++) { 1276aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 1277329f5518SBarry Smith sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1278289bc588SBarry Smith #else 1279289bc588SBarry Smith sum += (*v)*(*v); v++; 1280289bc588SBarry Smith #endif 1281289bc588SBarry Smith } 1282a5ce6ee0Svictorle } 1283064f8208SBarry Smith *nrm = sqrt(sum); 1284d0f46423SBarry Smith ierr = PetscLogFlops(2*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 12853a40ed3dSBarry Smith } else if (type == NORM_1) { 1286064f8208SBarry Smith *nrm = 0.0; 1287d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 12881b807ce4Svictorle v = mat->v + j*mat->lda; 1289289bc588SBarry Smith sum = 0.0; 1290d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 129133a8263dSBarry Smith sum += PetscAbsScalar(*v); v++; 1292289bc588SBarry Smith } 1293064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1294289bc588SBarry Smith } 1295d0f46423SBarry Smith ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr); 12963a40ed3dSBarry Smith } else if (type == NORM_INFINITY) { 1297064f8208SBarry Smith *nrm = 0.0; 1298d0f46423SBarry Smith for (j=0; j<A->rmap->n; j++) { 1299289bc588SBarry Smith v = mat->v + j; 1300289bc588SBarry Smith sum = 0.0; 1301d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) { 13021b807ce4Svictorle sum += PetscAbsScalar(*v); v += mat->lda; 1303289bc588SBarry Smith } 1304064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1305289bc588SBarry Smith } 1306d0f46423SBarry Smith ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr); 13073a40ed3dSBarry Smith } else { 130829bbc08cSBarry Smith SETERRQ(PETSC_ERR_SUP,"No two norm"); 1309289bc588SBarry Smith } 13103a40ed3dSBarry Smith PetscFunctionReturn(0); 1311289bc588SBarry Smith } 1312289bc588SBarry Smith 13134a2ae208SSatish Balay #undef __FUNCT__ 13144a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense" 13154e0d8c25SBarry Smith PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscTruth flg) 1316289bc588SBarry Smith { 1317c0bbcb79SLois Curfman McInnes Mat_SeqDense *aij = (Mat_SeqDense*)A->data; 131863ba0a88SBarry Smith PetscErrorCode ierr; 131967e560aaSBarry Smith 13203a40ed3dSBarry Smith PetscFunctionBegin; 1321b5a2b587SKris Buschelman switch (op) { 1322b5a2b587SKris Buschelman case MAT_ROW_ORIENTED: 13234e0d8c25SBarry Smith aij->roworiented = flg; 1324b5a2b587SKris Buschelman break; 1325512a5fc5SBarry Smith case MAT_NEW_NONZERO_LOCATIONS: 1326b5a2b587SKris Buschelman case MAT_NEW_NONZERO_LOCATION_ERR: 13273971808eSMatthew Knepley case MAT_NEW_NONZERO_ALLOCATION_ERR: 13284e0d8c25SBarry Smith case MAT_NEW_DIAGONALS: 1329b5a2b587SKris Buschelman case MAT_IGNORE_OFF_PROC_ENTRIES: 1330b5a2b587SKris Buschelman case MAT_USE_HASH_TABLE: 133177e54ba9SKris Buschelman case MAT_SYMMETRIC: 133277e54ba9SKris Buschelman case MAT_STRUCTURALLY_SYMMETRIC: 13339a4540c5SBarry Smith case MAT_HERMITIAN: 13349a4540c5SBarry Smith case MAT_SYMMETRY_ETERNAL: 1335600fe468SBarry Smith case MAT_IGNORE_LOWER_TRIANGULAR: 1336290bbb0aSBarry Smith ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr); 133777e54ba9SKris Buschelman break; 1338b5a2b587SKris Buschelman default: 1339600fe468SBarry Smith SETERRQ1(PETSC_ERR_SUP,"unknown option %s",MatOptions[op]); 13403a40ed3dSBarry Smith } 13413a40ed3dSBarry Smith PetscFunctionReturn(0); 1342289bc588SBarry Smith } 1343289bc588SBarry Smith 13444a2ae208SSatish Balay #undef __FUNCT__ 13454a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense" 1346dfbe8321SBarry Smith PetscErrorCode MatZeroEntries_SeqDense(Mat A) 13476f0a148fSBarry Smith { 1348ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 13496849ba73SBarry Smith PetscErrorCode ierr; 1350d0f46423SBarry Smith PetscInt lda=l->lda,m=A->rmap->n,j; 13513a40ed3dSBarry Smith 13523a40ed3dSBarry Smith PetscFunctionBegin; 1353a5ce6ee0Svictorle if (lda>m) { 1354d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1355a5ce6ee0Svictorle ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 1356a5ce6ee0Svictorle } 1357a5ce6ee0Svictorle } else { 1358d0f46423SBarry Smith ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1359a5ce6ee0Svictorle } 13603a40ed3dSBarry Smith PetscFunctionReturn(0); 13616f0a148fSBarry Smith } 13626f0a148fSBarry Smith 13634a2ae208SSatish Balay #undef __FUNCT__ 13644a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense" 1365f4df32b1SMatthew Knepley PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag) 13666f0a148fSBarry Smith { 1367ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 1368d0f46423SBarry Smith PetscInt n = A->cmap->n,i,j; 136987828ca2SBarry Smith PetscScalar *slot; 137055659b69SBarry Smith 13713a40ed3dSBarry Smith PetscFunctionBegin; 13726f0a148fSBarry Smith for (i=0; i<N; i++) { 13736f0a148fSBarry Smith slot = l->v + rows[i]; 13746f0a148fSBarry Smith for (j=0; j<n; j++) { *slot = 0.0; slot += n;} 13756f0a148fSBarry Smith } 1376f4df32b1SMatthew Knepley if (diag != 0.0) { 13776f0a148fSBarry Smith for (i=0; i<N; i++) { 13786f0a148fSBarry Smith slot = l->v + (n+1)*rows[i]; 1379f4df32b1SMatthew Knepley *slot = diag; 13806f0a148fSBarry Smith } 13816f0a148fSBarry Smith } 13823a40ed3dSBarry Smith PetscFunctionReturn(0); 13836f0a148fSBarry Smith } 1384557bce09SLois Curfman McInnes 13854a2ae208SSatish Balay #undef __FUNCT__ 13864a2ae208SSatish Balay #define __FUNCT__ "MatGetArray_SeqDense" 1387dfbe8321SBarry Smith PetscErrorCode MatGetArray_SeqDense(Mat A,PetscScalar *array[]) 138864e87e97SBarry Smith { 1389c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 13903a40ed3dSBarry Smith 13913a40ed3dSBarry Smith PetscFunctionBegin; 1392d0f46423SBarry Smith if (mat->lda != A->rmap->n) SETERRQ(PETSC_ERR_SUP,"Cannot get array for Dense matrices with LDA different from number of rows"); 139364e87e97SBarry Smith *array = mat->v; 13943a40ed3dSBarry Smith PetscFunctionReturn(0); 139564e87e97SBarry Smith } 13960754003eSLois Curfman McInnes 13974a2ae208SSatish Balay #undef __FUNCT__ 13984a2ae208SSatish Balay #define __FUNCT__ "MatRestoreArray_SeqDense" 1399dfbe8321SBarry Smith PetscErrorCode MatRestoreArray_SeqDense(Mat A,PetscScalar *array[]) 1400ff14e315SSatish Balay { 14013a40ed3dSBarry Smith PetscFunctionBegin; 140209b544d4SBarry Smith *array = 0; /* user cannot accidently use the array later */ 14033a40ed3dSBarry Smith PetscFunctionReturn(0); 1404ff14e315SSatish Balay } 14050754003eSLois Curfman McInnes 14064a2ae208SSatish Balay #undef __FUNCT__ 14074a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense" 140813f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B) 14090754003eSLois Curfman McInnes { 1410c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 14116849ba73SBarry Smith PetscErrorCode ierr; 1412*5d0c19d7SBarry Smith PetscInt i,j,nrows,ncols; 1413*5d0c19d7SBarry Smith const PetscInt *irow,*icol; 141487828ca2SBarry Smith PetscScalar *av,*bv,*v = mat->v; 14150754003eSLois Curfman McInnes Mat newmat; 14160754003eSLois Curfman McInnes 14173a40ed3dSBarry Smith PetscFunctionBegin; 141878b31e54SBarry Smith ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr); 141978b31e54SBarry Smith ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr); 1420e03a110bSBarry Smith ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr); 1421e03a110bSBarry Smith ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr); 14220754003eSLois Curfman McInnes 1423182d2002SSatish Balay /* Check submatrixcall */ 1424182d2002SSatish Balay if (scall == MAT_REUSE_MATRIX) { 142513f74950SBarry Smith PetscInt n_cols,n_rows; 1426182d2002SSatish Balay ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr); 142721a2c019SBarry Smith if (n_rows != nrows || n_cols != ncols) { 142821a2c019SBarry Smith /* resize the result result matrix to match number of requested rows/columns */ 142921a2c019SBarry Smith ierr = MatSetSizes(*B,nrows,nrows,nrows,nrows);CHKERRQ(ierr); 143021a2c019SBarry Smith } 1431182d2002SSatish Balay newmat = *B; 1432182d2002SSatish Balay } else { 14330754003eSLois Curfman McInnes /* Create and fill new matrix */ 14347adad957SLisandro Dalcin ierr = MatCreate(((PetscObject)A)->comm,&newmat);CHKERRQ(ierr); 1435f69a0ea3SMatthew Knepley ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 14367adad957SLisandro Dalcin ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 14375c5985e7SKris Buschelman ierr = MatSeqDenseSetPreallocation(newmat,PETSC_NULL);CHKERRQ(ierr); 1438182d2002SSatish Balay } 1439182d2002SSatish Balay 1440182d2002SSatish Balay /* Now extract the data pointers and do the copy,column at a time */ 1441182d2002SSatish Balay bv = ((Mat_SeqDense*)newmat->data)->v; 1442182d2002SSatish Balay 1443182d2002SSatish Balay for (i=0; i<ncols; i++) { 14446de62eeeSBarry Smith av = v + mat->lda*icol[i]; 1445182d2002SSatish Balay for (j=0; j<nrows; j++) { 1446182d2002SSatish Balay *bv++ = av[irow[j]]; 14470754003eSLois Curfman McInnes } 14480754003eSLois Curfman McInnes } 1449182d2002SSatish Balay 1450182d2002SSatish Balay /* Assemble the matrices so that the correct flags are set */ 14516d4a8577SBarry Smith ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 14526d4a8577SBarry Smith ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 14530754003eSLois Curfman McInnes 14540754003eSLois Curfman McInnes /* Free work space */ 145578b31e54SBarry Smith ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr); 145678b31e54SBarry Smith ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr); 1457182d2002SSatish Balay *B = newmat; 14583a40ed3dSBarry Smith PetscFunctionReturn(0); 14590754003eSLois Curfman McInnes } 14600754003eSLois Curfman McInnes 14614a2ae208SSatish Balay #undef __FUNCT__ 14624a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense" 146313f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[]) 1464905e6a2fSBarry Smith { 14656849ba73SBarry Smith PetscErrorCode ierr; 146613f74950SBarry Smith PetscInt i; 1467905e6a2fSBarry Smith 14683a40ed3dSBarry Smith PetscFunctionBegin; 1469905e6a2fSBarry Smith if (scall == MAT_INITIAL_MATRIX) { 1470b0a32e0cSBarry Smith ierr = PetscMalloc((n+1)*sizeof(Mat),B);CHKERRQ(ierr); 1471905e6a2fSBarry Smith } 1472905e6a2fSBarry Smith 1473905e6a2fSBarry Smith for (i=0; i<n; i++) { 14746a6a5d1dSBarry Smith ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr); 1475905e6a2fSBarry Smith } 14763a40ed3dSBarry Smith PetscFunctionReturn(0); 1477905e6a2fSBarry Smith } 1478905e6a2fSBarry Smith 14794a2ae208SSatish Balay #undef __FUNCT__ 1480c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense" 1481c0aa2d19SHong Zhang PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode) 1482c0aa2d19SHong Zhang { 1483c0aa2d19SHong Zhang PetscFunctionBegin; 1484c0aa2d19SHong Zhang PetscFunctionReturn(0); 1485c0aa2d19SHong Zhang } 1486c0aa2d19SHong Zhang 1487c0aa2d19SHong Zhang #undef __FUNCT__ 1488c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense" 1489c0aa2d19SHong Zhang PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode) 1490c0aa2d19SHong Zhang { 1491c0aa2d19SHong Zhang PetscFunctionBegin; 1492c0aa2d19SHong Zhang PetscFunctionReturn(0); 1493c0aa2d19SHong Zhang } 1494c0aa2d19SHong Zhang 1495c0aa2d19SHong Zhang #undef __FUNCT__ 14964a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense" 1497dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str) 14984b0e389bSBarry Smith { 14994b0e389bSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense *)B->data; 15006849ba73SBarry Smith PetscErrorCode ierr; 1501d0f46423SBarry Smith PetscInt lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j; 15023a40ed3dSBarry Smith 15033a40ed3dSBarry Smith PetscFunctionBegin; 150433f4a19fSKris Buschelman /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */ 150533f4a19fSKris Buschelman if (A->ops->copy != B->ops->copy) { 1506cb5b572fSBarry Smith ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr); 15073a40ed3dSBarry Smith PetscFunctionReturn(0); 15083a40ed3dSBarry Smith } 1509d0f46423SBarry Smith if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"size(B) != size(A)"); 1510a5ce6ee0Svictorle if (lda1>m || lda2>m) { 15110dbb7854Svictorle for (j=0; j<n; j++) { 1512a5ce6ee0Svictorle ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr); 1513a5ce6ee0Svictorle } 1514a5ce6ee0Svictorle } else { 1515d0f46423SBarry Smith ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1516a5ce6ee0Svictorle } 1517273d9f13SBarry Smith PetscFunctionReturn(0); 1518273d9f13SBarry Smith } 1519273d9f13SBarry Smith 15204a2ae208SSatish Balay #undef __FUNCT__ 15214a2ae208SSatish Balay #define __FUNCT__ "MatSetUpPreallocation_SeqDense" 1522dfbe8321SBarry Smith PetscErrorCode MatSetUpPreallocation_SeqDense(Mat A) 1523273d9f13SBarry Smith { 1524dfbe8321SBarry Smith PetscErrorCode ierr; 1525273d9f13SBarry Smith 1526273d9f13SBarry Smith PetscFunctionBegin; 1527273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr); 15283a40ed3dSBarry Smith PetscFunctionReturn(0); 15294b0e389bSBarry Smith } 15304b0e389bSBarry Smith 1531284134d9SBarry Smith #undef __FUNCT__ 1532284134d9SBarry Smith #define __FUNCT__ "MatSetSizes_SeqDense" 1533284134d9SBarry Smith PetscErrorCode MatSetSizes_SeqDense(Mat A,PetscInt m,PetscInt n,PetscInt M,PetscInt N) 1534284134d9SBarry Smith { 1535284134d9SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 153621a2c019SBarry Smith PetscErrorCode ierr; 1537284134d9SBarry Smith PetscFunctionBegin; 153821a2c019SBarry Smith /* this will not be called before lda, Mmax, and Nmax have been set */ 1539284134d9SBarry Smith m = PetscMax(m,M); 1540284134d9SBarry Smith n = PetscMax(n,N); 154121a2c019SBarry Smith if (m > a->Mmax) SETERRQ2(PETSC_ERR_SUP,"Cannot yet resize number rows of dense matrix larger then its initial size %d, requested %d",a->lda,(int)m); 1542284134d9SBarry Smith if (n > a->Nmax) SETERRQ2(PETSC_ERR_SUP,"Cannot yet resize number columns of dense matrix larger then its initial size %d, requested %d",a->Nmax,(int)n); 1543d0f46423SBarry Smith A->rmap->n = A->rmap->n = m; 1544d0f46423SBarry Smith A->cmap->n = A->cmap->N = n; 154521a2c019SBarry Smith if (a->changelda) a->lda = m; 154621a2c019SBarry Smith ierr = PetscMemzero(a->v,m*n*sizeof(PetscScalar));CHKERRQ(ierr); 1547284134d9SBarry Smith PetscFunctionReturn(0); 1548284134d9SBarry Smith } 1549170fe5c8SBarry Smith 1550284134d9SBarry Smith 1551a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/ 1552a9fe9ddaSSatish Balay #undef __FUNCT__ 1553a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense" 1554a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1555a9fe9ddaSSatish Balay { 1556a9fe9ddaSSatish Balay PetscErrorCode ierr; 1557a9fe9ddaSSatish Balay 1558a9fe9ddaSSatish Balay PetscFunctionBegin; 1559a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX){ 1560a9fe9ddaSSatish Balay ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 1561a9fe9ddaSSatish Balay } 1562a9fe9ddaSSatish Balay ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 1563a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1564a9fe9ddaSSatish Balay } 1565a9fe9ddaSSatish Balay 1566a9fe9ddaSSatish Balay #undef __FUNCT__ 1567a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense" 1568a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1569a9fe9ddaSSatish Balay { 1570ee16a9a1SHong Zhang PetscErrorCode ierr; 1571d0f46423SBarry Smith PetscInt m=A->rmap->n,n=B->cmap->n; 1572ee16a9a1SHong Zhang Mat Cmat; 1573a9fe9ddaSSatish Balay 1574ee16a9a1SHong Zhang PetscFunctionBegin; 1575d0f46423SBarry Smith if (A->cmap->n != B->rmap->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"A->cmap->n %d != B->rmap->n %d\n",A->cmap->n,B->rmap->n); 1576ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1577ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1578ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 1579ee16a9a1SHong Zhang ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr); 1580ee16a9a1SHong Zhang Cmat->assembled = PETSC_TRUE; 1581ee16a9a1SHong Zhang *C = Cmat; 1582ee16a9a1SHong Zhang PetscFunctionReturn(0); 1583ee16a9a1SHong Zhang } 1584a9fe9ddaSSatish Balay 158598a3b096SSatish Balay #undef __FUNCT__ 1586a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense" 1587a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1588a9fe9ddaSSatish Balay { 1589a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1590a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1591a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 15920805154bSBarry Smith PetscBLASInt m,n,k; 1593a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1594a9fe9ddaSSatish Balay 1595a9fe9ddaSSatish Balay PetscFunctionBegin; 1596d0f46423SBarry Smith m = PetscBLASIntCast(A->rmap->n); 1597d0f46423SBarry Smith n = PetscBLASIntCast(B->cmap->n); 1598d0f46423SBarry Smith k = PetscBLASIntCast(A->cmap->n); 1599a9fe9ddaSSatish Balay BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda); 1600a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1601a9fe9ddaSSatish Balay } 1602a9fe9ddaSSatish Balay 1603a9fe9ddaSSatish Balay #undef __FUNCT__ 1604a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultTranspose_SeqDense_SeqDense" 1605a9fe9ddaSSatish Balay PetscErrorCode MatMatMultTranspose_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1606a9fe9ddaSSatish Balay { 1607a9fe9ddaSSatish Balay PetscErrorCode ierr; 1608a9fe9ddaSSatish Balay 1609a9fe9ddaSSatish Balay PetscFunctionBegin; 1610a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX){ 1611a9fe9ddaSSatish Balay ierr = MatMatMultTransposeSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 1612a9fe9ddaSSatish Balay } 1613a9fe9ddaSSatish Balay ierr = MatMatMultTransposeNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 1614a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1615a9fe9ddaSSatish Balay } 1616a9fe9ddaSSatish Balay 1617a9fe9ddaSSatish Balay #undef __FUNCT__ 1618a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultTransposeSymbolic_SeqDense_SeqDense" 1619a9fe9ddaSSatish Balay PetscErrorCode MatMatMultTransposeSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1620a9fe9ddaSSatish Balay { 1621ee16a9a1SHong Zhang PetscErrorCode ierr; 1622d0f46423SBarry Smith PetscInt m=A->cmap->n,n=B->cmap->n; 1623ee16a9a1SHong Zhang Mat Cmat; 1624a9fe9ddaSSatish Balay 1625ee16a9a1SHong Zhang PetscFunctionBegin; 1626d0f46423SBarry Smith if (A->rmap->n != B->rmap->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"A->rmap->n %d != B->rmap->n %d\n",A->rmap->n,B->rmap->n); 1627ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1628ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1629ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 1630ee16a9a1SHong Zhang ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr); 1631ee16a9a1SHong Zhang Cmat->assembled = PETSC_TRUE; 1632ee16a9a1SHong Zhang *C = Cmat; 1633ee16a9a1SHong Zhang PetscFunctionReturn(0); 1634ee16a9a1SHong Zhang } 1635a9fe9ddaSSatish Balay 1636a9fe9ddaSSatish Balay #undef __FUNCT__ 1637a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultTransposeNumeric_SeqDense_SeqDense" 1638a9fe9ddaSSatish Balay PetscErrorCode MatMatMultTransposeNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1639a9fe9ddaSSatish Balay { 1640a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1641a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1642a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 16430805154bSBarry Smith PetscBLASInt m,n,k; 1644a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1645a9fe9ddaSSatish Balay 1646a9fe9ddaSSatish Balay PetscFunctionBegin; 1647d0f46423SBarry Smith m = PetscBLASIntCast(A->cmap->n); 1648d0f46423SBarry Smith n = PetscBLASIntCast(B->cmap->n); 1649d0f46423SBarry Smith k = PetscBLASIntCast(A->rmap->n); 16502fbe02b9SBarry Smith /* 16512fbe02b9SBarry Smith Note the m and n arguments below are the number rows and columns of A', not A! 16522fbe02b9SBarry Smith */ 1653a9fe9ddaSSatish Balay BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda); 1654a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1655a9fe9ddaSSatish Balay } 1656985db425SBarry Smith 1657985db425SBarry Smith #undef __FUNCT__ 1658985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense" 1659985db425SBarry Smith PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[]) 1660985db425SBarry Smith { 1661985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1662985db425SBarry Smith PetscErrorCode ierr; 1663d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1664985db425SBarry Smith PetscScalar *x; 1665985db425SBarry Smith MatScalar *aa = a->v; 1666985db425SBarry Smith 1667985db425SBarry Smith PetscFunctionBegin; 1668985db425SBarry Smith if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1669985db425SBarry Smith 1670985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1671985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1672985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1673d0f46423SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1674985db425SBarry Smith for (i=0; i<m; i++) { 1675985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 1676985db425SBarry Smith for (j=1; j<n; j++){ 1677985db425SBarry Smith if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 1678985db425SBarry Smith } 1679985db425SBarry Smith } 1680985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1681985db425SBarry Smith PetscFunctionReturn(0); 1682985db425SBarry Smith } 1683985db425SBarry Smith 1684985db425SBarry Smith #undef __FUNCT__ 1685985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense" 1686985db425SBarry Smith PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[]) 1687985db425SBarry Smith { 1688985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1689985db425SBarry Smith PetscErrorCode ierr; 1690d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1691985db425SBarry Smith PetscScalar *x; 1692985db425SBarry Smith PetscReal atmp; 1693985db425SBarry Smith MatScalar *aa = a->v; 1694985db425SBarry Smith 1695985db425SBarry Smith PetscFunctionBegin; 1696985db425SBarry Smith if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1697985db425SBarry Smith 1698985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1699985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1700985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1701d0f46423SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1702985db425SBarry Smith for (i=0; i<m; i++) { 17039189402eSHong Zhang x[i] = PetscAbsScalar(aa[i]); 1704985db425SBarry Smith for (j=1; j<n; j++){ 1705985db425SBarry Smith atmp = PetscAbsScalar(aa[i+m*j]); 1706985db425SBarry Smith if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;} 1707985db425SBarry Smith } 1708985db425SBarry Smith } 1709985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1710985db425SBarry Smith PetscFunctionReturn(0); 1711985db425SBarry Smith } 1712985db425SBarry Smith 1713985db425SBarry Smith #undef __FUNCT__ 1714985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense" 1715985db425SBarry Smith PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[]) 1716985db425SBarry Smith { 1717985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1718985db425SBarry Smith PetscErrorCode ierr; 1719d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1720985db425SBarry Smith PetscScalar *x; 1721985db425SBarry Smith MatScalar *aa = a->v; 1722985db425SBarry Smith 1723985db425SBarry Smith PetscFunctionBegin; 1724985db425SBarry Smith if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1725985db425SBarry Smith 1726985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1727985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1728985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1729d0f46423SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1730985db425SBarry Smith for (i=0; i<m; i++) { 1731985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 1732985db425SBarry Smith for (j=1; j<n; j++){ 1733985db425SBarry Smith if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 1734985db425SBarry Smith } 1735985db425SBarry Smith } 1736985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1737985db425SBarry Smith PetscFunctionReturn(0); 1738985db425SBarry Smith } 1739985db425SBarry Smith 17408d0534beSBarry Smith #undef __FUNCT__ 17418d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense" 17428d0534beSBarry Smith PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col) 17438d0534beSBarry Smith { 17448d0534beSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 17458d0534beSBarry Smith PetscErrorCode ierr; 17468d0534beSBarry Smith PetscScalar *x; 17478d0534beSBarry Smith 17488d0534beSBarry Smith PetscFunctionBegin; 17498d0534beSBarry Smith if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 17508d0534beSBarry Smith 17518d0534beSBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1752d0f46423SBarry Smith ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 17538d0534beSBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 17548d0534beSBarry Smith PetscFunctionReturn(0); 17558d0534beSBarry Smith } 17568d0534beSBarry Smith 1757289bc588SBarry Smith /* -------------------------------------------------------------------*/ 1758a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = {MatSetValues_SeqDense, 1759905e6a2fSBarry Smith MatGetRow_SeqDense, 1760905e6a2fSBarry Smith MatRestoreRow_SeqDense, 1761905e6a2fSBarry Smith MatMult_SeqDense, 176297304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense, 17637c922b88SBarry Smith MatMultTranspose_SeqDense, 17647c922b88SBarry Smith MatMultTransposeAdd_SeqDense, 1765db4efbfdSBarry Smith 0, 1766db4efbfdSBarry Smith 0, 1767db4efbfdSBarry Smith 0, 1768db4efbfdSBarry Smith /*10*/ 0, 1769905e6a2fSBarry Smith MatLUFactor_SeqDense, 1770905e6a2fSBarry Smith MatCholeskyFactor_SeqDense, 1771ec8511deSBarry Smith MatRelax_SeqDense, 1772ec8511deSBarry Smith MatTranspose_SeqDense, 177397304618SKris Buschelman /*15*/ MatGetInfo_SeqDense, 1774905e6a2fSBarry Smith MatEqual_SeqDense, 1775905e6a2fSBarry Smith MatGetDiagonal_SeqDense, 1776905e6a2fSBarry Smith MatDiagonalScale_SeqDense, 1777905e6a2fSBarry Smith MatNorm_SeqDense, 1778c0aa2d19SHong Zhang /*20*/ MatAssemblyBegin_SeqDense, 1779c0aa2d19SHong Zhang MatAssemblyEnd_SeqDense, 1780905e6a2fSBarry Smith 0, 1781905e6a2fSBarry Smith MatSetOption_SeqDense, 1782905e6a2fSBarry Smith MatZeroEntries_SeqDense, 178397304618SKris Buschelman /*25*/ MatZeroRows_SeqDense, 1784db4efbfdSBarry Smith 0, 1785db4efbfdSBarry Smith 0, 1786db4efbfdSBarry Smith 0, 1787db4efbfdSBarry Smith 0, 178897304618SKris Buschelman /*30*/ MatSetUpPreallocation_SeqDense, 1789273d9f13SBarry Smith 0, 1790905e6a2fSBarry Smith 0, 1791905e6a2fSBarry Smith MatGetArray_SeqDense, 1792905e6a2fSBarry Smith MatRestoreArray_SeqDense, 179397304618SKris Buschelman /*35*/ MatDuplicate_SeqDense, 1794a5ae1ecdSBarry Smith 0, 1795a5ae1ecdSBarry Smith 0, 1796a5ae1ecdSBarry Smith 0, 1797a5ae1ecdSBarry Smith 0, 179897304618SKris Buschelman /*40*/ MatAXPY_SeqDense, 1799a5ae1ecdSBarry Smith MatGetSubMatrices_SeqDense, 1800a5ae1ecdSBarry Smith 0, 18014b0e389bSBarry Smith MatGetValues_SeqDense, 1802a5ae1ecdSBarry Smith MatCopy_SeqDense, 1803985db425SBarry Smith /*45*/ MatGetRowMax_SeqDense, 1804a5ae1ecdSBarry Smith MatScale_SeqDense, 1805a5ae1ecdSBarry Smith 0, 1806a5ae1ecdSBarry Smith 0, 1807a5ae1ecdSBarry Smith 0, 1808521d7252SBarry Smith /*50*/ 0, 1809a5ae1ecdSBarry Smith 0, 1810a5ae1ecdSBarry Smith 0, 1811a5ae1ecdSBarry Smith 0, 1812a5ae1ecdSBarry Smith 0, 181397304618SKris Buschelman /*55*/ 0, 1814a5ae1ecdSBarry Smith 0, 1815a5ae1ecdSBarry Smith 0, 1816a5ae1ecdSBarry Smith 0, 1817a5ae1ecdSBarry Smith 0, 181897304618SKris Buschelman /*60*/ 0, 1819e03a110bSBarry Smith MatDestroy_SeqDense, 1820e03a110bSBarry Smith MatView_SeqDense, 1821357abbc8SBarry Smith 0, 182297304618SKris Buschelman 0, 182397304618SKris Buschelman /*65*/ 0, 182497304618SKris Buschelman 0, 182597304618SKris Buschelman 0, 182697304618SKris Buschelman 0, 182797304618SKris Buschelman 0, 1828985db425SBarry Smith /*70*/ MatGetRowMaxAbs_SeqDense, 182997304618SKris Buschelman 0, 183097304618SKris Buschelman 0, 183197304618SKris Buschelman 0, 183297304618SKris Buschelman 0, 183397304618SKris Buschelman /*75*/ 0, 183497304618SKris Buschelman 0, 183597304618SKris Buschelman 0, 183697304618SKris Buschelman 0, 183797304618SKris Buschelman 0, 183897304618SKris Buschelman /*80*/ 0, 183997304618SKris Buschelman 0, 184097304618SKris Buschelman 0, 184197304618SKris Buschelman 0, 1842865e5f61SKris Buschelman /*84*/ MatLoad_SeqDense, 1843865e5f61SKris Buschelman 0, 18441cbb95d3SBarry Smith MatIsHermitian_SeqDense, 1845865e5f61SKris Buschelman 0, 1846865e5f61SKris Buschelman 0, 1847865e5f61SKris Buschelman 0, 1848a9fe9ddaSSatish Balay /*90*/ MatMatMult_SeqDense_SeqDense, 1849a9fe9ddaSSatish Balay MatMatMultSymbolic_SeqDense_SeqDense, 1850a9fe9ddaSSatish Balay MatMatMultNumeric_SeqDense_SeqDense, 1851865e5f61SKris Buschelman 0, 1852865e5f61SKris Buschelman 0, 1853865e5f61SKris Buschelman /*95*/ 0, 1854a9fe9ddaSSatish Balay MatMatMultTranspose_SeqDense_SeqDense, 1855a9fe9ddaSSatish Balay MatMatMultTransposeSymbolic_SeqDense_SeqDense, 1856a9fe9ddaSSatish Balay MatMatMultTransposeNumeric_SeqDense_SeqDense, 1857284134d9SBarry Smith 0, 1858284134d9SBarry Smith /*100*/0, 1859284134d9SBarry Smith 0, 1860284134d9SBarry Smith 0, 1861284134d9SBarry Smith 0, 1862985db425SBarry Smith MatSetSizes_SeqDense, 1863985db425SBarry Smith 0, 1864985db425SBarry Smith 0, 1865985db425SBarry Smith 0, 1866985db425SBarry Smith 0, 1867985db425SBarry Smith 0, 1868985db425SBarry Smith /*110*/0, 1869985db425SBarry Smith 0, 18708d0534beSBarry Smith MatGetRowMin_SeqDense, 18718d0534beSBarry Smith MatGetColumnVector_SeqDense 1872985db425SBarry Smith }; 187390ace30eSBarry Smith 18744a2ae208SSatish Balay #undef __FUNCT__ 18754a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense" 18764b828684SBarry Smith /*@C 1877fafbff53SBarry Smith MatCreateSeqDense - Creates a sequential dense matrix that 1878d65003e9SLois Curfman McInnes is stored in column major order (the usual Fortran 77 manner). Many 1879d65003e9SLois Curfman McInnes of the matrix operations use the BLAS and LAPACK routines. 1880289bc588SBarry Smith 1881db81eaa0SLois Curfman McInnes Collective on MPI_Comm 1882db81eaa0SLois Curfman McInnes 188320563c6bSBarry Smith Input Parameters: 1884db81eaa0SLois Curfman McInnes + comm - MPI communicator, set to PETSC_COMM_SELF 18850c775827SLois Curfman McInnes . m - number of rows 188618f449edSLois Curfman McInnes . n - number of columns 1887db81eaa0SLois Curfman McInnes - data - optional location of matrix data. Set data=PETSC_NULL for PETSc 1888dfc5480cSLois Curfman McInnes to control all matrix memory allocation. 188920563c6bSBarry Smith 189020563c6bSBarry Smith Output Parameter: 189144cd7ae7SLois Curfman McInnes . A - the matrix 189220563c6bSBarry Smith 1893b259b22eSLois Curfman McInnes Notes: 189418f449edSLois Curfman McInnes The data input variable is intended primarily for Fortran programmers 189518f449edSLois Curfman McInnes who wish to allocate their own matrix memory space. Most users should 1896b4fd4287SBarry Smith set data=PETSC_NULL. 189718f449edSLois Curfman McInnes 1898027ccd11SLois Curfman McInnes Level: intermediate 1899027ccd11SLois Curfman McInnes 1900dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS 1901d65003e9SLois Curfman McInnes 1902db81eaa0SLois Curfman McInnes .seealso: MatCreate(), MatCreateMPIDense(), MatSetValues() 190320563c6bSBarry Smith @*/ 1904be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A) 1905289bc588SBarry Smith { 1906dfbe8321SBarry Smith PetscErrorCode ierr; 19073b2fbd54SBarry Smith 19083a40ed3dSBarry Smith PetscFunctionBegin; 1909f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 1910f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr); 1911273d9f13SBarry Smith ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr); 1912273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr); 1913273d9f13SBarry Smith PetscFunctionReturn(0); 1914273d9f13SBarry Smith } 1915273d9f13SBarry Smith 19164a2ae208SSatish Balay #undef __FUNCT__ 1917afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation" 1918273d9f13SBarry Smith /*@C 1919273d9f13SBarry Smith MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements 1920273d9f13SBarry Smith 1921273d9f13SBarry Smith Collective on MPI_Comm 1922273d9f13SBarry Smith 1923273d9f13SBarry Smith Input Parameters: 1924273d9f13SBarry Smith + A - the matrix 1925273d9f13SBarry Smith - data - the array (or PETSC_NULL) 1926273d9f13SBarry Smith 1927273d9f13SBarry Smith Notes: 1928273d9f13SBarry Smith The data input variable is intended primarily for Fortran programmers 1929273d9f13SBarry Smith who wish to allocate their own matrix memory space. Most users should 1930284134d9SBarry Smith need not call this routine. 1931273d9f13SBarry Smith 1932273d9f13SBarry Smith Level: intermediate 1933273d9f13SBarry Smith 1934273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS 1935273d9f13SBarry Smith 1936273d9f13SBarry Smith .seealso: MatCreate(), MatCreateMPIDense(), MatSetValues() 1937273d9f13SBarry Smith @*/ 1938be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatSeqDenseSetPreallocation(Mat B,PetscScalar data[]) 1939273d9f13SBarry Smith { 1940dfbe8321SBarry Smith PetscErrorCode ierr,(*f)(Mat,PetscScalar[]); 1941a23d5eceSKris Buschelman 1942a23d5eceSKris Buschelman PetscFunctionBegin; 1943a23d5eceSKris Buschelman ierr = PetscObjectQueryFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",(void (**)(void))&f);CHKERRQ(ierr); 1944a23d5eceSKris Buschelman if (f) { 1945a23d5eceSKris Buschelman ierr = (*f)(B,data);CHKERRQ(ierr); 1946a23d5eceSKris Buschelman } 1947a23d5eceSKris Buschelman PetscFunctionReturn(0); 1948a23d5eceSKris Buschelman } 1949a23d5eceSKris Buschelman 1950a23d5eceSKris Buschelman EXTERN_C_BEGIN 1951a23d5eceSKris Buschelman #undef __FUNCT__ 1952afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense" 1953be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data) 1954a23d5eceSKris Buschelman { 1955273d9f13SBarry Smith Mat_SeqDense *b; 1956dfbe8321SBarry Smith PetscErrorCode ierr; 1957273d9f13SBarry Smith 1958273d9f13SBarry Smith PetscFunctionBegin; 1959273d9f13SBarry Smith B->preallocated = PETSC_TRUE; 1960273d9f13SBarry Smith b = (Mat_SeqDense*)B->data; 1961d0f46423SBarry Smith if (b->lda <= 0) b->lda = B->rmap->n; 19629e8f95c4SLisandro Dalcin if (!data) { /* petsc-allocated storage */ 19639e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 19645afd5e0cSBarry Smith ierr = PetscMalloc(b->lda*b->Nmax*sizeof(PetscScalar),&b->v);CHKERRQ(ierr); 1965284134d9SBarry Smith ierr = PetscMemzero(b->v,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr); 1966284134d9SBarry Smith ierr = PetscLogObjectMemory(B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr); 19679e8f95c4SLisandro Dalcin b->user_alloc = PETSC_FALSE; 1968273d9f13SBarry Smith } else { /* user-allocated storage */ 19699e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 1970273d9f13SBarry Smith b->v = data; 1971273d9f13SBarry Smith b->user_alloc = PETSC_TRUE; 1972273d9f13SBarry Smith } 1973273d9f13SBarry Smith PetscFunctionReturn(0); 1974273d9f13SBarry Smith } 1975a23d5eceSKris Buschelman EXTERN_C_END 1976273d9f13SBarry Smith 19771b807ce4Svictorle #undef __FUNCT__ 19781b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA" 19791b807ce4Svictorle /*@C 19801b807ce4Svictorle MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array 19811b807ce4Svictorle 19821b807ce4Svictorle Input parameter: 19831b807ce4Svictorle + A - the matrix 19841b807ce4Svictorle - lda - the leading dimension 19851b807ce4Svictorle 19861b807ce4Svictorle Notes: 19871b807ce4Svictorle This routine is to be used in conjunction with MatSeqDenseSetPreallocation; 19881b807ce4Svictorle it asserts that the preallocation has a leading dimension (the LDA parameter 19891b807ce4Svictorle of Blas and Lapack fame) larger than M, the first dimension of the matrix. 19901b807ce4Svictorle 19911b807ce4Svictorle Level: intermediate 19921b807ce4Svictorle 19931b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS 19941b807ce4Svictorle 1995284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize() 19961b807ce4Svictorle @*/ 1997be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatSeqDenseSetLDA(Mat B,PetscInt lda) 19981b807ce4Svictorle { 19991b807ce4Svictorle Mat_SeqDense *b = (Mat_SeqDense*)B->data; 200021a2c019SBarry Smith 20011b807ce4Svictorle PetscFunctionBegin; 2002d0f46423SBarry Smith if (lda < B->rmap->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"LDA %D must be at least matrix dimension %D",lda,B->rmap->n); 20031b807ce4Svictorle b->lda = lda; 200421a2c019SBarry Smith b->changelda = PETSC_FALSE; 200521a2c019SBarry Smith b->Mmax = PetscMax(b->Mmax,lda); 20061b807ce4Svictorle PetscFunctionReturn(0); 20071b807ce4Svictorle } 20081b807ce4Svictorle 20090bad9183SKris Buschelman /*MC 2010fafad747SKris Buschelman MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices. 20110bad9183SKris Buschelman 20120bad9183SKris Buschelman Options Database Keys: 20130bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions() 20140bad9183SKris Buschelman 20150bad9183SKris Buschelman Level: beginner 20160bad9183SKris Buschelman 201789665df3SBarry Smith .seealso: MatCreateSeqDense() 201889665df3SBarry Smith 20190bad9183SKris Buschelman M*/ 20200bad9183SKris Buschelman 2021273d9f13SBarry Smith EXTERN_C_BEGIN 20224a2ae208SSatish Balay #undef __FUNCT__ 20234a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense" 2024be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatCreate_SeqDense(Mat B) 2025273d9f13SBarry Smith { 2026273d9f13SBarry Smith Mat_SeqDense *b; 2027dfbe8321SBarry Smith PetscErrorCode ierr; 20287c334f02SBarry Smith PetscMPIInt size; 2029273d9f13SBarry Smith 2030273d9f13SBarry Smith PetscFunctionBegin; 20317adad957SLisandro Dalcin ierr = MPI_Comm_size(((PetscObject)B)->comm,&size);CHKERRQ(ierr); 203229bbc08cSBarry Smith if (size > 1) SETERRQ(PETSC_ERR_ARG_WRONG,"Comm must be of size 1"); 203355659b69SBarry Smith 2034d0f46423SBarry Smith B->rmap->bs = B->cmap->bs = 1; 2035d0f46423SBarry Smith ierr = PetscMapSetUp(B->rmap);CHKERRQ(ierr); 2036d0f46423SBarry Smith ierr = PetscMapSetUp(B->cmap);CHKERRQ(ierr); 2037273d9f13SBarry Smith 203838f2d2fdSLisandro Dalcin ierr = PetscNewLog(B,Mat_SeqDense,&b);CHKERRQ(ierr); 2039549d3d68SSatish Balay ierr = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr); 204090f02eecSBarry Smith B->mapping = 0; 204144cd7ae7SLois Curfman McInnes B->data = (void*)b; 204218f449edSLois Curfman McInnes 2043a5ae1ecdSBarry Smith 204444cd7ae7SLois Curfman McInnes b->pivots = 0; 2045273d9f13SBarry Smith b->roworiented = PETSC_TRUE; 2046273d9f13SBarry Smith b->v = 0; 2047d0f46423SBarry Smith b->lda = B->rmap->n; 204821a2c019SBarry Smith b->changelda = PETSC_FALSE; 2049d0f46423SBarry Smith b->Mmax = B->rmap->n; 2050d0f46423SBarry Smith b->Nmax = B->cmap->n; 20514e220ebcSLois Curfman McInnes 2052b24902e0SBarry Smith 2053b24902e0SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatGetFactor_seqdense_petsc_C", 2054b24902e0SBarry Smith "MatGetFactor_seqdense_petsc", 2055b24902e0SBarry Smith MatGetFactor_seqdense_petsc);CHKERRQ(ierr); 2056a23d5eceSKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatSeqDenseSetPreallocation_C", 2057a23d5eceSKris Buschelman "MatSeqDenseSetPreallocation_SeqDense", 2058a23d5eceSKris Buschelman MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr); 20594ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMult_seqaij_seqdense_C", 20604ae313f4SHong Zhang "MatMatMult_SeqAIJ_SeqDense", 20614ae313f4SHong Zhang MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 20624ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C", 20634ae313f4SHong Zhang "MatMatMultSymbolic_SeqAIJ_SeqDense", 20644ae313f4SHong Zhang MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 20654ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C", 20664ae313f4SHong Zhang "MatMatMultNumeric_SeqAIJ_SeqDense", 20674ae313f4SHong Zhang MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 206817667f90SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr); 20693a40ed3dSBarry Smith PetscFunctionReturn(0); 2070289bc588SBarry Smith } 2071c0aa2d19SHong Zhang 2072c0aa2d19SHong Zhang 2073273d9f13SBarry Smith EXTERN_C_END 2074