| 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
|
|
|
|
|