1 2 #include <petsc/private/tsimpl.h> /*I "petscts.h" I*/ 3 4 typedef struct { 5 PetscViewer viewer; 6 } TSTrajectory_Basic; 7 8 static PetscErrorCode TSTrajectorySet_Basic(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X) 9 { 10 TSTrajectory_Basic *tjbasic = (TSTrajectory_Basic*)tj->data; 11 char filename[PETSC_MAX_PATH_LEN]; 12 PetscInt ns,i; 13 PetscErrorCode ierr; 14 15 PetscFunctionBegin; 16 ierr = PetscSNPrintf(filename,sizeof(filename),tj->dirfiletemplate,stepnum);CHKERRQ(ierr); 17 ierr = PetscViewerFileSetName(tjbasic->viewer,filename);CHKERRQ(ierr); /* this triggers PetscViewer to be set up again */ 18 ierr = PetscViewerSetUp(tjbasic->viewer);CHKERRQ(ierr); 19 ierr = VecView(X,tjbasic->viewer);CHKERRQ(ierr); 20 ierr = PetscViewerBinaryWrite(tjbasic->viewer,&time,1,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr); 21 if (stepnum && !tj->solution_only) { 22 Vec *Y; 23 PetscReal tprev; 24 25 ierr = TSGetStages(ts,&ns,&Y);CHKERRQ(ierr); 26 for (i=0; i<ns; i++) { 27 ierr = VecView(Y[i],tjbasic->viewer);CHKERRQ(ierr); 28 } 29 ierr = TSGetPrevTime(ts,&tprev);CHKERRQ(ierr); 30 ierr = PetscViewerBinaryWrite(tjbasic->viewer,&tprev,1,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr); 31 } 32 /* Tangent linear sensitivities needed by second-order adjoint */ 33 if (ts->forward_solve) { 34 Mat A,*S; 35 36 ierr = TSForwardGetSensitivities(ts,NULL,&A);CHKERRQ(ierr); 37 ierr = MatView(A,tjbasic->viewer);CHKERRQ(ierr); 38 if (stepnum) { 39 ierr = TSForwardGetStages(ts,&ns,&S);CHKERRQ(ierr); 40 for (i=0; i<ns; i++) { 41 ierr = MatView(S[i],tjbasic->viewer);CHKERRQ(ierr); 42 } 43 } 44 } 45 PetscFunctionReturn(0); 46 } 47 48 static PetscErrorCode TSTrajectorySetFromOptions_Basic(PetscOptionItems *PetscOptionsObject,TSTrajectory tj) 49 { 50 PetscErrorCode ierr; 51 52 PetscFunctionBegin; 53 ierr = PetscOptionsHead(PetscOptionsObject,"TS trajectory options for Basic type");CHKERRQ(ierr); 54 ierr = PetscOptionsTail();CHKERRQ(ierr); 55 PetscFunctionReturn(0); 56 } 57 58 static PetscErrorCode TSTrajectoryGet_Basic(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *t) 59 { 60 PetscViewer viewer; 61 char filename[PETSC_MAX_PATH_LEN]; 62 PetscErrorCode ierr; 63 Vec Sol; 64 PetscInt ns,i; 65 66 PetscFunctionBegin; 67 ierr = PetscSNPrintf(filename,sizeof(filename),tj->dirfiletemplate,stepnum);CHKERRQ(ierr); 68 ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,filename,FILE_MODE_READ,&viewer);CHKERRQ(ierr); 69 ierr = TSGetSolution(ts,&Sol);CHKERRQ(ierr); 70 ierr = PetscViewerPushFormat(viewer,PETSC_VIEWER_NATIVE);CHKERRQ(ierr); 71 ierr = VecLoad(Sol,viewer);CHKERRQ(ierr); 72 ierr = PetscViewerBinaryRead(viewer,t,1,NULL,PETSC_REAL);CHKERRQ(ierr); 73 if (stepnum && !tj->solution_only) { 74 Vec *Y; 75 PetscReal timepre; 76 77 ierr = TSGetStages(ts,&ns,&Y);CHKERRQ(ierr); 78 for (i=0; i<ns; i++) { 79 ierr = VecLoad(Y[i],viewer);CHKERRQ(ierr); 80 } 81 ierr = PetscViewerBinaryRead(viewer,&timepre,1,NULL,PETSC_REAL);CHKERRQ(ierr); 82 if (tj->adjoint_solve_mode) { 83 ierr = TSSetTimeStep(ts,-(*t)+timepre);CHKERRQ(ierr); 84 } 85 } 86 /* Tangent linear sensitivities needed by second-order adjoint */ 87 if (ts->forward_solve) { 88 Mat A,*S; 89 90 ierr = TSForwardGetSensitivities(ts,NULL,&A);CHKERRQ(ierr); 91 ierr = MatLoad(A,viewer);CHKERRQ(ierr); 92 if (stepnum) { 93 ierr = TSForwardGetStages(ts,&ns,&S);CHKERRQ(ierr); 94 for (i=0; i<ns; i++) { 95 ierr = MatLoad(S[i],viewer);CHKERRQ(ierr); 96 } 97 } 98 } 99 ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 100 PetscFunctionReturn(0); 101 } 102 103 static PetscErrorCode TSTrajectorySetUp_Basic(TSTrajectory tj,TS ts) 104 { 105 MPI_Comm comm; 106 PetscMPIInt rank; 107 PetscErrorCode ierr; 108 109 PetscFunctionBegin; 110 ierr = PetscObjectGetComm((PetscObject)tj,&comm);CHKERRQ(ierr); 111 ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 112 if (!rank) { 113 const char* dir = tj->dirname; 114 PetscBool flg; 115 116 /* I don't like running PetscRMTree on a directory */ 117 ierr = PetscTestDirectory(dir,'w',&flg);CHKERRQ(ierr); 118 if (!flg) { 119 ierr = PetscTestFile(dir,'r',&flg);CHKERRQ(ierr); 120 if (flg) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_USER,"Specified path is a file - not a dir: %s",dir); 121 ierr = PetscMkdir(dir);CHKERRQ(ierr); 122 } else { 123 ierr = PetscRMTree(tj->dirname);CHKERRQ(ierr); /* avoid having to delete the folder manually */ 124 } 125 } 126 ierr = PetscBarrier((PetscObject)tj);CHKERRQ(ierr); 127 PetscFunctionReturn(0); 128 } 129 130 static PetscErrorCode TSTrajectoryDestroy_Basic(TSTrajectory tj) 131 { 132 TSTrajectory_Basic *tjbasic = (TSTrajectory_Basic*)tj->data; 133 PetscErrorCode ierr; 134 135 PetscFunctionBegin; 136 ierr = PetscViewerDestroy(&tjbasic->viewer);CHKERRQ(ierr); 137 ierr = PetscFree(tjbasic);CHKERRQ(ierr); 138 PetscFunctionReturn(0); 139 } 140 141 /*MC 142 TSTRAJECTORYBASIC - Stores each solution of the ODE/DAE in a file 143 144 Saves each timestep into a seperate file named SA-data/SA-%06d.bin. The file name can be changed. 145 146 This version saves the solutions at all the stages 147 148 $PETSC_DIR/share/petsc/matlab/PetscReadBinaryTrajectory.m can read in files created with this format 149 150 Level: intermediate 151 152 .seealso: TSTrajectoryCreate(), TS, TSTrajectorySetType(), TSTrajectorySetDirname(), TSTrajectorySetFile() 153 154 M*/ 155 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory tj,TS ts) 156 { 157 TSTrajectory_Basic *tjbasic; 158 PetscErrorCode ierr; 159 160 PetscFunctionBegin; 161 ierr = PetscNew(&tjbasic);CHKERRQ(ierr); 162 163 ierr = PetscViewerCreate(PetscObjectComm((PetscObject)tj),&tjbasic->viewer);CHKERRQ(ierr); 164 ierr = PetscViewerSetType(tjbasic->viewer,PETSCVIEWERBINARY);CHKERRQ(ierr); 165 ierr = PetscViewerPushFormat(tjbasic->viewer,PETSC_VIEWER_NATIVE);CHKERRQ(ierr); 166 ierr = PetscViewerFileSetMode(tjbasic->viewer,FILE_MODE_WRITE);CHKERRQ(ierr); 167 tj->data = tjbasic; 168 169 tj->ops->set = TSTrajectorySet_Basic; 170 tj->ops->get = TSTrajectoryGet_Basic; 171 tj->ops->setup = TSTrajectorySetUp_Basic; 172 tj->ops->destroy = TSTrajectoryDestroy_Basic; 173 tj->ops->setfromoptions = TSTrajectorySetFromOptions_Basic; 174 PetscFunctionReturn(0); 175 } 176