Actual source code: vecnestimpl.h

      1: #pragma once

      3: #include <petsc/private/vecimpl.h>

      5: typedef struct {
      6:   PetscInt  nb; /* n blocks */
      7:   Vec      *v;
      8:   IS       *is;
      9:   PetscBool setup_called;
     10: } Vec_Nest;

     12: #if !defined(PETSC_CLANG_STATIC_ANALYZER)
     13:   #define VecNestCheckCompatible2(x, xarg, y, yarg) \
     14:     do { \
     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)

     25:   #define VecNestCheckCompatible3(x, xarg, y, yarg, z, zarg) \
     26:     do { \
     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