xref: /petsc/src/ts/trajectory/impls/visualization/trajvisualization.c (revision 2fa40bb9206b96114faa7cb222621ec184d31cd2)
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(comm,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   if (stepnum == 0) {
27     PetscMPIInt rank;
28     ierr = MPI_Comm_rank(comm,&rank);CHKERRMPI(ierr);
29     if (rank == 0) {
30       ierr = PetscRMTree("Visualization-data");CHKERRQ(ierr);
31       ierr = PetscMkdir("Visualization-data");CHKERRQ(ierr);
32     }
33     if (tj->names) {
34       PetscViewer bnames;
35       ierr = PetscViewerBinaryOpen(comm,"Visualization-data/variablenames",FILE_MODE_WRITE,&bnames);CHKERRQ(ierr);
36       ierr = PetscViewerBinaryWriteStringArray(bnames,(const char *const *)tj->names);CHKERRQ(ierr);
37       ierr = PetscViewerDestroy(&bnames);CHKERRQ(ierr);
38     }
39     ierr = PetscSNPrintf(filename,sizeof(filename),"Visualization-data/SA-%06d.bin",stepnum);CHKERRQ(ierr);
40     ierr = OutputBIN(comm,filename,&viewer);CHKERRQ(ierr);
41     if (!tj->transform) {
42       ierr = VecView(X,viewer);CHKERRQ(ierr);
43     } else {
44       Vec XX;
45       ierr = (*tj->transform)(tj->transformctx,X,&XX);CHKERRQ(ierr);
46       ierr = VecView(XX,viewer);CHKERRQ(ierr);
47       ierr = VecDestroy(&XX);CHKERRQ(ierr);
48     }
49     ierr = PetscViewerBinaryWrite(viewer,&time,1,PETSC_REAL);CHKERRQ(ierr);
50     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
51     PetscFunctionReturn(0);
52   }
53   ierr = PetscSNPrintf(filename,sizeof(filename),"Visualization-data/SA-%06d.bin",stepnum);CHKERRQ(ierr);
54   ierr = OutputBIN(comm,filename,&viewer);CHKERRQ(ierr);
55   if (!tj->transform) {
56     ierr = VecView(X,viewer);CHKERRQ(ierr);
57   } else {
58     Vec XX;
59     ierr = (*tj->transform)(tj->transformctx,X,&XX);CHKERRQ(ierr);
60     ierr = VecView(XX,viewer);CHKERRQ(ierr);
61     ierr = VecDestroy(&XX);CHKERRQ(ierr);
62   }
63   ierr = PetscViewerBinaryWrite(viewer,&time,1,PETSC_REAL);CHKERRQ(ierr);
64 
65   ierr = TSGetPrevTime(ts,&tprev);CHKERRQ(ierr);
66   ierr = PetscViewerBinaryWrite(viewer,&tprev,1,PETSC_REAL);CHKERRQ(ierr);
67 
68   ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
69   PetscFunctionReturn(0);
70 }
71 
72 /*MC
73       TSTRAJECTORYVISUALIZATION - Stores each solution of the ODE/DAE in a file
74 
75       Saves each timestep into a separate file in Visualization-data/SA-%06d.bin
76 
77       This version saves only the solutions at each timestep, it does not save the solution at each stage,
78       see TSTRAJECTORYBASIC that saves all stages
79 
80       $PETSC_DIR/share/petsc/matlab/PetscReadBinaryTrajectory.m and $PETSC_DIR/lib/petsc/bin/PetscBinaryIOTrajectory.py
81       can read in files created with this format into MATLAB and Python.
82 
83   Level: intermediate
84 
85 .seealso:  TSTrajectoryCreate(), TS, TSTrajectorySetType(), TSTrajectoryType, TSTrajectorySetVariableNames()
86 
87 M*/
88 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory tj,TS ts)
89 {
90   PetscFunctionBegin;
91   tj->ops->set    = TSTrajectorySet_Visualization;
92   tj->setupcalled = PETSC_TRUE;
93   PetscFunctionReturn(0);
94 }
95