xref: /petsc/src/ts/trajectory/impls/basic/trajbasic.c (revision f3334a0318b29500bb17dd9858d761f03932cee4)
1bc952696SBarry Smith 
2af0996ceSBarry Smith #include <petsc/private/tsimpl.h>        /*I "petscts.h"  I*/
3bc952696SBarry Smith 
4*f3334a03SStefano Zampini typedef struct {
5*f3334a03SStefano Zampini   PetscViewer viewer;
6*f3334a03SStefano Zampini } TSTrajectory_Basic;
7bc952696SBarry Smith 
8560360afSLisandro Dalcin static PetscErrorCode TSTrajectorySet_Basic(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X)
9bc952696SBarry Smith {
10*f3334a03SStefano Zampini   TSTrajectory_Basic *tjbasic = (TSTrajectory_Basic*)tj->data;
119afe7f3eSBarry Smith   char               filename[PETSC_MAX_PATH_LEN];
12bc952696SBarry Smith   PetscErrorCode     ierr;
136cd0a353SHong Zhang 
1422a86ba0SHong Zhang   PetscFunctionBegin;
159afe7f3eSBarry Smith   ierr = PetscSNPrintf(filename,sizeof(filename),tj->dirfiletemplate,stepnum);CHKERRQ(ierr);
16*f3334a03SStefano Zampini   ierr = PetscViewerFileSetName(tjbasic->viewer,filename);CHKERRQ(ierr);
17*f3334a03SStefano Zampini   ierr = PetscViewerSetUp(tjbasic->viewer);CHKERRQ(ierr);
18*f3334a03SStefano Zampini   ierr = VecView(X,tjbasic->viewer);CHKERRQ(ierr);
19*f3334a03SStefano Zampini   ierr = PetscViewerBinaryWrite(tjbasic->viewer,&time,1,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr);
20*f3334a03SStefano Zampini   if (stepnum && !tj->solution_only) {
21*f3334a03SStefano Zampini     Vec       *Y;
22*f3334a03SStefano Zampini     PetscReal tprev;
23*f3334a03SStefano Zampini     PetscInt  ns,i;
24bc952696SBarry Smith 
25c679fc15SHong Zhang     ierr = TSGetStages(ts,&ns,&Y);CHKERRQ(ierr);
26bc952696SBarry Smith     for (i=0;i<ns;i++) {
27*f3334a03SStefano Zampini       ierr = VecView(Y[i],tjbasic->viewer);CHKERRQ(ierr);
28*f3334a03SStefano Zampini     }
29*f3334a03SStefano Zampini     ierr = TSGetPrevTime(ts,&tprev);CHKERRQ(ierr);
30*f3334a03SStefano Zampini     ierr = PetscViewerBinaryWrite(tjbasic->viewer,&tprev,1,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr);
31*f3334a03SStefano Zampini   }
32*f3334a03SStefano Zampini   PetscFunctionReturn(0);
33bc952696SBarry Smith }
34bc952696SBarry Smith 
35*f3334a03SStefano Zampini static PetscErrorCode TSTrajectorySetFromOptions_Basic(PetscOptionItems *PetscOptionsObject,TSTrajectory tj)
36*f3334a03SStefano Zampini {
37*f3334a03SStefano Zampini   PetscErrorCode ierr;
38c679fc15SHong Zhang 
39*f3334a03SStefano Zampini   PetscFunctionBegin;
40*f3334a03SStefano Zampini   ierr = PetscOptionsHead(PetscOptionsObject,"TS trajectory options for Basic type");CHKERRQ(ierr);
41*f3334a03SStefano Zampini   ierr = PetscOptionsTail();CHKERRQ(ierr);
42bc952696SBarry Smith   PetscFunctionReturn(0);
43bc952696SBarry Smith }
44bc952696SBarry Smith 
45560360afSLisandro Dalcin static PetscErrorCode TSTrajectoryGet_Basic(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *t)
46bc952696SBarry Smith {
47bc952696SBarry Smith   PetscViewer    viewer;
489afe7f3eSBarry Smith   char           filename[PETSC_MAX_PATH_LEN];
49bc952696SBarry Smith   PetscErrorCode ierr;
50*f3334a03SStefano Zampini   Vec            Sol;
516cd0a353SHong Zhang 
5222a86ba0SHong Zhang   PetscFunctionBegin;
53*f3334a03SStefano Zampini   ierr = PetscSNPrintf(filename,sizeof(filename),tj->dirfiletemplate,stepnum);CHKERRQ(ierr);
54bc952696SBarry Smith   ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,filename,FILE_MODE_READ,&viewer);CHKERRQ(ierr);
55bc952696SBarry Smith   ierr = TSGetSolution(ts,&Sol);CHKERRQ(ierr);
56*f3334a03SStefano Zampini   ierr = PetscViewerPushFormat(viewer,PETSC_VIEWER_NATIVE);CHKERRQ(ierr);
57bc952696SBarry Smith   ierr = VecLoad(Sol,viewer);CHKERRQ(ierr);
58c679fc15SHong Zhang   ierr = PetscViewerBinaryRead(viewer,t,1,NULL,PETSC_REAL);CHKERRQ(ierr);
59*f3334a03SStefano Zampini   if (stepnum != 0 && !tj->solution_only) {
60*f3334a03SStefano Zampini     Vec         *Y;
61*f3334a03SStefano Zampini     PetscInt    Nr,i;
62*f3334a03SStefano Zampini     PetscReal   timepre;
63bc952696SBarry Smith 
64bc952696SBarry Smith     ierr = TSGetStages(ts,&Nr,&Y);CHKERRQ(ierr);
65bc952696SBarry Smith     for (i=0;i<Nr ;i++) {
66bc952696SBarry Smith       ierr = VecLoad(Y[i],viewer);CHKERRQ(ierr);
67bc952696SBarry Smith     }
68c679fc15SHong Zhang     ierr = PetscViewerBinaryRead(viewer,&timepre,1,NULL,PETSC_REAL);CHKERRQ(ierr);
69*f3334a03SStefano Zampini     if (tj->adjoint_solve_mode) {
70acaebbb6SHong Zhang       ierr = TSSetTimeStep(ts,-(*t)+timepre);CHKERRQ(ierr);
7126656371SHong Zhang     }
72*f3334a03SStefano Zampini   }
7326656371SHong Zhang   ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
74bc952696SBarry Smith   PetscFunctionReturn(0);
75bc952696SBarry Smith }
76bc952696SBarry Smith 
77*f3334a03SStefano Zampini static PetscErrorCode TSTrajectorySetUp_Basic(TSTrajectory tj,TS ts)
78*f3334a03SStefano Zampini {
79*f3334a03SStefano Zampini   MPI_Comm       comm;
80*f3334a03SStefano Zampini   PetscMPIInt    rank;
81*f3334a03SStefano Zampini   PetscErrorCode ierr;
82*f3334a03SStefano Zampini 
83*f3334a03SStefano Zampini   PetscFunctionBegin;
84*f3334a03SStefano Zampini   ierr = PetscObjectGetComm((PetscObject)tj,&comm);CHKERRQ(ierr);
85*f3334a03SStefano Zampini   ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
86*f3334a03SStefano Zampini   if (!rank) {
87*f3334a03SStefano Zampini     const char* dir = tj->dirname;
88*f3334a03SStefano Zampini     PetscBool   flg;
89*f3334a03SStefano Zampini 
90*f3334a03SStefano Zampini     /* I don't like running PetscRMTree on a directory */
91*f3334a03SStefano Zampini     ierr = PetscTestDirectory(dir,'w',&flg);CHKERRQ(ierr);
92*f3334a03SStefano Zampini     if (!flg) {
93*f3334a03SStefano Zampini       ierr = PetscTestFile(dir,'r',&flg);CHKERRQ(ierr);
94*f3334a03SStefano Zampini       if (flg) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_USER,"Specified path is a file - not a dir: %s",dir);
95*f3334a03SStefano Zampini       ierr = PetscMkdir(dir);CHKERRQ(ierr);
96*f3334a03SStefano Zampini     } else SETERRQ1(comm,PETSC_ERR_SUP,"Directory %s not empty",tj->dirname);
97*f3334a03SStefano Zampini   }
98*f3334a03SStefano Zampini   ierr = PetscBarrier((PetscObject)tj);CHKERRQ(ierr);
99*f3334a03SStefano Zampini   PetscFunctionReturn(0);
100*f3334a03SStefano Zampini }
101*f3334a03SStefano Zampini 
10264fc91eeSBarry Smith static PetscErrorCode TSTrajectoryDestroy_Basic(TSTrajectory tj)
10364fc91eeSBarry Smith {
104*f3334a03SStefano Zampini   TSTrajectory_Basic *tjbasic = (TSTrajectory_Basic*)tj->data;
10564fc91eeSBarry Smith   PetscErrorCode     ierr;
10664fc91eeSBarry Smith 
10764fc91eeSBarry Smith   PetscFunctionBegin;
108*f3334a03SStefano Zampini   ierr = PetscViewerDestroy(&tjbasic->viewer);CHKERRQ(ierr);
109*f3334a03SStefano Zampini   ierr = PetscFree(tjbasic);CHKERRQ(ierr);
11064fc91eeSBarry Smith   PetscFunctionReturn(0);
11164fc91eeSBarry Smith }
11264fc91eeSBarry Smith 
113bc952696SBarry Smith /*MC
11478fbdcc8SBarry Smith       TSTRAJECTORYBASIC - Stores each solution of the ODE/DAE in a file
11578fbdcc8SBarry Smith 
11664e38db7SHong Zhang       Saves each timestep into a seperate file named SA-data/SA-%06d.bin. The file name can be changed.
11778fbdcc8SBarry Smith 
11878fbdcc8SBarry Smith       This version saves the solutions at all the stages
11978fbdcc8SBarry Smith 
12078fbdcc8SBarry Smith       $PETSC_DIR/share/petsc/matlab/PetscReadBinaryTrajectory.m can read in files created with this format
121bc952696SBarry Smith 
122bc952696SBarry Smith   Level: intermediate
123bc952696SBarry Smith 
12464e38db7SHong Zhang .seealso:  TSTrajectoryCreate(), TS, TSTrajectorySetType(), TSTrajectorySetDirname(), TSTrajectorySetFile()
125bc952696SBarry Smith 
126bc952696SBarry Smith M*/
127c3df6c96SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory tj,TS ts)
128bc952696SBarry Smith {
129*f3334a03SStefano Zampini   TSTrajectory_Basic *tjbasic;
130*f3334a03SStefano Zampini   PetscErrorCode     ierr;
131*f3334a03SStefano Zampini 
132bc952696SBarry Smith   PetscFunctionBegin;
133*f3334a03SStefano Zampini   ierr = PetscNew(&tjbasic);CHKERRQ(ierr);
134*f3334a03SStefano Zampini 
135*f3334a03SStefano Zampini   ierr = PetscViewerCreate(PetscObjectComm((PetscObject)tj),&tjbasic->viewer);CHKERRQ(ierr);
136*f3334a03SStefano Zampini   ierr = PetscViewerSetType(tjbasic->viewer,PETSCVIEWERBINARY);CHKERRQ(ierr);
137*f3334a03SStefano Zampini   ierr = PetscViewerPushFormat(tjbasic->viewer,PETSC_VIEWER_NATIVE);CHKERRQ(ierr);
138*f3334a03SStefano Zampini   ierr = PetscViewerFileSetMode(tjbasic->viewer,FILE_MODE_WRITE);CHKERRQ(ierr);
139*f3334a03SStefano Zampini   tj->data = tjbasic;
140*f3334a03SStefano Zampini 
14152fbb9a2SHong Zhang   tj->ops->set            = TSTrajectorySet_Basic;
14252fbb9a2SHong Zhang   tj->ops->get            = TSTrajectoryGet_Basic;
143*f3334a03SStefano Zampini   tj->ops->setup          = TSTrajectorySetUp_Basic;
14464fc91eeSBarry Smith   tj->ops->destroy        = TSTrajectoryDestroy_Basic;
145*f3334a03SStefano Zampini   tj->ops->setfromoptions = TSTrajectorySetFromOptions_Basic;
146bc952696SBarry Smith   PetscFunctionReturn(0);
147bc952696SBarry Smith }
148