xref: /petsc/src/ts/trajectory/impls/visualization/trajvisualization.c (revision 1cc06b555e92f8ec64db10330b8bbd830e5bc876)
12b043167SHong Zhang 
22b043167SHong Zhang #include <petsc/private/tsimpl.h> /*I "petscts.h"  I*/
32b043167SHong Zhang 
4d71ae5a4SJacob Faibussowitsch static PetscErrorCode OutputBIN(MPI_Comm comm, const char *filename, PetscViewer *viewer)
5d71ae5a4SJacob Faibussowitsch {
62b043167SHong Zhang   PetscFunctionBegin;
79566063dSJacob Faibussowitsch   PetscCall(PetscViewerCreate(comm, viewer));
89566063dSJacob Faibussowitsch   PetscCall(PetscViewerSetType(*viewer, PETSCVIEWERBINARY));
99566063dSJacob Faibussowitsch   PetscCall(PetscViewerFileSetMode(*viewer, FILE_MODE_WRITE));
109566063dSJacob Faibussowitsch   PetscCall(PetscViewerFileSetName(*viewer, filename));
113ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
122b043167SHong Zhang }
132b043167SHong Zhang 
14d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSTrajectorySet_Visualization(TSTrajectory tj, TS ts, PetscInt stepnum, PetscReal time, Vec X)
15d71ae5a4SJacob Faibussowitsch {
162b043167SHong Zhang   PetscViewer viewer;
172b043167SHong Zhang   char        filename[PETSC_MAX_PATH_LEN];
182b043167SHong Zhang   PetscReal   tprev;
1978fbdcc8SBarry Smith   MPI_Comm    comm;
202b043167SHong Zhang 
212b043167SHong Zhang   PetscFunctionBegin;
229566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetComm((PetscObject)ts, &comm));
232b043167SHong Zhang   if (stepnum == 0) {
242b043167SHong Zhang     PetscMPIInt rank;
259566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(comm, &rank));
26dd400576SPatrick Sanan     if (rank == 0) {
279566063dSJacob Faibussowitsch       PetscCall(PetscRMTree("Visualization-data"));
289566063dSJacob Faibussowitsch       PetscCall(PetscMkdir("Visualization-data"));
292b043167SHong Zhang     }
3078fbdcc8SBarry Smith     if (tj->names) {
3178fbdcc8SBarry Smith       PetscViewer bnames;
329566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryOpen(comm, "Visualization-data/variablenames", FILE_MODE_WRITE, &bnames));
339566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWriteStringArray(bnames, (const char *const *)tj->names));
349566063dSJacob Faibussowitsch       PetscCall(PetscViewerDestroy(&bnames));
3578fbdcc8SBarry Smith     }
3663a3b9bcSJacob Faibussowitsch     PetscCall(PetscSNPrintf(filename, sizeof(filename), "Visualization-data/SA-%06" PetscInt_FMT ".bin", stepnum));
379566063dSJacob Faibussowitsch     PetscCall(OutputBIN(comm, filename, &viewer));
3808347785SBarry Smith     if (!tj->transform) {
399566063dSJacob Faibussowitsch       PetscCall(VecView(X, viewer));
4008347785SBarry Smith     } else {
4108347785SBarry Smith       Vec XX;
429566063dSJacob Faibussowitsch       PetscCall((*tj->transform)(tj->transformctx, X, &XX));
439566063dSJacob Faibussowitsch       PetscCall(VecView(XX, viewer));
449566063dSJacob Faibussowitsch       PetscCall(VecDestroy(&XX));
4508347785SBarry Smith     }
469566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWrite(viewer, &time, 1, PETSC_REAL));
479566063dSJacob Faibussowitsch     PetscCall(PetscViewerDestroy(&viewer));
483ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
492b043167SHong Zhang   }
5063a3b9bcSJacob Faibussowitsch   PetscCall(PetscSNPrintf(filename, sizeof(filename), "Visualization-data/SA-%06" PetscInt_FMT ".bin", stepnum));
519566063dSJacob Faibussowitsch   PetscCall(OutputBIN(comm, filename, &viewer));
5208347785SBarry Smith   if (!tj->transform) {
539566063dSJacob Faibussowitsch     PetscCall(VecView(X, viewer));
5408347785SBarry Smith   } else {
5508347785SBarry Smith     Vec XX;
569566063dSJacob Faibussowitsch     PetscCall((*tj->transform)(tj->transformctx, X, &XX));
579566063dSJacob Faibussowitsch     PetscCall(VecView(XX, viewer));
589566063dSJacob Faibussowitsch     PetscCall(VecDestroy(&XX));
5908347785SBarry Smith   }
609566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryWrite(viewer, &time, 1, PETSC_REAL));
612b043167SHong Zhang 
629566063dSJacob Faibussowitsch   PetscCall(TSGetPrevTime(ts, &tprev));
639566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryWrite(viewer, &tprev, 1, PETSC_REAL));
642b043167SHong Zhang 
659566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(&viewer));
663ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
672b043167SHong Zhang }
682b043167SHong Zhang 
692b043167SHong Zhang /*MC
705c9db295SHong Zhang       TSTRAJECTORYVISUALIZATION - Stores each solution of the ODE/DAE in a file
712b043167SHong Zhang 
728e5aa403SBarry Smith       Saves each timestep into a separate file in Visualization-data/SA-%06d.bin
7378fbdcc8SBarry Smith 
7478fbdcc8SBarry Smith       This version saves only the solutions at each timestep, it does not save the solution at each stage,
75bcf0153eSBarry Smith       see `TSTRAJECTORYBASIC` that saves all stages
7678fbdcc8SBarry Smith 
77c3a89c15SBarry Smith       $PETSC_DIR/share/petsc/matlab/PetscReadBinaryTrajectory.m and $PETSC_DIR/lib/petsc/bin/PetscBinaryIOTrajectory.py
7878fbdcc8SBarry Smith       can read in files created with this format into MATLAB and Python.
7978fbdcc8SBarry Smith 
802b043167SHong Zhang   Level: intermediate
812b043167SHong Zhang 
82*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectoryCreate()`, `TS`, `TSTrajectorySetType()`, `TSTrajectoryType`, `TSTrajectorySetVariableNames()`,
83bcf0153eSBarry Smith           `TSTrajectoryType`, `TSTrajectory`
842b043167SHong Zhang M*/
85d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory tj, TS ts)
86d71ae5a4SJacob Faibussowitsch {
872b043167SHong Zhang   PetscFunctionBegin;
882b043167SHong Zhang   tj->ops->set    = TSTrajectorySet_Visualization;
891aebe4aeSStefano Zampini   tj->setupcalled = PETSC_TRUE;
903ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
912b043167SHong Zhang }
92