1 #pragma once 2 3 #include <petsc/private/vecimpl.h> 4 5 typedef struct { 6 PetscInt nb; /* n blocks */ 7 Vec *v; 8 IS *is; 9 PetscBool setup_called; 10 } Vec_Nest; 11 12 #if !defined(PETSC_CLANG_STATIC_ANALYZER) 13 #define VecNestCheckCompatible2(x, xarg, y, yarg) \ 14 do { \ 15 PetscValidHeaderSpecific(x, VEC_CLASSID, xarg); \ 16 PetscValidHeaderSpecific(y, VEC_CLASSID, yarg); \ 17 PetscCheckTypeName(x, VECNEST); \ 18 PetscCheckSameComm(x, xarg, y, yarg); \ 19 PetscCheckSameType(x, xarg, y, yarg); \ 20 PetscCheck(((Vec_Nest *)(x)->data)->setup_called, PetscObjectComm((PetscObject)x), PETSC_ERR_ARG_WRONG, "Nest vector argument %d not setup.", xarg); \ 21 PetscCheck(((Vec_Nest *)(y)->data)->setup_called, PetscObjectComm((PetscObject)y), PETSC_ERR_ARG_WRONG, "Nest vector argument %d not setup.", yarg); \ 22 PetscCheck(((Vec_Nest *)(x)->data)->nb == ((Vec_Nest *)(y)->data)->nb, PetscObjectComm((PetscObject)(x)), PETSC_ERR_ARG_WRONG, "Nest vector arguments %d and %d have different numbers of blocks.", xarg, yarg); \ 23 } while (0) 24 25 #define VecNestCheckCompatible3(x, xarg, y, yarg, z, zarg) \ 26 do { \ 27 PetscValidHeaderSpecific(x, VEC_CLASSID, xarg); \ 28 PetscValidHeaderSpecific(y, VEC_CLASSID, yarg); \ 29 PetscValidHeaderSpecific(z, VEC_CLASSID, zarg); \ 30 PetscCheckTypeName(x, VECNEST); \ 31 PetscCheckSameComm(x, xarg, y, yarg); \ 32 PetscCheckSameType(x, xarg, y, yarg); \ 33 PetscCheckSameComm(x, xarg, z, zarg); \ 34 PetscCheckSameType(x, xarg, z, zarg); \ 35 PetscCheck(((Vec_Nest *)(x)->data)->setup_called, PetscObjectComm((PetscObject)(x)), PETSC_ERR_ARG_WRONG, "Nest vector argument %d not setup.", xarg); \ 36 PetscCheck(((Vec_Nest *)(y)->data)->setup_called, PetscObjectComm((PetscObject)(y)), PETSC_ERR_ARG_WRONG, "Nest vector argument %d not setup.", yarg); \ 37 PetscCheck(((Vec_Nest *)(z)->data)->setup_called, PetscObjectComm((PetscObject)(z)), PETSC_ERR_ARG_WRONG, "Nest vector argument %d not setup.", zarg); \ 38 PetscCheck(((Vec_Nest *)(x)->data)->nb == ((Vec_Nest *)(y)->data)->nb, PetscObjectComm((PetscObject)(x)), PETSC_ERR_ARG_WRONG, "Nest vector arguments %d and %d have different numbers of blocks.", xarg, yarg); \ 39 PetscCheck(((Vec_Nest *)(x)->data)->nb == ((Vec_Nest *)(z)->data)->nb, PetscObjectComm((PetscObject)(x)), PETSC_ERR_ARG_WRONG, "Nest vector arguments %d and %d have different numbers of blocks.", xarg, zarg); \ 40 } while (0) 41 #else 42 template <typename Tv> 43 extern void VecNestCheckCompatible2(Tv, int, Tv, int); 44 template <typename Tv> 45 extern void VecNestCheckCompatible3(Tv, int, Tv, int, Tv, int); 46 #endif 47