| Line 53... |
Line 53... |
PetscErrorCode ierr;
|
PetscErrorCode ierr;
|
|
|
PetscFunctionBegin;
|
PetscFunctionBegin;
|
PetscValidPointer(A,1);
|
PetscValidPointer(A,1);
|
*A = PETSC_NULL;
|
*A = PETSC_NULL;
|
ierr = PetscHeaderCreate(B,_p_MatDense,struct _MatDenseOps,MATDENSE_CLASSID,0,"MatDense","Dense Matrix","MatDense",PETSC_COMM_SELF,MatDenseDestroy,MatDenseView);CHKERRQ(ierr);
|
ierr = PetscHeaderCreate(B,_p_MatDense,struct _MatDenseOps,MATDENSE_CLASSID,0,"MatDense","Dense Matrix","MatDense",comm,MatDenseDestroy,MatDenseView);CHKERRQ(ierr);
|
*A = B;
|
*A = B;
|
B->data = PETSC_NULL;
|
B->data = PETSC_NULL;
|
B->ld = 0;
|
B->ld = 0;
|
B->Nmax = B->Nmax = 0;
|
B->Mmax = B->Nmax = 0;
|
B->m0 = B->n0 = B->m = B->n = 0;
|
B->m0 = B->n0 = B->m = B->n = 0;
|
B->is_allocated = PETSC_FALSE;
|
B->is_allocated = PETSC_FALSE;
|
B->is_hermitian = B->is_triangular = B->is_impl = PETSC_FALSE;
|
B->is_hermitian = B->is_triangular = B->is_impl = PETSC_FALSE;
|
B->matmult_buffersize = 0;
|
B->matmult_buffersize = 0;
|
|
B->use_impl = PETSC_TRUE;
|
|
B->use_mpi_queue = PETSC_FALSE;
|
|
B->n_getarray = 0;
|
|
B->is_pending = PETSC_FALSE;
|
PetscFunctionReturn(0);
|
PetscFunctionReturn(0);
|
}
|
}
|
|
|
#undef __FUNCT__
|
#undef __FUNCT__
|
#define __FUNCT__ "MatDenseSetMaxSizes"
|
#define __FUNCT__ "MatDenseSetMaxSizes"
|
| Line 117... |
Line 121... |
PetscValidHeaderSpecific(A,MATDENSE_CLASSID,1);
|
PetscValidHeaderSpecific(A,MATDENSE_CLASSID,1);
|
if (m0 < 0 || m0 > A->Mmax) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,"Local column size %D invalid or larger than maximum column size %D",m0,A->Mmax);
|
if (m0 < 0 || m0 > A->Mmax) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,"Local column size %D invalid or larger than maximum column size %D",m0,A->Mmax);
|
if (n0 < 0 || n0 > A->Nmax) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,"Local row size %D invalid or larger than maximum row size %D",n0,A->Nmax);
|
if (n0 < 0 || n0 > A->Nmax) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,"Local row size %D invalid or larger than maximum row size %D",n0,A->Nmax);
|
if (m < 0 || m0+m > A->Mmax) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,"Local column size %D invalid or larger than maximum column size %D",m0+m,A->Mmax);
|
if (m < 0 || m0+m > A->Mmax) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,"Local column size %D invalid or larger than maximum column size %D",m0+m,A->Mmax);
|
if (n < 0 || n0+n > A->Nmax) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,"Local row size %D invalid or larger than maximum row size %D",n0+n,A->Nmax);
|
if (n < 0 || n0+n > A->Nmax) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,"Local row size %D invalid or larger than maximum row size %D",n0+n,A->Nmax);
|
|
if (A->n_getarray > 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"The sizes cannot be changed when a MatDenseRestore* call is pending");
|
if (A->ops->setsizes) {
|
if (A->ops->setsizes) {
|
ierr = (*A->ops->setsizes)(A,m0,n0,m,n);CHKERRQ(ierr);
|
ierr = (*A->ops->setsizes)(A,m0,n0,m,n);CHKERRQ(ierr);
|
}
|
}
|
A->m = m;
|
A->m = m;
|
A->n = n;
|
A->n = n;
|
| Line 153... |
Line 158... |
@*/
|
@*/
|
PetscErrorCode MatDenseGetSizes(MatDense mat,PetscInt *m0,PetscInt *n0,PetscInt *m,PetscInt* n)
|
PetscErrorCode MatDenseGetSizes(MatDense mat,PetscInt *m0,PetscInt *n0,PetscInt *m,PetscInt* n)
|
{
|
{
|
PetscFunctionBegin;
|
PetscFunctionBegin;
|
PetscValidHeaderSpecific(mat,MATDENSE_CLASSID,1);
|
PetscValidHeaderSpecific(mat,MATDENSE_CLASSID,1);
|
if (m0) *m = mat->m0;
|
if (m0) *m0 = mat->m0;
|
if (n0) *n = mat->n0;
|
if (n0) *n0 = mat->n0;
|
if (m) *m = mat->m;
|
if (m) *m = mat->m;
|
if (n) *n = mat->n;
|
if (n) *n = mat->n;
|
PetscFunctionReturn(0);
|
PetscFunctionReturn(0);
|
}
|
}
|
|
|
| Line 183... |
Line 188... |
PetscFunctionBegin;
|
PetscFunctionBegin;
|
if (!*A) PetscFunctionReturn(0);
|
if (!*A) PetscFunctionReturn(0);
|
PetscValidHeaderSpecific(*A,MATDENSE_CLASSID,1);
|
PetscValidHeaderSpecific(*A,MATDENSE_CLASSID,1);
|
if (--((PetscObject)(*A))->refct > 0) {*A = PETSC_NULL; PetscFunctionReturn(0);}
|
if (--((PetscObject)(*A))->refct > 0) {*A = PETSC_NULL; PetscFunctionReturn(0);}
|
|
|
|
ierr = PetscCheckMatDenseForRead(*A);CHKERRQ(ierr);
|
if ((*A)->ops->destroy) {
|
if ((*A)->ops->destroy) {
|
ierr = (*(*A)->ops->destroy)(*A);CHKERRQ(ierr);
|
ierr = (*(*A)->ops->destroy)(*A);CHKERRQ(ierr);
|
}
|
}
|
|
|
ierr = PetscHeaderDestroy(A);CHKERRQ(ierr);
|
ierr = PetscHeaderDestroy(A);CHKERRQ(ierr);
|
| Line 222... |
Line 228... |
PetscFunctionBegin;
|
PetscFunctionBegin;
|
PetscValidHeaderSpecific(A,MATDENSE_CLASSID,1);
|
PetscValidHeaderSpecific(A,MATDENSE_CLASSID,1);
|
PetscValidType(A,1);
|
PetscValidType(A,1);
|
PetscValidPointer(v,2);
|
PetscValidPointer(v,2);
|
if (!A->ops->getarray) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"MatDense type %s",((PetscObject)A)->type_name);
|
if (!A->ops->getarray) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"MatDense type %s",((PetscObject)A)->type_name);
|
PetscCheckMatDenseForUpdate(A);
|
ierr = PetscCheckMatDenseForUpdate(A);CHKERRQ(ierr);
|
ierr = (*A->ops->getarray)(A,v);CHKERRQ(ierr);
|
ierr = (*A->ops->getarray)(A,v);CHKERRQ(ierr);
|
|
A->n_getarray++;
|
CHKMEMQ;
|
CHKMEMQ;
|
PetscFunctionReturn(0);
|
PetscFunctionReturn(0);
|
}
|
}
|
|
|
#undef __FUNCT__
|
#undef __FUNCT__
|
| Line 254... |
Line 261... |
PetscValidType(A,1);
|
PetscValidType(A,1);
|
PetscValidPointer(v,2);
|
PetscValidPointer(v,2);
|
#if defined(PETSC_USE_DEBUG)
|
#if defined(PETSC_USE_DEBUG)
|
CHKMEMQ;
|
CHKMEMQ;
|
#endif
|
#endif
|
|
A->n_getarray--;
|
if (!A->ops->restorearray) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"MatDense type %s",((PetscObject)A)->type_name);
|
if (!A->ops->restorearray) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"MatDense type %s",((PetscObject)A)->type_name);
|
ierr = (*A->ops->restorearray)(A,v);CHKERRQ(ierr);
|
ierr = (*A->ops->restorearray)(A,v);CHKERRQ(ierr);
|
ierr = PetscObjectStateIncrease((PetscObject)A);CHKERRQ(ierr);
|
ierr = PetscObjectStateIncrease((PetscObject)A);CHKERRQ(ierr);
|
PetscFunctionReturn(0);
|
PetscFunctionReturn(0);
|
}
|
}
|
| Line 294... |
Line 302... |
PetscFunctionBegin;
|
PetscFunctionBegin;
|
PetscValidHeaderSpecific(A,MATDENSE_CLASSID,1);
|
PetscValidHeaderSpecific(A,MATDENSE_CLASSID,1);
|
PetscValidType(A,1);
|
PetscValidType(A,1);
|
PetscValidPointer(v,2);
|
PetscValidPointer(v,2);
|
if (!A->ops->getarrayread) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"MatDense type %s",((PetscObject)A)->type_name);
|
if (!A->ops->getarrayread) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"MatDense type %s",((PetscObject)A)->type_name);
|
PetscCheckMatDenseForRead(A);
|
ierr = PetscCheckMatDenseForRead(A);CHKERRQ(ierr);
|
ierr = (*A->ops->getarrayread)(A,v);CHKERRQ(ierr);
|
ierr = (*A->ops->getarrayread)(A,v);CHKERRQ(ierr);
|
CHKMEMQ;
|
CHKMEMQ;
|
PetscFunctionReturn(0);
|
PetscFunctionReturn(0);
|
}
|
}
|
|
|
| Line 361... |
Line 369... |
|
|
PetscFunctionBegin;
|
PetscFunctionBegin;
|
PetscValidHeaderSpecific(A,MATDENSE_CLASSID,1);
|
PetscValidHeaderSpecific(A,MATDENSE_CLASSID,1);
|
PetscValidType(A,1);
|
PetscValidType(A,1);
|
PetscValidPointer(M,3);
|
PetscValidPointer(M,3);
|
PetscCheckMatDenseForRead(A);
|
ierr = PetscCheckMatDenseForRead(A);CHKERRQ(ierr);
|
|
|
*M = 0;
|
*M = 0;
|
if (!A->ops->duplicate) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_SUP,"Not written for this matrix type");
|
if (!A->ops->duplicate) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_SUP,"Not written for this matrix type");
|
ierr = PetscLogEventBegin(MATDENSE_Duplicate,A,0,0,0);CHKERRQ(ierr);
|
ierr = PetscLogEventBegin(MATDENSE_Duplicate,A,0,0,0);CHKERRQ(ierr);
|
ierr = (*A->ops->duplicate)(A,op,M);CHKERRQ(ierr);
|
ierr = (*A->ops->duplicate)(A,op,M);CHKERRQ(ierr);
|
| Line 376... |
Line 384... |
B->is_allocated = A->is_allocated;
|
B->is_allocated = A->is_allocated;
|
B->is_hermitian = A->is_hermitian;
|
B->is_hermitian = A->is_hermitian;
|
B->is_triangular = A->is_triangular;
|
B->is_triangular = A->is_triangular;
|
B->is_impl = A->is_impl;
|
B->is_impl = A->is_impl;
|
B->matmult_buffersize = A->matmult_buffersize;
|
B->matmult_buffersize = A->matmult_buffersize;
|
|
B->use_impl = A->use_impl;
|
|
B->use_mpi_queue = A->use_mpi_queue;
|
|
B->n_getarray = 0;
|
|
B->is_pending = PETSC_FALSE;
|
}
|
}
|
ierr = PetscObjectStateIncrease((PetscObject)B);CHKERRQ(ierr);
|
ierr = PetscObjectStateIncrease((PetscObject)B);CHKERRQ(ierr);
|
PetscFunctionReturn(0);
|
PetscFunctionReturn(0);
|
}
|
}
|
|
|
| Line 453... |
Line 465... |
PetscErrorCode MatDenseSetFromOptions(MatDense A)
|
PetscErrorCode MatDenseSetFromOptions(MatDense A)
|
{
|
{
|
PetscErrorCode ierr;
|
PetscErrorCode ierr;
|
const char *deft = MATDENSEBASIC;
|
const char *deft = MATDENSEBASIC;
|
char type[256];
|
char type[256];
|
PetscBool flg;
|
PetscBool flg,opb;
|
PetscInt opi;
|
PetscInt opi;
|
|
|
PetscFunctionBegin;
|
PetscFunctionBegin;
|
PetscValidHeaderSpecific(A,MATDENSE_CLASSID,1);
|
PetscValidHeaderSpecific(A,MATDENSE_CLASSID,1);
|
|
|
| Line 470... |
Line 482... |
}
|
}
|
ierr = PetscOptionsInt("-matdense_buffersize","buffersize(KB) for matrix-matrix multiplication","",A->matmult_buffersize/1024,&opi,&flg);CHKERRQ(ierr);
|
ierr = PetscOptionsInt("-matdense_buffersize","buffersize(KB) for matrix-matrix multiplication","",A->matmult_buffersize/1024,&opi,&flg);CHKERRQ(ierr);
|
if (flg) {
|
if (flg) {
|
A->matmult_buffersize = opi*1024;
|
A->matmult_buffersize = opi*1024;
|
}
|
}
|
|
ierr = PetscOptionsBool("-matdense_enhance_structures","Call structured functions for dense matrices","",A->use_impl,&opb,&flg);CHKERRQ(ierr);
|
|
if (flg == PETSC_TRUE) A->use_impl = opb;
|
|
ierr = PetscOptionsBool("-matdense_mpi_queue","Queue synchronous MPI calls","",A->use_mpi_queue,&opb,&flg);CHKERRQ(ierr);
|
|
if (flg == PETSC_TRUE) A->use_mpi_queue = opb;
|
|
|
if (A->ops->setfromoptions) {
|
if (A->ops->setfromoptions) {
|
ierr = (*A->ops->setfromoptions)(A);CHKERRQ(ierr);
|
ierr = (*A->ops->setfromoptions)(A);CHKERRQ(ierr);
|
}
|
}
|
|
|
| Line 559... |
Line 575... |
/* create the new data structure */
|
/* create the new data structure */
|
ierr = (*r)(mat);CHKERRQ(ierr);
|
ierr = (*r)(mat);CHKERRQ(ierr);
|
PetscFunctionReturn(0);
|
PetscFunctionReturn(0);
|
}
|
}
|
|
|
|
static PetscErrorCode MatDenseView_Default_ASCII(MatDense xin,PetscViewer viewer);
|
|
|
#undef __FUNCT__
|
#undef __FUNCT__
|
#define __FUNCT__ "MatDenseView"
|
#define __FUNCT__ "MatDenseView"
|
/*@C
|
/*@C
|
MatDenseView - Visualizes a dense matrix object.
|
MatDenseView - Visualizes a dense matrix object.
|
| Line 627... |
Line 644... |
if (!viewer) {
|
if (!viewer) {
|
ierr = PetscViewerASCIIGetStdout(((PetscObject)mat)->comm,&viewer);CHKERRQ(ierr);
|
ierr = PetscViewerASCIIGetStdout(((PetscObject)mat)->comm,&viewer);CHKERRQ(ierr);
|
}
|
}
|
PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
|
PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
|
PetscCheckSameComm(mat,1,viewer,2);
|
PetscCheckSameComm(mat,1,viewer,2);
|
if (!mat->is_allocated) SETERRQ(((PetscObject)mat)->comm,PETSC_ERR_ORDER,"Must call MatAssemblyBegin/End() before viewing matrix");
|
ierr = PetscCheckMatDenseForRead(mat);CHKERRQ(ierr);
|
|
|
ierr = PetscLogEventBegin(MATDENSE_View,mat,viewer,0,0);CHKERRQ(ierr);
|
ierr = PetscLogEventBegin(MATDENSE_View,mat,viewer,0,0);CHKERRQ(ierr);
|
ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
|
ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
|
if (iascii) {
|
if (iascii) {
|
ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
|
ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
|
| Line 644... |
Line 661... |
}
|
}
|
if (mat->ops->view) {
|
if (mat->ops->view) {
|
ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
|
ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
|
ierr = (*mat->ops->view)(mat,viewer);CHKERRQ(ierr);
|
ierr = (*mat->ops->view)(mat,viewer);CHKERRQ(ierr);
|
ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
|
ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
|
} else if (!iascii) {
|
} else if (iascii) {
|
|
ierr = MatDenseView_Default_ASCII(mat,viewer);CHKERRQ(ierr);
|
|
} else {
|
SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Viewer type %s not supported",((PetscObject)viewer)->type_name);
|
SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Viewer type %s not supported",((PetscObject)viewer)->type_name);
|
}
|
}
|
if (iascii) {
|
if (iascii) {
|
ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
|
ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
|
if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
|
if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
|
| Line 657... |
Line 676... |
}
|
}
|
ierr = PetscLogEventEnd(MATDENSE_View,mat,viewer,0,0);CHKERRQ(ierr);
|
ierr = PetscLogEventEnd(MATDENSE_View,mat,viewer,0,0);CHKERRQ(ierr);
|
PetscFunctionReturn(0);
|
PetscFunctionReturn(0);
|
}
|
}
|
|
|
|
#undef __FUNCT__
|
|
#define __FUNCT__ "MatDenseView_Default_ASCII"
|
|
static PetscErrorCode MatDenseView_Default_ASCII(MatDense xin,PetscViewer viewer)
|
|
{
|
|
PetscErrorCode ierr;
|
|
PetscInt i,j,n,m,n0,m0;
|
|
const char *name;
|
|
PetscViewerFormat format;
|
|
const PetscScalar *xv;
|
|
|
|
PetscFunctionBegin;
|
|
ierr = MatDenseGetSizes(xin,&m0,&n0,&m,&n);CHKERRQ(ierr);
|
|
ierr = MatDenseGetArrayRead(xin,&xv);CHKERRQ(ierr);
|
|
ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
|
|
if (format == PETSC_VIEWER_ASCII_MATLAB) {
|
|
ierr = PetscObjectGetName((PetscObject)xin,&name);CHKERRQ(ierr);
|
|
ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr);
|
|
for (i=m0; i<m+m0; i++) {
|
|
for (j=n0; j<n+n0; j++) {
|
|
PetscScalar v = xv[xin->ld*j+i];
|
|
#if defined(PETSC_USE_COMPLEX)
|
|
if (PetscImaginaryPart(xv[i]) > 0.0) {
|
|
ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",PetscRealPart(v),PetscImaginaryPart(v));CHKERRQ(ierr);
|
|
} else if (PetscImaginaryPart(v) < 0.0) {
|
|
ierr = PetscViewerASCIIPrintf(viewer,"%18.16e - %18.16ei ",PetscRealPart(v),-PetscImaginaryPart(v));CHKERRQ(ierr);
|
|
} else {
|
|
ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",PetscRealPart(v));CHKERRQ(ierr);
|
|
}
|
|
#else
|
|
ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double) v);CHKERRQ(ierr);
|
|
#endif
|
|
}
|
|
ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
|
|
}
|
|
ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr);
|
|
} else {
|
|
ierr = PetscObjectPrintClassNamePrefixType((PetscObject)xin,viewer,"Vector Object");CHKERRQ(ierr);
|
|
for (i=m0; i<m+m0; i++) {
|
|
ierr = PetscViewerASCIIPrintf(viewer,"Row %####d: ",i);CHKERRQ(ierr);
|
|
for (j=n0; j<n+n0; j++) {
|
|
PetscScalar v = xv[xin->ld*j+i];
|
|
#if defined(PETSC_USE_COMPLEX)
|
|
if (PetscImaginaryPart(v) > 0.0) {
|
|
ierr = PetscViewerASCIIPrintf(viewer,"%G + %G i ",PetscRealPart(v),PetscImaginaryPart(v));CHKERRQ(ierr);
|
|
} else if (PetscImaginaryPart(v) < 0.0) {
|
|
ierr = PetscViewerASCIIPrintf(viewer,"%G - %G i ",PetscRealPart(v),-PetscImaginaryPart(v));CHKERRQ(ierr);
|
|
} else {
|
|
ierr = PetscViewerASCIIPrintf(viewer,"%G ",PetscRealPart(v));CHKERRQ(ierr);
|
|
}
|
|
#else
|
|
ierr = PetscViewerASCIIPrintf(viewer,"%G ",(double) v);CHKERRQ(ierr);
|
|
#endif
|
|
}
|
|
ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
|
|
}
|
|
}
|
|
ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
|
|
ierr = MatDenseRestoreArrayRead(xin,&xv);CHKERRQ(ierr);
|
|
PetscFunctionReturn(0);
|
|
}
|
|
|
#undef __FUNCT__
|
#undef __FUNCT__
|
#define __FUNCT__ "MatDenseFinalizePackage"
|
#define __FUNCT__ "MatDenseFinalizePackage"
|
/*@C
|
/*@C
|
MatDenseFinalizePackage - This function destroys everything in the Slepc interface to the MatDense package. It is
|
MatDenseFinalizePackage - This function destroys everything in the Slepc interface to the MatDense package. It is
|