xref: /petsc/src/ts/trajectory/impls/visualization/trajvisualization.c (revision c3a89c15c66be42c1ea3c2eab6faebba95f76ffa)
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   if (stepnum == 0) {
272b043167SHong Zhang     PetscMPIInt rank;
2878fbdcc8SBarry Smith     ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
292b043167SHong Zhang     if (!rank) {
302b043167SHong Zhang       ierr = PetscRMTree("Visualization-data");CHKERRQ(ierr);
312b043167SHong Zhang       ierr = PetscMkdir("Visualization-data");CHKERRQ(ierr);
322b043167SHong Zhang     }
3378fbdcc8SBarry Smith     if (tj->names) {
3478fbdcc8SBarry Smith       PetscViewer bnames;
3578fbdcc8SBarry Smith       ierr = PetscViewerBinaryOpen(comm,"Visualization-data/variablenames",FILE_MODE_WRITE,&bnames);CHKERRQ(ierr);
3678fbdcc8SBarry Smith       ierr = PetscViewerBinaryWriteStringArray(bnames,(const char *const *)tj->names);CHKERRQ(ierr);
3778fbdcc8SBarry Smith       ierr = PetscViewerDestroy(&bnames);CHKERRQ(ierr);
3878fbdcc8SBarry Smith     }
392b043167SHong Zhang     ierr = PetscSNPrintf(filename,sizeof(filename),"Visualization-data/SA-%06d.bin",stepnum);CHKERRQ(ierr);
4078fbdcc8SBarry Smith     ierr = OutputBIN(comm,filename,&viewer);CHKERRQ(ierr);
4108347785SBarry Smith     if (!tj->transform) {
422b043167SHong Zhang       ierr = VecView(X,viewer);CHKERRQ(ierr);
4308347785SBarry Smith     } else {
4408347785SBarry Smith       Vec XX;
4508347785SBarry Smith       ierr = (*tj->transform)(tj->transformctx,X,&XX);CHKERRQ(ierr);
4608347785SBarry Smith       ierr = VecView(XX,viewer);CHKERRQ(ierr);
477f79407eSBarry Smith       ierr = VecDestroy(&XX);CHKERRQ(ierr);
4808347785SBarry Smith     }
492b043167SHong Zhang     ierr = PetscViewerBinaryWrite(viewer,&time,1,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr);
502b043167SHong Zhang     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
512b043167SHong Zhang     PetscFunctionReturn(0);
522b043167SHong Zhang   }
532b043167SHong Zhang   ierr = PetscSNPrintf(filename,sizeof(filename),"Visualization-data/SA-%06d.bin",stepnum);CHKERRQ(ierr);
5478fbdcc8SBarry Smith   ierr = OutputBIN(comm,filename,&viewer);CHKERRQ(ierr);
5508347785SBarry Smith   if (!tj->transform) {
562b043167SHong Zhang     ierr = VecView(X,viewer);CHKERRQ(ierr);
5708347785SBarry Smith   } else {
5808347785SBarry Smith     Vec XX;
5908347785SBarry Smith     ierr = (*tj->transform)(tj->transformctx,X,&XX);CHKERRQ(ierr);
6008347785SBarry Smith     ierr = VecView(XX,viewer);CHKERRQ(ierr);
617f79407eSBarry Smith     ierr = VecDestroy(&XX);CHKERRQ(ierr);
6208347785SBarry Smith   }
632b043167SHong Zhang   ierr = PetscViewerBinaryWrite(viewer,&time,1,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr);
642b043167SHong Zhang 
652b043167SHong Zhang   ierr = TSGetPrevTime(ts,&tprev);CHKERRQ(ierr);
662b043167SHong Zhang   ierr = PetscViewerBinaryWrite(viewer,&tprev,1,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr);
672b043167SHong Zhang 
682b043167SHong Zhang   ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
692b043167SHong Zhang   PetscFunctionReturn(0);
702b043167SHong Zhang }
712b043167SHong Zhang 
722b043167SHong Zhang /*MC
735c9db295SHong Zhang       TSTRAJECTORYVISUALIZATION - Stores each solution of the ODE/DAE in a file
742b043167SHong Zhang 
7578fbdcc8SBarry Smith       Saves each timestep into a seperate file in Visualization-data/SA-%06d.bin
7678fbdcc8SBarry Smith 
7778fbdcc8SBarry Smith       This version saves only the solutions at each timestep, it does not save the solution at each stage,
7878fbdcc8SBarry Smith       see TSTRAJECTORYBASIC that saves all stages
7978fbdcc8SBarry Smith 
80*c3a89c15SBarry Smith       $PETSC_DIR/share/petsc/matlab/PetscReadBinaryTrajectory.m and $PETSC_DIR/lib/petsc/bin/PetscBinaryIOTrajectory.py
8178fbdcc8SBarry Smith       can read in files created with this format into MATLAB and Python.
8278fbdcc8SBarry Smith 
832b043167SHong Zhang   Level: intermediate
842b043167SHong Zhang 
8578fbdcc8SBarry Smith .seealso:  TSTrajectoryCreate(), TS, TSTrajectorySetType(), TSTrajectoryType, TSTrajectorySetVariableNames()
862b043167SHong Zhang 
872b043167SHong Zhang M*/
882b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory tj,TS ts)
892b043167SHong Zhang {
902b043167SHong Zhang   PetscFunctionBegin;
912b043167SHong Zhang   tj->ops->set  = TSTrajectorySet_Visualization;
922b043167SHong Zhang   PetscFunctionReturn(0);
932b043167SHong Zhang }
94