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)