Actual source code: petscda.h
1: #pragma once
3: #include <petscmat.h>
5: /* MANSEC = ML */
6: /* SUBMANSEC = PetscDA */
8: /*S
9: PetscDA - Abstract PETSc object that manages data assimilation
11: Level: beginner
13: Notes:
14: This is new code, please independently verify all results you obtain using it.
15: Planned work for `PetscDA` is tracked on GitLab as Issue #1882.
16: The only ensemble-based assimilator currently supplied is `PETSCDALETKF`.
18: .seealso: [](ch_da), `PetscDAType`, `PETSCDALETKF`, `PetscDACreate()`, `PetscDASetType()`,
19: `PetscDASetSizes()`, `PetscDAEnsembleSetSize()`, `PetscDAEnsembleAnalysis()`, `PetscDAEnsembleForecast()`,
20: `PetscDADestroy()`, `PetscDAView()`
21: S*/
22: typedef struct _p_PetscDA *PetscDA;
24: /*E
25: PetscDALETKFLocalizationType - Type of localization kernel used by `PETSCDALETKF`
27: Values:
28: + `PETSCDA_LETKF_LOC_NONE` - No localization. Each vertex sees every observation with weight one;
29: the per-vertex loop reduces to a single global analysis (the classic ETKF).
30: . `PETSCDA_LETKF_LOC_GASPARI_COHN` - Gaspari-Cohn fifth-order piecewise rational kernel with compact support at twice the radius
31: . `PETSCDA_LETKF_LOC_GAUSSIAN` - Gaussian kernel exp(-d^2 / (2 r^2)) truncated at twice the radius
32: - `PETSCDA_LETKF_LOC_BOXCAR` - Uniform weight one inside the radius, zero outside
34: Options Database Keys:
35: . -petscda_letkf_localization_type (none|gaspari_cohn|gaussian|boxcar) - select the localization kernel at run time
37: Level: intermediate
39: .seealso: [](ch_da), `PETSCDALETKF`, `PetscDALETKFSetLocalizationType()`, `PetscDALETKFGetLocalizationType()`,
40: `PetscDALETKFSetLocalizationRadius()`, `PetscDALETKFSetLocalizationCoordinates()`
41: E*/
42: typedef enum {
43: PETSCDA_LETKF_LOC_NONE,
44: PETSCDA_LETKF_LOC_GASPARI_COHN,
45: PETSCDA_LETKF_LOC_GAUSSIAN,
46: PETSCDA_LETKF_LOC_BOXCAR,
47: PETSCDA_LETKF_LOC_NUM_TYPES
48: } PetscDALETKFLocalizationType;
50: /*J
51: PetscDAType - String with the name of a PETSc data assimilation method
53: Level: beginner
55: .seealso: [](ch_da), `PetscDA`, `PetscDASetType()`, `PETSCDALETKF`
56: J*/
57: typedef const char *PetscDAType;
58: #define PETSCDALETKF "letkf"
60: PETSC_EXTERN PetscErrorCode PetscDAInitializePackage(void);
61: PETSC_EXTERN PetscErrorCode PetscDAFinalizePackage(void);
63: PETSC_EXTERN PetscErrorCode PetscDARegister(const char[], PetscErrorCode (*)(PetscDA));
64: PETSC_EXTERN PetscErrorCode PetscDARegisterAll(void);
66: PETSC_EXTERN PetscErrorCode PetscDACreate(MPI_Comm, PetscDA *);
67: PETSC_EXTERN PetscErrorCode PetscDADestroy(PetscDA *);
68: PETSC_EXTERN PetscErrorCode PetscDASetType(PetscDA, PetscDAType);
69: PETSC_EXTERN PetscErrorCode PetscDAGetType(PetscDA, PetscDAType *);
70: PETSC_EXTERN PetscErrorCode PetscDAView(PetscDA, PetscViewer);
71: PETSC_EXTERN PetscErrorCode PetscDAViewFromOptions(PetscDA, PetscObject, const char[]);
72: PETSC_EXTERN PetscErrorCode PetscDASetFromOptions(PetscDA);
74: PETSC_EXTERN PetscErrorCode PetscDASetSizes(PetscDA, PetscInt, PetscInt);
75: PETSC_EXTERN PetscErrorCode PetscDASetLocalSizes(PetscDA, PetscInt, PetscInt);
76: PETSC_EXTERN PetscErrorCode PetscDAGetSizes(PetscDA, PetscInt *, PetscInt *);
77: PETSC_EXTERN PetscErrorCode PetscDASetNDOF(PetscDA, PetscInt);
78: PETSC_EXTERN PetscErrorCode PetscDAGetNDOF(PetscDA, PetscInt *);
79: PETSC_EXTERN PetscErrorCode PetscDASetUp(PetscDA);
81: PETSC_EXTERN PetscErrorCode PetscDASetObsErrorVariance(PetscDA, Vec);
82: PETSC_EXTERN PetscErrorCode PetscDAGetObsErrorVariance(PetscDA, Vec *);
84: PETSC_EXTERN PetscErrorCode PetscDASetOptionsPrefix(PetscDA, const char[]);
85: PETSC_EXTERN PetscErrorCode PetscDAAppendOptionsPrefix(PetscDA, const char[]);
86: PETSC_EXTERN PetscErrorCode PetscDAGetOptionsPrefix(PetscDA, const char *[]);
88: PETSC_EXTERN PetscErrorCode PetscDAEnsembleSetSize(PetscDA, PetscInt);
89: PETSC_EXTERN PetscErrorCode PetscDAEnsembleGetSize(PetscDA, PetscInt *);
90: PETSC_EXTERN PetscErrorCode PetscDAEnsembleSetInflation(PetscDA, PetscReal);
91: PETSC_EXTERN PetscErrorCode PetscDAEnsembleGetInflation(PetscDA, PetscReal *);
93: PETSC_EXTERN PetscErrorCode PetscDAEnsembleGetMember(PetscDA, PetscInt, Vec *);
94: PETSC_EXTERN PetscErrorCode PetscDAEnsembleRestoreMember(PetscDA, PetscInt, Vec *);
95: PETSC_EXTERN PetscErrorCode PetscDAEnsembleSetMember(PetscDA, PetscInt, Vec);
97: PETSC_EXTERN PetscErrorCode PetscDAEnsembleComputeMean(PetscDA, Vec);
98: PETSC_EXTERN PetscErrorCode PetscDAEnsembleComputeAnomalies(PetscDA, Vec, Mat *);
99: PETSC_EXTERN PetscErrorCode PetscDAEnsembleAnalysis(PetscDA, Vec, Mat);
101: /*S
102: PetscDAEnsembleForecastFn - A prototype of an ensemble forecast model callback passed to `PetscDAEnsembleForecast()`
104: Calling Sequence:
105: + ensemble - ensemble matrix advanced in place; on entry its columns are the current members, on
106: return its columns are the members at the next time
107: - ctx - [optional] user-defined model context
109: Level: intermediate
111: Note:
112: Per-member integrators that read and overwrite each column (the common case, e.g. a `TS`-driven step)
113: iterate with `MatDenseGetColumnVec()` / `MatDenseRestoreColumnVec()`. Use the read-only or write-only
114: variants (`MatDenseGetColumnVecRead()` / `MatDenseGetColumnVecWrite()`) only when the kernel truly
115: does not need the other half (e.g. a write-only resampler).
117: .seealso: [](ch_da), `PetscDA`, `PETSCDALETKF`, `PetscDAEnsembleForecast()`
118: S*/
119: PETSC_EXTERN_TYPEDEF typedef PetscErrorCode PetscDAEnsembleForecastFn(Mat ensemble, PetscCtx ctx);
121: PETSC_EXTERN PetscErrorCode PetscDAEnsembleForecast(PetscDA, PetscDAEnsembleForecastFn *, PetscCtx);
122: PETSC_EXTERN PetscErrorCode PetscDAEnsembleInitialize(PetscDA, Vec, PetscReal, PetscRandom);
124: PETSC_EXTERN PetscErrorCode PetscDAEnsembleComputeNormalizedInnovationMatrix(Mat, Vec, Vec, PetscInt, PetscScalar, Mat);
125: PETSC_EXTERN PetscErrorCode PetscDAEnsembleTFactor(PetscDA, Mat);
126: PETSC_EXTERN PetscErrorCode PetscDAEnsembleApplyTInverse(PetscDA, Vec, Vec);
127: PETSC_EXTERN PetscErrorCode PetscDAEnsembleApplySqrtTInverse(PetscDA, Mat, Mat);
129: PETSC_EXTERN PetscErrorCode PetscDALETKFSetLocalizationRadius(PetscDA, PetscReal);
130: PETSC_EXTERN PetscErrorCode PetscDALETKFGetLocalizationRadius(PetscDA, PetscReal *);
131: PETSC_EXTERN PetscErrorCode PetscDALETKFSetLocalizationType(PetscDA, PetscDALETKFLocalizationType);
132: PETSC_EXTERN PetscErrorCode PetscDALETKFGetLocalizationType(PetscDA, PetscDALETKFLocalizationType *);
133: PETSC_EXTERN PetscErrorCode PetscDALETKFSetLocalizationCoordinates(PetscDA, const Vec[3], const PetscReal[3], Mat);
134: PETSC_EXTERN PetscErrorCode PetscDALETKFResetLocalization(PetscDA);