#pragma once

#include <../src/mat/impls/aij/mpi/mpiaij.h>

#define KAIJHEADER \
  PetscInt     p, q; \
  Mat          AIJ; \
  PetscScalar *S; \
  PetscScalar *T; \
  PetscScalar *ibdiag; \
  PetscBool    ibdiagvalid, getrowactive, isTI; \
  struct { \
    PetscBool    setup; \
    PetscScalar *w, *work, *t, *arr, *y; \
  } sor;

typedef struct {
  KAIJHEADER
} Mat_SeqKAIJ;

typedef struct {
  KAIJHEADER
  Mat              OAIJ;  /* sequential KAIJ matrix that corresponds to off-diagonal matrix entries (diagonal entries are stored in 'AIJ') */
  Mat              A;     /* AIJ matrix describing the blockwise action of the KAIJ matrix; compare with struct member 'AIJ' in sequential case */
  VecScatter       ctx;   /* update ghost points for parallel case */
  Vec              w;     /* work space for ghost values for parallel case */
  PetscObjectState state; /* state of the matrix A when AIJ and OIJ were last updated */
} Mat_MPIKAIJ;
