xref: /petsc/src/ts/trajectory/impls/basic/trajbasic.c (revision 2f6eced2a19e978d64f27de66fbc6c26cc5c7934)
1 
2 #include <petsc/private/tsimpl.h>        /*I "petscts.h"  I*/
3 
4 static PetscErrorCode OutputBIN(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_Basic(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X)
17 {
18   PetscViewer    viewer;
19   PetscInt       ns,i;
20   Vec            *Y;
21   char           filename[PETSC_MAX_PATH_LEN];
22   PetscReal      tprev;
23   PetscErrorCode ierr;
24 
25   PetscFunctionBegin;
26   ierr = TSGetTotalSteps(ts,&stepnum);CHKERRQ(ierr);
27   if (stepnum == 0) {
28     PetscMPIInt rank;
29     ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)ts),&rank);CHKERRQ(ierr);
30     if (!rank) {
31       ierr = PetscRMTree("SA-data");CHKERRQ(ierr);
32       ierr = PetscMkdir("SA-data");CHKERRQ(ierr);
33     }
34     ierr = PetscSNPrintf(filename,sizeof(filename),"SA-data/SA-%06d.bin",stepnum);CHKERRQ(ierr);
35     ierr = OutputBIN(filename,&viewer);CHKERRQ(ierr);
36     ierr = VecView(X,viewer);CHKERRQ(ierr);
37     ierr = PetscViewerBinaryWrite(viewer,&time,1,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr);
38     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
39     PetscFunctionReturn(0);
40   }
41   ierr = PetscSNPrintf(filename,sizeof(filename),"SA-data/SA-%06d.bin",stepnum);CHKERRQ(ierr);
42   ierr = OutputBIN(filename,&viewer);CHKERRQ(ierr);
43   ierr = VecView(X,viewer);CHKERRQ(ierr);
44   ierr = PetscViewerBinaryWrite(viewer,&time,1,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr);
45 
46   ierr = TSGetStages(ts,&ns,&Y);CHKERRQ(ierr);
47   for (i=0;i<ns;i++) {
48     ierr = VecView(Y[i],viewer);CHKERRQ(ierr);
49   }
50 
51   ierr = TSGetPrevTime(ts,&tprev);CHKERRQ(ierr);
52   ierr = PetscViewerBinaryWrite(viewer,&tprev,1,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr);
53 
54   ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
55   PetscFunctionReturn(0);
56 }
57 
58 static PetscErrorCode TSTrajectoryGet_Basic(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *t)
59 {
60   Vec            Sol,*Y;
61   PetscInt       Nr,i;
62   PetscViewer    viewer;
63   PetscReal      timepre;
64   char           filename[PETSC_MAX_PATH_LEN];
65   PetscErrorCode ierr;
66 
67   PetscFunctionBegin;
68   ierr = TSGetTotalSteps(ts,&stepnum);CHKERRQ(ierr);
69   ierr = PetscSNPrintf(filename,sizeof filename,"SA-data/SA-%06d.bin",stepnum);CHKERRQ(ierr);
70   ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,filename,FILE_MODE_READ,&viewer);CHKERRQ(ierr);
71 
72   ierr = TSGetSolution(ts,&Sol);CHKERRQ(ierr);
73   ierr = VecLoad(Sol,viewer);CHKERRQ(ierr);
74 
75   ierr = PetscViewerBinaryRead(viewer,t,1,NULL,PETSC_REAL);CHKERRQ(ierr);
76 
77   if (stepnum != 0) {
78     ierr = TSGetStages(ts,&Nr,&Y);CHKERRQ(ierr);
79     for (i=0;i<Nr ;i++) {
80       ierr = VecLoad(Y[i],viewer);CHKERRQ(ierr);
81     }
82     ierr = PetscViewerBinaryRead(viewer,&timepre,1,NULL,PETSC_REAL);CHKERRQ(ierr);
83     ierr = TSSetTimeStep(ts,-(*t)+timepre);CHKERRQ(ierr);
84   }
85 
86   ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
87   PetscFunctionReturn(0);
88 }
89 
90 /*MC
91       TSTRAJECTORYBASIC - Stores each solution of the ODE/ADE in a file
92 
93   Level: intermediate
94 
95 .seealso:  TSTrajectoryCreate(), TS, TSTrajectorySetType()
96 
97 M*/
98 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory tj,TS ts)
99 {
100   PetscFunctionBegin;
101   tj->ops->set  = TSTrajectorySet_Basic;
102   tj->ops->get  = TSTrajectoryGet_Basic;
103   PetscFunctionReturn(0);
104 }
105