Actual source code: matnestimpl.h

  1: #pragma once

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

  5: struct MatNestISPair {
  6:   IS *row, *col;
  7: };

  9: typedef struct {
 10:   PetscInt             nr, nc; /* nr x nc blocks */
 11:   Mat                **m;
 12:   struct MatNestISPair isglobal;
 13:   struct MatNestISPair islocal;
 14:   Vec                 *left, *right;
 15:   PetscInt            *row_len, *col_len;
 16:   PetscObjectState    *nnzstate;
 17:   PetscBool            splitassembly;
 18: } Mat_Nest;

 20: /* context for multi-shift matrices created via MatCreateNestFromMultipleShifts() */
 21: struct _n_Mat_MultiShift {
 22:   Mat          K;
 23:   Mat          M;
 24:   PetscInt     nshift;
 25:   PetscScalar *sigma;
 26:   PetscBool   *cmplx;
 27:   MatStructure str;
 28:   MatState     state;
 29: };
 30: typedef struct _n_Mat_MultiShift *Mat_MultiShift;

 32: PETSC_SINGLE_LIBRARY_INTERN PetscErrorCode MatMultiShiftBuildShiftedMatrix_Internal(Mat, PetscScalar, Mat, MatStructure, PetscBool, Mat *);

 34: /*
 35:   MatCheckMultiShift - Check that a given Mat was created via MatCreateNestFromMultipleShifts()
 36:   and return its multi-shift context in ctx.
 37: */
 38: #define MatCheckMultiShift(A, ctx) \
 39:   do { \
 40:     PetscContainer mscontainer; \
 41:     PetscBool      mssame; \
 42:     PetscCall(PetscObjectQuery((PetscObject)(A), "MatMultiShift", (PetscObject *)&mscontainer)); \
 43:     PetscCheck(mscontainer, PetscObjectComm((PetscObject)(A)), PETSC_ERR_ARG_WRONG, "The Mat is not a multi-shift matrix"); \
 44:     PetscCall(PetscContainerGetPointer(mscontainer, (void **)(ctx))); \
 45:     PetscCall(MatStateCompareUpdate((A), &(*(ctx))->state, &mssame)); \
 46:     PetscCheck(mssame, PetscObjectComm((PetscObject)(A)), PETSC_ERR_ARG_WRONGSTATE, "The multi-shift Mat has been modified after creation"); \
 47:   } while (0)