xref: /petsc/src/ts/trajectory/impls/basic/trajbasic.c (revision 64e38db7c5aae0ecdbe282bf3dcdf34c98cb00d9)
1bc952696SBarry Smith 
2af0996ceSBarry Smith #include <petsc/private/tsimpl.h>        /*I "petscts.h"  I*/
3bc952696SBarry Smith 
478fbdcc8SBarry Smith static PetscErrorCode OutputBIN(MPI_Comm comm,const char *filename,PetscViewer *viewer)
5bc952696SBarry Smith {
6bc952696SBarry Smith   PetscErrorCode ierr;
7bc952696SBarry Smith 
822a86ba0SHong Zhang   PetscFunctionBegin;
978fbdcc8SBarry Smith   ierr = PetscViewerCreate(comm,viewer);CHKERRQ(ierr);
10bc952696SBarry Smith   ierr = PetscViewerSetType(*viewer,PETSCVIEWERBINARY);CHKERRQ(ierr);
11e77e8349SHong Zhang   ierr = PetscViewerFileSetMode(*viewer,FILE_MODE_WRITE);CHKERRQ(ierr);
12bc952696SBarry Smith   ierr = PetscViewerFileSetName(*viewer,filename);CHKERRQ(ierr);
13bc952696SBarry Smith   PetscFunctionReturn(0);
14bc952696SBarry Smith }
15bc952696SBarry Smith 
16560360afSLisandro Dalcin static PetscErrorCode TSTrajectorySet_Basic(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X)
17bc952696SBarry Smith {
18bc952696SBarry Smith   PetscViewer    viewer;
19bc952696SBarry Smith   PetscInt       ns,i;
20bc952696SBarry Smith   Vec            *Y;
21bc952696SBarry Smith   char           filename[PETSC_MAX_PATH_LEN];
22bc952696SBarry Smith   PetscReal      tprev;
23bc952696SBarry Smith   PetscErrorCode ierr;
2478fbdcc8SBarry Smith   MPI_Comm       comm;
256cd0a353SHong Zhang 
2622a86ba0SHong Zhang   PetscFunctionBegin;
2778fbdcc8SBarry Smith   ierr = PetscObjectGetComm((PetscObject)ts,&comm);CHKERRQ(ierr);
2880275a0aSLisandro Dalcin   ierr = TSGetStepNumber(ts,&stepnum);CHKERRQ(ierr);
29bc952696SBarry Smith   if (stepnum == 0) {
30bc952696SBarry Smith     PetscMPIInt rank;
3178fbdcc8SBarry Smith     ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
32bc952696SBarry Smith     if (!rank) {
33*64e38db7SHong Zhang       ierr = PetscRMTree(tj->dirname);CHKERRQ(ierr);
34*64e38db7SHong Zhang       ierr = PetscMkdir(tj->dirname);CHKERRQ(ierr);
35bc952696SBarry Smith     }
36*64e38db7SHong Zhang     ierr = PetscSNPrintf(filename,sizeof(filename),tj->filetemplate,stepnum);CHKERRQ(ierr);
3778fbdcc8SBarry Smith     ierr = OutputBIN(comm,filename,&viewer);CHKERRQ(ierr);
3826656371SHong Zhang     ierr = VecView(X,viewer);CHKERRQ(ierr);
3926656371SHong Zhang     ierr = PetscViewerBinaryWrite(viewer,&time,1,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr);
40c186a807SHong Zhang     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
41bc952696SBarry Smith     PetscFunctionReturn(0);
42bc952696SBarry Smith   }
43*64e38db7SHong Zhang   ierr = PetscSNPrintf(filename,sizeof(filename),tj->filetemplate,stepnum);CHKERRQ(ierr);
4478fbdcc8SBarry Smith   ierr = OutputBIN(comm,filename,&viewer);CHKERRQ(ierr);
45bc952696SBarry Smith   ierr = VecView(X,viewer);CHKERRQ(ierr);
46c679fc15SHong Zhang   ierr = PetscViewerBinaryWrite(viewer,&time,1,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr);
47bc952696SBarry Smith 
48c679fc15SHong Zhang   ierr = TSGetStages(ts,&ns,&Y);CHKERRQ(ierr);
49bc952696SBarry Smith   for (i=0;i<ns;i++) {
50bc952696SBarry Smith     ierr = VecView(Y[i],viewer);CHKERRQ(ierr);
51bc952696SBarry Smith   }
52bc952696SBarry Smith 
53c679fc15SHong Zhang   ierr = TSGetPrevTime(ts,&tprev);CHKERRQ(ierr);
54c679fc15SHong Zhang   ierr = PetscViewerBinaryWrite(viewer,&tprev,1,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr);
55c679fc15SHong Zhang 
56bc952696SBarry Smith   ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
57bc952696SBarry Smith   PetscFunctionReturn(0);
58bc952696SBarry Smith }
59bc952696SBarry Smith 
60560360afSLisandro Dalcin static PetscErrorCode TSTrajectoryGet_Basic(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *t)
61bc952696SBarry Smith {
62bc952696SBarry Smith   Vec            Sol,*Y;
63060da220SMatthew G. Knepley   PetscInt       Nr,i;
64bc952696SBarry Smith   PetscViewer    viewer;
65bc952696SBarry Smith   PetscReal      timepre;
66bc952696SBarry Smith   char           filename[PETSC_MAX_PATH_LEN];
67bc952696SBarry Smith   PetscErrorCode ierr;
686cd0a353SHong Zhang 
6922a86ba0SHong Zhang   PetscFunctionBegin;
70*64e38db7SHong Zhang   ierr = PetscSNPrintf(filename,sizeof filename,tj->filetemplate,stepnum);CHKERRQ(ierr);
71bc952696SBarry Smith   ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,filename,FILE_MODE_READ,&viewer);CHKERRQ(ierr);
72bc952696SBarry Smith 
73bc952696SBarry Smith   ierr = TSGetSolution(ts,&Sol);CHKERRQ(ierr);
74bc952696SBarry Smith   ierr = VecLoad(Sol,viewer);CHKERRQ(ierr);
75bc952696SBarry Smith 
76c679fc15SHong Zhang   ierr = PetscViewerBinaryRead(viewer,t,1,NULL,PETSC_REAL);CHKERRQ(ierr);
77bc952696SBarry Smith 
7826656371SHong Zhang   if (stepnum != 0) {
79bc952696SBarry Smith     ierr = TSGetStages(ts,&Nr,&Y);CHKERRQ(ierr);
80bc952696SBarry Smith     for (i=0;i<Nr ;i++) {
81bc952696SBarry Smith       ierr = VecLoad(Y[i],viewer);CHKERRQ(ierr);
82bc952696SBarry Smith     }
83c679fc15SHong Zhang     ierr = PetscViewerBinaryRead(viewer,&timepre,1,NULL,PETSC_REAL);CHKERRQ(ierr);
84acaebbb6SHong Zhang     ierr = TSSetTimeStep(ts,-(*t)+timepre);CHKERRQ(ierr);
8526656371SHong Zhang   }
86bc952696SBarry Smith 
8726656371SHong Zhang   ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
88bc952696SBarry Smith   PetscFunctionReturn(0);
89bc952696SBarry Smith }
90bc952696SBarry Smith 
9164fc91eeSBarry Smith static PetscErrorCode TSTrajectoryDestroy_Basic(TSTrajectory tj)
9264fc91eeSBarry Smith {
9364fc91eeSBarry Smith   PetscErrorCode ierr;
9464fc91eeSBarry Smith   PetscMPIInt    rank;
9564fc91eeSBarry Smith   MPI_Comm       comm;
9664fc91eeSBarry Smith 
9764fc91eeSBarry Smith   PetscFunctionBegin;
9864fc91eeSBarry Smith   if (!tj->keepfiles) {
9964fc91eeSBarry Smith     ierr = PetscObjectGetComm((PetscObject)tj,&comm);CHKERRQ(ierr);
10064fc91eeSBarry Smith     ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
10164fc91eeSBarry Smith     if (!rank) {
10264fc91eeSBarry Smith       ierr = PetscRMTree("SA-data");CHKERRQ(ierr);
10364fc91eeSBarry Smith     }
10464fc91eeSBarry Smith   }
10564fc91eeSBarry Smith   PetscFunctionReturn(0);
10664fc91eeSBarry Smith }
10764fc91eeSBarry Smith 
108bc952696SBarry Smith /*MC
10978fbdcc8SBarry Smith       TSTRAJECTORYBASIC - Stores each solution of the ODE/DAE in a file
11078fbdcc8SBarry Smith 
111*64e38db7SHong Zhang       Saves each timestep into a seperate file named SA-data/SA-%06d.bin. The file name can be changed.
11278fbdcc8SBarry Smith 
11378fbdcc8SBarry Smith       This version saves the solutions at all the stages
11478fbdcc8SBarry Smith 
11578fbdcc8SBarry Smith       $PETSC_DIR/share/petsc/matlab/PetscReadBinaryTrajectory.m can read in files created with this format
116bc952696SBarry Smith 
117bc952696SBarry Smith   Level: intermediate
118bc952696SBarry Smith 
119*64e38db7SHong Zhang .seealso:  TSTrajectoryCreate(), TS, TSTrajectorySetType(), TSTrajectorySetDirname(), TSTrajectorySetFile()
120bc952696SBarry Smith 
121bc952696SBarry Smith M*/
122c3df6c96SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory tj,TS ts)
123bc952696SBarry Smith {
124bc952696SBarry Smith   PetscFunctionBegin;
12564fc91eeSBarry Smith   tj->keepfiles    = PETSC_FALSE;
12652fbb9a2SHong Zhang   tj->ops->set     = TSTrajectorySet_Basic;
12752fbb9a2SHong Zhang   tj->ops->get     = TSTrajectoryGet_Basic;
12864fc91eeSBarry Smith   tj->ops->destroy = TSTrajectoryDestroy_Basic;
129bc952696SBarry Smith   PetscFunctionReturn(0);
130bc952696SBarry Smith }
131