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