Subversion Repositories slepc-dev

Rev

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

Rev 2517 Rev 2518
Line 81... Line 81...
   Level: development
   Level: development
 
 
M*/
M*/
#define PetscObjectQueryPolymorphicFunction(A,B,F,N,R,E) { \
#define PetscObjectQueryPolymorphicFunction(A,B,F,N,R,E) { \
  if ((A)->ops->(F) == (B)->ops->(F)) { \
  if ((A)->ops->(F) == (B)->ops->(F)) { \
    if (!(A)->ops->(F)) SETERRQ1(((PetscObject)(A))->comm,PETSC_ERR_SUP,(N) " not supported type %s",((PetscObject)(A))->type_name); \
    if (!(A)->ops->(F)) SETERRQ1(((PetscObject)(A))->comm,PETSC_ERR_SUP,N " not supported type %s",((PetscObject)(A))->type_name); \
    *(R) = (A)->ops->(F); \
    *(R) = (A)->ops->(F); \
  } else {  \
  } else {  \
    /* dispatch based on the type of A and B */ \
    /* dispatch based on the type of A and B */ \
    char name[256]; \
    char           name[256]; \
 
    PetscInt       i; \
    PetscErrorCode ierr; \
    PetscErrorCode ierr; \
    for (i=0, *(R)=PETSC_NULL; !*(R) && i<3; i++) { \
    for (i=0, *(R)=PETSC_NULL; !*(R) && i<3; i++) { \
      ierr = PetscStrcpy(name,(N) "_");CHKERRQ(ierr); \
      ierr = PetscStrcpy(name,N "_");CHKERRQ(ierr); \
      if (!(i & 1)) { ierr = PetscStrcat(name,((PetscObject)(A))->type_name);CHKERRQ(ierr); } \
      if (!(i & 1)) { ierr = PetscStrcat(name,((PetscObject)(A))->type_name);CHKERRQ(ierr); } \
      else { ierr = PetscStrcat(name,"*");CHKERRQ(ierr); } \
      else { ierr = PetscStrcat(name,"*");CHKERRQ(ierr); } \
      ierr = PetscStrcat(name,"_");CHKERRQ(ierr); \
      ierr = PetscStrcat(name,"_");CHKERRQ(ierr); \
      if (!(i & 2)) { ierr = PetscStrcat(name,((PetscObject)(B))->type_name);CHKERRQ(ierr); } \
      if (!(i & 2)) { ierr = PetscStrcat(name,((PetscObject)(B))->type_name);CHKERRQ(ierr); } \
      else { ierr = PetscStrcat(name,"*");CHKERRQ(ierr); } \
      else { ierr = PetscStrcat(name,"*");CHKERRQ(ierr); } \
Line 100... Line 101...
      ierr = PetscObjectQueryFunction((PetscObject)(A),name,(void (**)(void))(R));CHKERRQ(ierr); \
      ierr = PetscObjectQueryFunction((PetscObject)(A),name,(void (**)(void))(R));CHKERRQ(ierr); \
      if (!*(R)) { \
      if (!*(R)) { \
        ierr = PetscObjectQueryFunction((PetscObject)(B),name,(void (**)(void))(R));CHKERRQ(ierr); \
        ierr = PetscObjectQueryFunction((PetscObject)(B),name,(void (**)(void))(R));CHKERRQ(ierr); \
      } \
      } \
    } \
    } \
    if (!*(R) && (E) == PETSC_TRUE) SETERRQ2(((PetscObject)(A))->comm,PETSC_ERR_ARG_INCOMP,(N) " requires compatible matrices, instead of %s and %s",((PetscObject)(A))->type_name,((PetscObject)(B))->type_name); \
    if (!*(R) && (E) == PETSC_TRUE) SETERRQ2(((PetscObject)(A))->comm,PETSC_ERR_ARG_INCOMP,N " requires compatible matrices, instead of %s and %s",((PetscObject)(A))->type_name,((PetscObject)(B))->type_name); \
  } \
  } \
}
}
 
 
#define PetscCheckMatDenseForRead(A) \
#define PetscCheckMatDenseForRead(A) \
  if (!((A)->is_allocated == PETSC_TRUE)) SETERRQ(((PetscObject)(A))->comm,PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
  if (!((A)->is_allocated == PETSC_TRUE)) SETERRQ(((PetscObject)(A))->comm,PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
 
 
#define PetscCheckMatDenseForWrite(A) \
#define PetscCheckMatDenseForWrite(A) \
  ierr = MatDenseSetupPreallocation((A));CHKERRQ(ierr); \
  ierr = MatDenseSetUpPreallocation((A));CHKERRQ(ierr); \
  if (!((A)->is_allocated == PETSC_TRUE)) SETERRQ(((PetscObject)(A))->comm,PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
  if (!((A)->is_allocated == PETSC_TRUE)) SETERRQ(((PetscObject)(A))->comm,PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
 
 
#define PetscCheckMatDenseForUpdate(A) PetscCheckMatDenseForRead(A)
#define PetscCheckMatDenseForUpdate(A) PetscCheckMatDenseForRead(A)
 
 
#define MatDenseIsHermitian(A) (A->is_hermitian == PETSC_TRUE)
#define MatDenseIsHermitian(A) (A->is_hermitian == PETSC_TRUE)
Line 121... Line 122...
#define MatDenseIsImplicitHermitian(A) (MatDenseIsHermitian(A) && MatDenseIsImplicit(A))
#define MatDenseIsImplicitHermitian(A) (MatDenseIsHermitian(A) && MatDenseIsImplicit(A))
#define MatDenseIsExplicitHermitian(A) (MatDenseIsHermitian(A) && !MatDenseIsImplicit(A))
#define MatDenseIsExplicitHermitian(A) (MatDenseIsHermitian(A) && !MatDenseIsImplicit(A))
#define MatDenseIsImplicitTriangular(A) (MatDenseIsTriangular(A) && MatDenseIsImplicit(A))
#define MatDenseIsImplicitTriangular(A) (MatDenseIsTriangular(A) && MatDenseIsImplicit(A))
#define MatDenseIsExplicitTriangular(A) (MatDenseIsTriangular(A) && !MatDenseIsImplicit(A))
#define MatDenseIsExplicitTriangular(A) (MatDenseIsTriangular(A) && !MatDenseIsImplicit(A))
#define MatDenseIsSimple(A) (!MatDenseIsHermitian(A) && !MatDenseIsTriangular(A))
#define MatDenseIsSimple(A) (!MatDenseIsHermitian(A) && !MatDenseIsTriangular(A))
 
 
 
PetscErrorCode MatDenseRegisterAll(const char *path);
 
extern PetscLogEvent    MATDENSE_Duplicate,MATDENSE_SetUpPreallocation,MATDENSE_MatMatMult,MATDENSE_Copy,MATDENSE_AXPY;
#endif
#endif