xref: /petsc/src/ts/trajectory/impls/singlefile/singlefile.c (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
1 
2 #include <petsc/private/tsimpl.h> /*I "petscts.h"  I*/
3 
4 typedef struct {
5   PetscViewer viewer;
6 } TSTrajectory_Singlefile;
7 
8 static PetscErrorCode TSTrajectorySet_Singlefile(TSTrajectory tj, TS ts, PetscInt stepnum, PetscReal time, Vec X) {
9   TSTrajectory_Singlefile *sf = (TSTrajectory_Singlefile *)tj->data;
10   const char              *filename;
11 
12   PetscFunctionBegin;
13   if (stepnum == 0) {
14     PetscCall(PetscViewerCreate(PetscObjectComm((PetscObject)X), &sf->viewer));
15     PetscCall(PetscViewerSetType(sf->viewer, PETSCVIEWERBINARY));
16     PetscCall(PetscViewerFileSetMode(sf->viewer, FILE_MODE_WRITE));
17     PetscCall(PetscObjectGetName((PetscObject)tj, &filename));
18     PetscCall(PetscViewerFileSetName(sf->viewer, filename));
19   }
20   PetscCall(VecView(X, sf->viewer));
21   PetscCall(PetscViewerBinaryWrite(sf->viewer, &time, 1, PETSC_REAL));
22   PetscFunctionReturn(0);
23 }
24 
25 static PetscErrorCode TSTrajectoryDestroy_Singlefile(TSTrajectory tj) {
26   TSTrajectory_Singlefile *sf = (TSTrajectory_Singlefile *)tj->data;
27 
28   PetscFunctionBegin;
29   PetscCall(PetscViewerDestroy(&sf->viewer));
30   PetscCall(PetscFree(sf));
31   PetscFunctionReturn(0);
32 }
33 
34 /*MC
35       TSTRAJECTORYSINGLEFILE - Stores all solutions of the ODE/ADE into a single file followed by each timestep. Does not save the intermediate stages in a multistage method
36 
37   Level: intermediate
38 
39 .seealso: `TSTrajectoryCreate()`, `TS`, `TSTrajectorySetType()`
40 
41 M*/
42 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory tj, TS ts) {
43   TSTrajectory_Singlefile *sf;
44 
45   PetscFunctionBegin;
46   PetscCall(PetscNew(&sf));
47   tj->data         = sf;
48   tj->ops->set     = TSTrajectorySet_Singlefile;
49   tj->ops->get     = NULL;
50   tj->ops->destroy = TSTrajectoryDestroy_Singlefile;
51   ts->setupcalled  = PETSC_TRUE;
52   PetscFunctionReturn(0);
53 }
54