xref: /petsc/src/ts/trajectory/impls/basic/trajbasic.c (revision 98921bda46e76d7aaed9e0138c5ff9d0ce93f355)
1bc952696SBarry Smith 
2af0996ceSBarry Smith #include <petsc/private/tsimpl.h>        /*I "petscts.h"  I*/
3bc952696SBarry Smith 
4f3334a03SStefano Zampini typedef struct {
5f3334a03SStefano Zampini   PetscViewer viewer;
6f3334a03SStefano Zampini } TSTrajectory_Basic;
7533251d3SHong Zhang /*
8533251d3SHong Zhang   For n-th time step, TSTrajectorySet_Basic always saves the solution X(t_n) and the current time t_n,
9533251d3SHong Zhang   and optionally saves the stage values Y[] between t_{n-1} and t_n, the previous time t_{n-1}, and
10533251d3SHong Zhang   forward stage sensitivities S[] = dY[]/dp.
11533251d3SHong Zhang */
12560360afSLisandro Dalcin static PetscErrorCode TSTrajectorySet_Basic(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X)
13bc952696SBarry Smith {
14f3334a03SStefano Zampini   TSTrajectory_Basic *tjbasic = (TSTrajectory_Basic*)tj->data;
159afe7f3eSBarry Smith   char               filename[PETSC_MAX_PATH_LEN];
166affb6f8SHong Zhang   PetscInt           ns,i;
17bc952696SBarry Smith   PetscErrorCode     ierr;
186cd0a353SHong Zhang 
1922a86ba0SHong Zhang   PetscFunctionBegin;
209afe7f3eSBarry Smith   ierr = PetscSNPrintf(filename,sizeof(filename),tj->dirfiletemplate,stepnum);CHKERRQ(ierr);
21ac1a7491SHong Zhang   ierr = PetscViewerFileSetName(tjbasic->viewer,filename);CHKERRQ(ierr); /* this triggers PetscViewer to be set up again */
22f3334a03SStefano Zampini   ierr = PetscViewerSetUp(tjbasic->viewer);CHKERRQ(ierr);
23f3334a03SStefano Zampini   ierr = VecView(X,tjbasic->viewer);CHKERRQ(ierr);
24f253e43cSLisandro Dalcin   ierr = PetscViewerBinaryWrite(tjbasic->viewer,&time,1,PETSC_REAL);CHKERRQ(ierr);
25f3334a03SStefano Zampini   if (stepnum && !tj->solution_only) {
26f3334a03SStefano Zampini     Vec       *Y;
27f3334a03SStefano Zampini     PetscReal tprev;
28c679fc15SHong Zhang     ierr = TSGetStages(ts,&ns,&Y);CHKERRQ(ierr);
29bc952696SBarry Smith     for (i=0; i<ns; i++) {
30533251d3SHong Zhang       /* For stiffly accurate TS methods, the last stage Y[ns-1] is the same as the solution X, thus does not need to be saved again. */
31533251d3SHong Zhang       if (ts->stifflyaccurate && i == ns-1) continue;
32f3334a03SStefano Zampini       ierr = VecView(Y[i],tjbasic->viewer);CHKERRQ(ierr);
33f3334a03SStefano Zampini     }
34f3334a03SStefano Zampini     ierr = TSGetPrevTime(ts,&tprev);CHKERRQ(ierr);
35f253e43cSLisandro Dalcin     ierr = PetscViewerBinaryWrite(tjbasic->viewer,&tprev,1,PETSC_REAL);CHKERRQ(ierr);
36f3334a03SStefano Zampini   }
376affb6f8SHong Zhang   /* Tangent linear sensitivities needed by second-order adjoint */
386affb6f8SHong Zhang   if (ts->forward_solve) {
396affb6f8SHong Zhang     Mat A,*S;
406affb6f8SHong Zhang 
416affb6f8SHong Zhang     ierr = TSForwardGetSensitivities(ts,NULL,&A);CHKERRQ(ierr);
426affb6f8SHong Zhang     ierr = MatView(A,tjbasic->viewer);CHKERRQ(ierr);
436affb6f8SHong Zhang     if (stepnum) {
446affb6f8SHong Zhang       ierr = TSForwardGetStages(ts,&ns,&S);CHKERRQ(ierr);
456affb6f8SHong Zhang       for (i=0; i<ns; i++) {
466affb6f8SHong Zhang         ierr = MatView(S[i],tjbasic->viewer);CHKERRQ(ierr);
476affb6f8SHong Zhang       }
486affb6f8SHong Zhang     }
496affb6f8SHong Zhang   }
50f3334a03SStefano Zampini   PetscFunctionReturn(0);
51bc952696SBarry Smith }
52bc952696SBarry Smith 
53f3334a03SStefano Zampini static PetscErrorCode TSTrajectorySetFromOptions_Basic(PetscOptionItems *PetscOptionsObject,TSTrajectory tj)
54f3334a03SStefano Zampini {
55f3334a03SStefano Zampini   PetscErrorCode ierr;
56c679fc15SHong Zhang 
57f3334a03SStefano Zampini   PetscFunctionBegin;
58f3334a03SStefano Zampini   ierr = PetscOptionsHead(PetscOptionsObject,"TS trajectory options for Basic type");CHKERRQ(ierr);
59f3334a03SStefano Zampini   ierr = PetscOptionsTail();CHKERRQ(ierr);
60bc952696SBarry Smith   PetscFunctionReturn(0);
61bc952696SBarry Smith }
62bc952696SBarry Smith 
63560360afSLisandro Dalcin static PetscErrorCode TSTrajectoryGet_Basic(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *t)
64bc952696SBarry Smith {
65bc952696SBarry Smith   PetscViewer    viewer;
669afe7f3eSBarry Smith   char           filename[PETSC_MAX_PATH_LEN];
67bc952696SBarry Smith   PetscErrorCode ierr;
68f3334a03SStefano Zampini   Vec            Sol;
696affb6f8SHong Zhang   PetscInt       ns,i;
706cd0a353SHong Zhang 
7122a86ba0SHong Zhang   PetscFunctionBegin;
72f3334a03SStefano Zampini   ierr = PetscSNPrintf(filename,sizeof(filename),tj->dirfiletemplate,stepnum);CHKERRQ(ierr);
738a10d460SHong Zhang   ierr = PetscViewerBinaryOpen(PetscObjectComm((PetscObject)tj),filename,FILE_MODE_READ,&viewer);CHKERRQ(ierr);
74f3334a03SStefano Zampini   ierr = PetscViewerPushFormat(viewer,PETSC_VIEWER_NATIVE);CHKERRQ(ierr);
75cc4f23bcSHong Zhang   ierr = TSGetSolution(ts,&Sol);CHKERRQ(ierr);
76bc952696SBarry Smith   ierr = VecLoad(Sol,viewer);CHKERRQ(ierr);
77c679fc15SHong Zhang   ierr = PetscViewerBinaryRead(viewer,t,1,NULL,PETSC_REAL);CHKERRQ(ierr);
78ac1a7491SHong Zhang   if (stepnum && !tj->solution_only) {
79f3334a03SStefano Zampini     Vec       *Y;
80f3334a03SStefano Zampini     PetscReal timepre;
816affb6f8SHong Zhang     ierr = TSGetStages(ts,&ns,&Y);CHKERRQ(ierr);
826affb6f8SHong Zhang     for (i=0; i<ns; i++) {
83533251d3SHong Zhang       /* For stiffly accurate TS methods, the last stage Y[ns-1] is the same as the solution X, thus does not need to be loaded again. */
84533251d3SHong Zhang       if (ts->stifflyaccurate && i == ns-1) continue;
85bc952696SBarry Smith       ierr = VecLoad(Y[i],viewer);CHKERRQ(ierr);
86bc952696SBarry Smith     }
87c679fc15SHong Zhang     ierr = PetscViewerBinaryRead(viewer,&timepre,1,NULL,PETSC_REAL);CHKERRQ(ierr);
88f3334a03SStefano Zampini     if (tj->adjoint_solve_mode) {
89acaebbb6SHong Zhang       ierr = TSSetTimeStep(ts,-(*t)+timepre);CHKERRQ(ierr);
9026656371SHong Zhang     }
91f3334a03SStefano Zampini   }
926affb6f8SHong Zhang   /* Tangent linear sensitivities needed by second-order adjoint */
936affb6f8SHong Zhang   if (ts->forward_solve) {
946affb6f8SHong Zhang 
95cc4f23bcSHong Zhang     if (!ts->stifflyaccurate) {
96cc4f23bcSHong Zhang       Mat A;
976affb6f8SHong Zhang       ierr = TSForwardGetSensitivities(ts,NULL,&A);CHKERRQ(ierr);
986affb6f8SHong Zhang       ierr = MatLoad(A,viewer);CHKERRQ(ierr);
99cc4f23bcSHong Zhang     }
1006affb6f8SHong Zhang     if (stepnum) {
101cc4f23bcSHong Zhang       Mat *S;
1026affb6f8SHong Zhang       ierr = TSForwardGetStages(ts,&ns,&S);CHKERRQ(ierr);
1036affb6f8SHong Zhang       for (i=0; i<ns; i++) {
1046affb6f8SHong Zhang         ierr = MatLoad(S[i],viewer);CHKERRQ(ierr);
1056affb6f8SHong Zhang       }
1066affb6f8SHong Zhang     }
1076affb6f8SHong Zhang   }
10826656371SHong Zhang   ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
109bc952696SBarry Smith   PetscFunctionReturn(0);
110bc952696SBarry Smith }
111bc952696SBarry Smith 
1128a10d460SHong Zhang PetscErrorCode TSTrajectorySetUp_Basic(TSTrajectory tj,TS ts)
113f3334a03SStefano Zampini {
114f3334a03SStefano Zampini   MPI_Comm       comm;
115f3334a03SStefano Zampini   PetscMPIInt    rank;
116f3334a03SStefano Zampini   PetscErrorCode ierr;
117f3334a03SStefano Zampini 
118f3334a03SStefano Zampini   PetscFunctionBegin;
119f3334a03SStefano Zampini   ierr = PetscObjectGetComm((PetscObject)tj,&comm);CHKERRQ(ierr);
120ffc4695bSBarry Smith   ierr = MPI_Comm_rank(comm,&rank);CHKERRMPI(ierr);
121dd400576SPatrick Sanan   if (rank == 0) {
1228a10d460SHong Zhang     char      *dir = tj->dirname;
123f3334a03SStefano Zampini     PetscBool flg;
124f3334a03SStefano Zampini 
1258a10d460SHong Zhang     if (!dir) {
1268a10d460SHong Zhang       char dtempname[16] = "TS-data-XXXXXX";
1278a10d460SHong Zhang       ierr = PetscMkdtemp(dtempname);CHKERRQ(ierr);
1288a10d460SHong Zhang       ierr = PetscStrallocpy(dtempname,&tj->dirname);CHKERRQ(ierr);
1298a10d460SHong Zhang     } else {
130f3334a03SStefano Zampini       ierr = PetscTestDirectory(dir,'w',&flg);CHKERRQ(ierr);
131f3334a03SStefano Zampini       if (!flg) {
132f3334a03SStefano Zampini         ierr = PetscTestFile(dir,'r',&flg);CHKERRQ(ierr);
133*98921bdaSJacob Faibussowitsch         if (flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Specified path is a file - not a dir: %s",dir);
134f3334a03SStefano Zampini         ierr = PetscMkdir(dir);CHKERRQ(ierr);
135*98921bdaSJacob Faibussowitsch       } else SETERRQ(comm,PETSC_ERR_SUP,"Directory %s not empty",tj->dirname);
136f3334a03SStefano Zampini     }
1378a10d460SHong Zhang   }
138f3334a03SStefano Zampini   ierr = PetscBarrier((PetscObject)tj);CHKERRQ(ierr);
139f3334a03SStefano Zampini   PetscFunctionReturn(0);
140f3334a03SStefano Zampini }
141f3334a03SStefano Zampini 
14264fc91eeSBarry Smith static PetscErrorCode TSTrajectoryDestroy_Basic(TSTrajectory tj)
14364fc91eeSBarry Smith {
144f3334a03SStefano Zampini   TSTrajectory_Basic *tjbasic = (TSTrajectory_Basic*)tj->data;
14564fc91eeSBarry Smith   PetscErrorCode     ierr;
14664fc91eeSBarry Smith 
14764fc91eeSBarry Smith   PetscFunctionBegin;
148f3334a03SStefano Zampini   ierr = PetscViewerDestroy(&tjbasic->viewer);CHKERRQ(ierr);
149f3334a03SStefano Zampini   ierr = PetscFree(tjbasic);CHKERRQ(ierr);
15064fc91eeSBarry Smith   PetscFunctionReturn(0);
15164fc91eeSBarry Smith }
15264fc91eeSBarry Smith 
153bc952696SBarry Smith /*MC
15478fbdcc8SBarry Smith       TSTRAJECTORYBASIC - Stores each solution of the ODE/DAE in a file
15578fbdcc8SBarry Smith 
1568e5aa403SBarry Smith       Saves each timestep into a separate file named TS-data-XXXXXX/TS-%06d.bin. The file name can be changed.
15778fbdcc8SBarry Smith 
15878fbdcc8SBarry Smith       This version saves the solutions at all the stages
15978fbdcc8SBarry Smith 
16078fbdcc8SBarry Smith       $PETSC_DIR/share/petsc/matlab/PetscReadBinaryTrajectory.m can read in files created with this format
161bc952696SBarry Smith 
162bc952696SBarry Smith   Level: intermediate
163bc952696SBarry Smith 
16464e38db7SHong Zhang .seealso:  TSTrajectoryCreate(), TS, TSTrajectorySetType(), TSTrajectorySetDirname(), TSTrajectorySetFile()
165bc952696SBarry Smith 
166bc952696SBarry Smith M*/
167c3df6c96SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory tj,TS ts)
168bc952696SBarry Smith {
169f3334a03SStefano Zampini   TSTrajectory_Basic *tjbasic;
170f3334a03SStefano Zampini   PetscErrorCode     ierr;
171f3334a03SStefano Zampini 
172bc952696SBarry Smith   PetscFunctionBegin;
173f3334a03SStefano Zampini   ierr = PetscNew(&tjbasic);CHKERRQ(ierr);
174f3334a03SStefano Zampini 
175f3334a03SStefano Zampini   ierr = PetscViewerCreate(PetscObjectComm((PetscObject)tj),&tjbasic->viewer);CHKERRQ(ierr);
176f3334a03SStefano Zampini   ierr = PetscViewerSetType(tjbasic->viewer,PETSCVIEWERBINARY);CHKERRQ(ierr);
177f3334a03SStefano Zampini   ierr = PetscViewerPushFormat(tjbasic->viewer,PETSC_VIEWER_NATIVE);CHKERRQ(ierr);
178f3334a03SStefano Zampini   ierr = PetscViewerFileSetMode(tjbasic->viewer,FILE_MODE_WRITE);CHKERRQ(ierr);
179f3334a03SStefano Zampini   tj->data = tjbasic;
180f3334a03SStefano Zampini 
18152fbb9a2SHong Zhang   tj->ops->set            = TSTrajectorySet_Basic;
18252fbb9a2SHong Zhang   tj->ops->get            = TSTrajectoryGet_Basic;
183f3334a03SStefano Zampini   tj->ops->setup          = TSTrajectorySetUp_Basic;
18464fc91eeSBarry Smith   tj->ops->destroy        = TSTrajectoryDestroy_Basic;
185f3334a03SStefano Zampini   tj->ops->setfromoptions = TSTrajectorySetFromOptions_Basic;
186bc952696SBarry Smith   PetscFunctionReturn(0);
187bc952696SBarry Smith }
188