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