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