xref: /petsc/src/ts/trajectory/impls/visualization/trajvisualization.c (revision 08347785e82e3cbb46d8d80d12ddee00beee7fed)
12b043167SHong Zhang 
22b043167SHong Zhang #include <petsc/private/tsimpl.h>        /*I "petscts.h"  I*/
32b043167SHong Zhang 
478fbdcc8SBarry Smith static PetscErrorCode OutputBIN(MPI_Comm comm,const char *filename,PetscViewer *viewer)
52b043167SHong Zhang {
62b043167SHong Zhang   PetscErrorCode ierr;
72b043167SHong Zhang 
82b043167SHong Zhang   PetscFunctionBegin;
92b043167SHong Zhang   ierr = PetscViewerCreate(PETSC_COMM_WORLD,viewer);CHKERRQ(ierr);
102b043167SHong Zhang   ierr = PetscViewerSetType(*viewer,PETSCVIEWERBINARY);CHKERRQ(ierr);
112b043167SHong Zhang   ierr = PetscViewerFileSetMode(*viewer,FILE_MODE_WRITE);CHKERRQ(ierr);
122b043167SHong Zhang   ierr = PetscViewerFileSetName(*viewer,filename);CHKERRQ(ierr);
132b043167SHong Zhang   PetscFunctionReturn(0);
142b043167SHong Zhang }
152b043167SHong Zhang 
16560360afSLisandro Dalcin static PetscErrorCode TSTrajectorySet_Visualization(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X)
172b043167SHong Zhang {
182b043167SHong Zhang   PetscViewer    viewer;
192b043167SHong Zhang   char           filename[PETSC_MAX_PATH_LEN];
202b043167SHong Zhang   PetscReal      tprev;
212b043167SHong Zhang   PetscErrorCode ierr;
2278fbdcc8SBarry Smith   MPI_Comm       comm;
232b043167SHong Zhang 
242b043167SHong Zhang   PetscFunctionBegin;
2578fbdcc8SBarry Smith   ierr = PetscObjectGetComm((PetscObject)ts,&comm);CHKERRQ(ierr);
262b043167SHong Zhang   ierr = TSGetTotalSteps(ts,&stepnum);CHKERRQ(ierr);
272b043167SHong Zhang   if (stepnum == 0) {
282b043167SHong Zhang     PetscMPIInt rank;
2978fbdcc8SBarry Smith     ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
302b043167SHong Zhang     if (!rank) {
312b043167SHong Zhang       ierr = PetscRMTree("Visualization-data");CHKERRQ(ierr);
322b043167SHong Zhang       ierr = PetscMkdir("Visualization-data");CHKERRQ(ierr);
332b043167SHong Zhang     }
3478fbdcc8SBarry Smith     if (tj->names) {
3578fbdcc8SBarry Smith       PetscViewer bnames;
3678fbdcc8SBarry Smith       ierr = PetscViewerBinaryOpen(comm,"Visualization-data/variablenames",FILE_MODE_WRITE,&bnames);CHKERRQ(ierr);
3778fbdcc8SBarry Smith       ierr = PetscViewerBinaryWriteStringArray(bnames,(const char *const *)tj->names);CHKERRQ(ierr);
3878fbdcc8SBarry Smith       ierr = PetscViewerDestroy(&bnames);CHKERRQ(ierr);
3978fbdcc8SBarry Smith     }
402b043167SHong Zhang     ierr = PetscSNPrintf(filename,sizeof(filename),"Visualization-data/SA-%06d.bin",stepnum);CHKERRQ(ierr);
4178fbdcc8SBarry Smith     ierr = OutputBIN(comm,filename,&viewer);CHKERRQ(ierr);
42*08347785SBarry Smith     if (!tj->transform) {
432b043167SHong Zhang       ierr = VecView(X,viewer);CHKERRQ(ierr);
44*08347785SBarry Smith     } else {
45*08347785SBarry Smith       Vec XX;
46*08347785SBarry Smith       ierr = (*tj->transform)(tj->transformctx,X,&XX);CHKERRQ(ierr);
47*08347785SBarry Smith       ierr = VecView(XX,viewer);CHKERRQ(ierr);
48*08347785SBarry Smith       ierr = VecDestroy(&XX);
49*08347785SBarry Smith     }
502b043167SHong Zhang     ierr = PetscViewerBinaryWrite(viewer,&time,1,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr);
512b043167SHong Zhang     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
522b043167SHong Zhang     PetscFunctionReturn(0);
532b043167SHong Zhang   }
542b043167SHong Zhang   ierr = PetscSNPrintf(filename,sizeof(filename),"Visualization-data/SA-%06d.bin",stepnum);CHKERRQ(ierr);
5578fbdcc8SBarry Smith   ierr = OutputBIN(comm,filename,&viewer);CHKERRQ(ierr);
56*08347785SBarry Smith   if (!tj->transform) {
572b043167SHong Zhang     ierr = VecView(X,viewer);CHKERRQ(ierr);
58*08347785SBarry Smith   } else {
59*08347785SBarry Smith     Vec XX;
60*08347785SBarry Smith     ierr = (*tj->transform)(tj->transformctx,X,&XX);CHKERRQ(ierr);
61*08347785SBarry Smith     ierr = VecView(XX,viewer);CHKERRQ(ierr);
62*08347785SBarry Smith     ierr = VecDestroy(&XX);
63*08347785SBarry Smith   }
642b043167SHong Zhang   ierr = PetscViewerBinaryWrite(viewer,&time,1,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr);
652b043167SHong Zhang 
662b043167SHong Zhang   ierr = TSGetPrevTime(ts,&tprev);CHKERRQ(ierr);
672b043167SHong Zhang   ierr = PetscViewerBinaryWrite(viewer,&tprev,1,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr);
682b043167SHong Zhang 
692b043167SHong Zhang   ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
702b043167SHong Zhang   PetscFunctionReturn(0);
712b043167SHong Zhang }
722b043167SHong Zhang 
732b043167SHong Zhang /*MC
745c9db295SHong Zhang       TSTRAJECTORYVISUALIZATION - Stores each solution of the ODE/DAE in a file
752b043167SHong Zhang 
7678fbdcc8SBarry Smith       Saves each timestep into a seperate file in Visualization-data/SA-%06d.bin
7778fbdcc8SBarry Smith 
7878fbdcc8SBarry Smith       This version saves only the solutions at each timestep, it does not save the solution at each stage,
7978fbdcc8SBarry Smith       see TSTRAJECTORYBASIC that saves all stages
8078fbdcc8SBarry Smith 
8178fbdcc8SBarry Smith       $PETSC_DIR/share/petsc/matlab/PetscReadBinaryTrajectory.m and $PETSC_DIR/bin/PetscBinaryIOTrajectory.py
8278fbdcc8SBarry Smith       can read in files created with this format into MATLAB and Python.
8378fbdcc8SBarry Smith 
842b043167SHong Zhang   Level: intermediate
852b043167SHong Zhang 
8678fbdcc8SBarry Smith .seealso:  TSTrajectoryCreate(), TS, TSTrajectorySetType(), TSTrajectoryType, TSTrajectorySetVariableNames()
872b043167SHong Zhang 
882b043167SHong Zhang M*/
892b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory tj,TS ts)
902b043167SHong Zhang {
912b043167SHong Zhang   PetscFunctionBegin;
922b043167SHong Zhang   tj->ops->set  = TSTrajectorySet_Visualization;
932b043167SHong Zhang   PetscFunctionReturn(0);
942b043167SHong Zhang }
95