xref: /petsc/src/ts/trajectory/impls/visualization/trajvisualization.c (revision 78fbdcc8da47d2da69f91a746197bf2bceb22ad2)
1 
2 #include <petsc/private/tsimpl.h>        /*I "petscts.h"  I*/
3 
4 static PetscErrorCode OutputBIN(MPI_Comm comm,const char *filename,PetscViewer *viewer)
5 {
6   PetscErrorCode ierr;
7 
8   PetscFunctionBegin;
9   ierr = PetscViewerCreate(PETSC_COMM_WORLD,viewer);CHKERRQ(ierr);
10   ierr = PetscViewerSetType(*viewer,PETSCVIEWERBINARY);CHKERRQ(ierr);
11   ierr = PetscViewerFileSetMode(*viewer,FILE_MODE_WRITE);CHKERRQ(ierr);
12   ierr = PetscViewerFileSetName(*viewer,filename);CHKERRQ(ierr);
13   PetscFunctionReturn(0);
14 }
15 
16 static PetscErrorCode TSTrajectorySet_Visualization(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X)
17 {
18   PetscViewer    viewer;
19   char           filename[PETSC_MAX_PATH_LEN];
20   PetscReal      tprev;
21   PetscErrorCode ierr;
22   MPI_Comm       comm;
23 
24   PetscFunctionBegin;
25   ierr = PetscObjectGetComm((PetscObject)ts,&comm);CHKERRQ(ierr);
26   ierr = TSGetTotalSteps(ts,&stepnum);CHKERRQ(ierr);
27   if (stepnum == 0) {
28     PetscMPIInt rank;
29     ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
30     if (!rank) {
31       ierr = PetscRMTree("Visualization-data");CHKERRQ(ierr);
32       ierr = PetscMkdir("Visualization-data");CHKERRQ(ierr);
33     }
34     if (tj->names) {
35       PetscViewer bnames;
36       ierr = PetscViewerBinaryOpen(comm,"Visualization-data/variablenames",FILE_MODE_WRITE,&bnames);CHKERRQ(ierr);
37       ierr = PetscViewerBinaryWriteStringArray(bnames,(const char *const *)tj->names);CHKERRQ(ierr);
38       ierr = PetscViewerDestroy(&bnames);CHKERRQ(ierr);
39     }
40     ierr = PetscSNPrintf(filename,sizeof(filename),"Visualization-data/SA-%06d.bin",stepnum);CHKERRQ(ierr);
41     ierr = OutputBIN(comm,filename,&viewer);CHKERRQ(ierr);
42     ierr = VecView(X,viewer);CHKERRQ(ierr);
43     ierr = PetscViewerBinaryWrite(viewer,&time,1,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr);
44     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
45     PetscFunctionReturn(0);
46   }
47   ierr = PetscSNPrintf(filename,sizeof(filename),"Visualization-data/SA-%06d.bin",stepnum);CHKERRQ(ierr);
48   ierr = OutputBIN(comm,filename,&viewer);CHKERRQ(ierr);
49   ierr = VecView(X,viewer);CHKERRQ(ierr);
50   ierr = PetscViewerBinaryWrite(viewer,&time,1,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr);
51 
52   ierr = TSGetPrevTime(ts,&tprev);CHKERRQ(ierr);
53   ierr = PetscViewerBinaryWrite(viewer,&tprev,1,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr);
54 
55   ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
56   PetscFunctionReturn(0);
57 }
58 
59 /*MC
60       TSTRAJECTORYVISUALIZATION - Stores each solution of the ODE/DAE in a file
61 
62       Saves each timestep into a seperate file in Visualization-data/SA-%06d.bin
63 
64       This version saves only the solutions at each timestep, it does not save the solution at each stage,
65       see TSTRAJECTORYBASIC that saves all stages
66 
67       $PETSC_DIR/share/petsc/matlab/PetscReadBinaryTrajectory.m and $PETSC_DIR/bin/PetscBinaryIOTrajectory.py
68       can read in files created with this format into MATLAB and Python.
69 
70   Level: intermediate
71 
72 .seealso:  TSTrajectoryCreate(), TS, TSTrajectorySetType(), TSTrajectoryType, TSTrajectorySetVariableNames()
73 
74 M*/
75 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory tj,TS ts)
76 {
77   PetscFunctionBegin;
78   tj->ops->set  = TSTrajectorySet_Visualization;
79   PetscFunctionReturn(0);
80 }
81