Actual source code: daimpl.h
1: #pragma once
3: #include <petscda.h>
4: #include <petsc/private/petscimpl.h>
5: #include <petsc/private/hashmapi.h>
7: PETSC_EXTERN PetscClassId PETSCDA_CLASSID;
9: typedef struct _PetscDAOps *PetscDAOps;
10: struct _PetscDAOps {
11: PetscErrorCode (*destroy)(PetscDA);
12: PetscErrorCode (*setup)(PetscDA);
13: PetscErrorCode (*view)(PetscDA, PetscViewer);
14: PetscErrorCode (*setfromoptions)(PetscDA, PetscOptionItems *);
15: };
17: struct _p_PetscDA {
18: PETSCHEADER(struct _PetscDAOps);
19: PetscInt obs_size; /* Observation vector dimension (p) */
20: PetscInt local_obs_size; /* Local observation vector dimension */
21: PetscInt state_size; /* State vector dimension (n) */
22: PetscInt local_state_size; /* Local state vector dimension */
23: Vec obs_error_var; /* Observation error variance (diagonal of R), length p */
24: Mat R; /* Observation error covariance matrix (p x p) */
25: PetscInt ndof; /* Number of degrees of freedom per grid point; must be the same for all grid points */
26: void *data;
27: };
29: /* data common to all the ensemble based PetscDAType */
30: typedef struct {
31: PetscErrorCode (*analysis)(PetscDA, Vec, Mat);
32: PetscErrorCode (*forecast)(PetscDA, PetscErrorCode (*)(Vec, Vec, PetscCtx), PetscCtx);
33: PetscInt size; /* Number of ensemble members (m) */
34: Mat ensemble; /* Ensemble matrix (n x m) */
35: PetscReal inflation; /* Inflation factor */
37: /* Algorithm state */
38: PetscBool assembled; /* Is the PetscDA object assembled/ready */
40: /* T-matrix factorization data (shared across implementations) */
41: PetscDASqrtType sqrt_type; /* Square root factorization type */
42: Mat V; /* Eigen vectors (LAPACK column-major storage) */
43: Mat L_cholesky; /* Lower triangular Cholesky factor */
44: Vec sqrt_eigen_vals; /* Square root of eigen values */
45: Mat I_StS; /* T = I + S^T * S matrix */
46: } PetscDA_Ensemble;
48: /* Internal utility functions shared across PetscDA implementations */
49: PETSC_INTERN PetscErrorCode PetscDASymmetricEigenSqrt_Private(Mat, Mat *);