xref: /petsc/src/ts/trajectory/impls/visualization/trajvisualization.c (revision e8e8640d1cb9a3a2f50c0c0d7b26e5c4d521e2e4)
12b043167SHong Zhang #include <petsc/private/tsimpl.h> /*I "petscts.h"  I*/
22b043167SHong Zhang 
OutputBIN(MPI_Comm comm,const char * filename,PetscViewer * viewer)3d71ae5a4SJacob Faibussowitsch static PetscErrorCode OutputBIN(MPI_Comm comm, const char *filename, PetscViewer *viewer)
4d71ae5a4SJacob Faibussowitsch {
52b043167SHong Zhang   PetscFunctionBegin;
69566063dSJacob Faibussowitsch   PetscCall(PetscViewerCreate(comm, viewer));
79566063dSJacob Faibussowitsch   PetscCall(PetscViewerSetType(*viewer, PETSCVIEWERBINARY));
89566063dSJacob Faibussowitsch   PetscCall(PetscViewerFileSetMode(*viewer, FILE_MODE_WRITE));
99566063dSJacob Faibussowitsch   PetscCall(PetscViewerFileSetName(*viewer, filename));
103ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
112b043167SHong Zhang }
122b043167SHong Zhang 
TSTrajectorySet_Visualization(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X)13d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSTrajectorySet_Visualization(TSTrajectory tj, TS ts, PetscInt stepnum, PetscReal time, Vec X)
14d71ae5a4SJacob Faibussowitsch {
152b043167SHong Zhang   PetscViewer viewer;
162b043167SHong Zhang   char        filename[PETSC_MAX_PATH_LEN];
172b043167SHong Zhang   PetscReal   tprev;
1878fbdcc8SBarry Smith   MPI_Comm    comm;
192b043167SHong Zhang 
202b043167SHong Zhang   PetscFunctionBegin;
219566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetComm((PetscObject)ts, &comm));
222b043167SHong Zhang   if (stepnum == 0) {
232b043167SHong Zhang     PetscMPIInt rank;
249566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(comm, &rank));
25dd400576SPatrick Sanan     if (rank == 0) {
269566063dSJacob Faibussowitsch       PetscCall(PetscRMTree("Visualization-data"));
279566063dSJacob Faibussowitsch       PetscCall(PetscMkdir("Visualization-data"));
282b043167SHong Zhang     }
2978fbdcc8SBarry Smith     if (tj->names) {
3078fbdcc8SBarry Smith       PetscViewer bnames;
319566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryOpen(comm, "Visualization-data/variablenames", FILE_MODE_WRITE, &bnames));
329566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWriteStringArray(bnames, (const char *const *)tj->names));
339566063dSJacob Faibussowitsch       PetscCall(PetscViewerDestroy(&bnames));
3478fbdcc8SBarry Smith     }
3563a3b9bcSJacob Faibussowitsch     PetscCall(PetscSNPrintf(filename, sizeof(filename), "Visualization-data/SA-%06" PetscInt_FMT ".bin", stepnum));
369566063dSJacob Faibussowitsch     PetscCall(OutputBIN(comm, filename, &viewer));
3708347785SBarry Smith     if (!tj->transform) {
389566063dSJacob Faibussowitsch       PetscCall(VecView(X, viewer));
3908347785SBarry Smith     } else {
4008347785SBarry Smith       Vec XX;
419566063dSJacob Faibussowitsch       PetscCall((*tj->transform)(tj->transformctx, X, &XX));
429566063dSJacob Faibussowitsch       PetscCall(VecView(XX, viewer));
439566063dSJacob Faibussowitsch       PetscCall(VecDestroy(&XX));
4408347785SBarry Smith     }
459566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWrite(viewer, &time, 1, PETSC_REAL));
469566063dSJacob Faibussowitsch     PetscCall(PetscViewerDestroy(&viewer));
473ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
482b043167SHong Zhang   }
4963a3b9bcSJacob Faibussowitsch   PetscCall(PetscSNPrintf(filename, sizeof(filename), "Visualization-data/SA-%06" PetscInt_FMT ".bin", stepnum));
509566063dSJacob Faibussowitsch   PetscCall(OutputBIN(comm, filename, &viewer));
5108347785SBarry Smith   if (!tj->transform) {
529566063dSJacob Faibussowitsch     PetscCall(VecView(X, viewer));
5308347785SBarry Smith   } else {
5408347785SBarry Smith     Vec XX;
559566063dSJacob Faibussowitsch     PetscCall((*tj->transform)(tj->transformctx, X, &XX));
569566063dSJacob Faibussowitsch     PetscCall(VecView(XX, viewer));
579566063dSJacob Faibussowitsch     PetscCall(VecDestroy(&XX));
5808347785SBarry Smith   }
599566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryWrite(viewer, &time, 1, PETSC_REAL));
602b043167SHong Zhang 
619566063dSJacob Faibussowitsch   PetscCall(TSGetPrevTime(ts, &tprev));
629566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryWrite(viewer, &tprev, 1, PETSC_REAL));
632b043167SHong Zhang 
649566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(&viewer));
653ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
662b043167SHong Zhang }
672b043167SHong Zhang 
682b043167SHong Zhang /*MC
695c9db295SHong Zhang       TSTRAJECTORYVISUALIZATION - Stores each solution of the ODE/DAE in a file
702b043167SHong Zhang 
718e5aa403SBarry Smith       Saves each timestep into a separate file in Visualization-data/SA-%06d.bin
7278fbdcc8SBarry Smith 
7378fbdcc8SBarry Smith       This version saves only the solutions at each timestep, it does not save the solution at each stage,
74bcf0153eSBarry Smith       see `TSTRAJECTORYBASIC` that saves all stages
7578fbdcc8SBarry Smith 
76c3a89c15SBarry Smith       $PETSC_DIR/share/petsc/matlab/PetscReadBinaryTrajectory.m and $PETSC_DIR/lib/petsc/bin/PetscBinaryIOTrajectory.py
7778fbdcc8SBarry Smith       can read in files created with this format into MATLAB and Python.
7878fbdcc8SBarry Smith 
792b043167SHong Zhang   Level: intermediate
802b043167SHong Zhang 
81*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectoryCreate()`, `TS`, `TSTrajectorySetType()`, `TSTrajectoryType`, `TSTrajectorySetVariableNames()`,
82bcf0153eSBarry Smith           `TSTrajectoryType`, `TSTrajectory`
832b043167SHong Zhang M*/
TSTrajectoryCreate_Visualization(TSTrajectory tj,TS ts)84d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory tj, TS ts)
85d71ae5a4SJacob Faibussowitsch {
862b043167SHong Zhang   PetscFunctionBegin;
872b043167SHong Zhang   tj->ops->set    = TSTrajectorySet_Visualization;
881aebe4aeSStefano Zampini   tj->setupcalled = PETSC_TRUE;
893ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
902b043167SHong Zhang }
91