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