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