Subversion Repositories slepc-dev

Rev

Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2560 Rev 2852
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