xref: /petsc/src/ts/trajectory/impls/singlefile/singlefile.c (revision e8e8640d1cb9a3a2f50c0c0d7b26e5c4d521e2e4)
1 #include <petsc/private/tsimpl.h> /*I "petscts.h"  I*/
2 
3 typedef struct {
4   PetscViewer viewer;
5 } TSTrajectory_Singlefile;
6 
TSTrajectorySet_Singlefile(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X)7 static PetscErrorCode TSTrajectorySet_Singlefile(TSTrajectory tj, TS ts, PetscInt stepnum, PetscReal time, Vec X)
8 {
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(PETSC_SUCCESS);
23 }
24 
TSTrajectoryDestroy_Singlefile(TSTrajectory tj)25 static PetscErrorCode TSTrajectoryDestroy_Singlefile(TSTrajectory tj)
26 {
27   TSTrajectory_Singlefile *sf = (TSTrajectory_Singlefile *)tj->data;
28 
29   PetscFunctionBegin;
30   PetscCall(PetscViewerDestroy(&sf->viewer));
31   PetscCall(PetscFree(sf));
32   PetscFunctionReturn(PETSC_SUCCESS);
33 }
34 
35 /*MC
36       TSTRAJECTORYSINGLEFILE - Stores all solutions of the ODE/ADE into a single file followed by each timestep.
37       Does not save the intermediate stages in a multistage method
38 
39   Level: intermediate
40 
41 .seealso: [](ch_ts), `TSTrajectoryCreate()`, `TS`, `TSTrajectorySetType()`, `TSTrajectoryType`, `TSTrajectory`
42 M*/
TSTrajectoryCreate_Singlefile(TSTrajectory tj,TS ts)43 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory tj, TS ts)
44 {
45   TSTrajectory_Singlefile *sf;
46 
47   PetscFunctionBegin;
48   PetscCall(PetscNew(&sf));
49   tj->data         = sf;
50   tj->ops->set     = TSTrajectorySet_Singlefile;
51   tj->ops->get     = NULL;
52   tj->ops->destroy = TSTrajectoryDestroy_Singlefile;
53   ts->setupcalled  = PETSC_TRUE;
54   PetscFunctionReturn(PETSC_SUCCESS);
55 }
56