PetscErrorCode TSTrajectoryGet_Basic(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *t) { Vec Sol,*Y; PetscInt Nr,i; PetscViewer viewer; PetscReal timepre; char filename[PETSC_MAX_PATH_LEN]; PetscErrorCode ierr; PetscFunctionBegin; ierr = TSGetTotalSteps(ts,&stepnum);CHKERRQ(ierr); ierr = PetscSNPrintf(filename,sizeof filename,"SA-data/SA-%06d.bin",stepnum);CHKERRQ(ierr); ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,filename,FILE_MODE_READ,&viewer);CHKERRQ(ierr); ierr = TSGetSolution(ts,&Sol);CHKERRQ(ierr); ierr = VecLoad(Sol,viewer);CHKERRQ(ierr); ierr = PetscViewerBinaryRead(viewer,t,1,NULL,PETSC_REAL);CHKERRQ(ierr); if (stepnum != 0) { ierr = TSGetStages(ts,&Nr,&Y);CHKERRQ(ierr); for (i=0;i<Nr ;i++) { ierr = VecLoad(Y[i],viewer);CHKERRQ(ierr); } ierr = PetscViewerBinaryRead(viewer,&timepre,1,NULL,PETSC_REAL);CHKERRQ(ierr); ierr = TSSetTimeStep(ts,-(*t)+timepre);CHKERRQ(ierr); } ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode TSTrajectorySet_Basic(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X) { PetscViewer viewer; PetscInt ns,i; Vec *Y; char filename[PETSC_MAX_PATH_LEN]; PetscReal tprev; PetscErrorCode ierr; PetscFunctionBegin; ierr = TSGetTotalSteps(ts,&stepnum);CHKERRQ(ierr); if (stepnum == 0) { PetscMPIInt rank; ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)ts),&rank);CHKERRQ(ierr); if (!rank) { ierr = PetscRMTree("SA-data");CHKERRQ(ierr); ierr = PetscMkdir("SA-data");CHKERRQ(ierr); } ierr = PetscSNPrintf(filename,sizeof(filename),"SA-data/SA-%06d.bin",stepnum);CHKERRQ(ierr); ierr = OutputBIN(filename,&viewer);CHKERRQ(ierr); ierr = VecView(X,viewer);CHKERRQ(ierr); ierr = PetscViewerBinaryWrite(viewer,&time,1,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr); ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); PetscFunctionReturn(0); } ierr = PetscSNPrintf(filename,sizeof(filename),"SA-data/SA-%06d.bin",stepnum);CHKERRQ(ierr); ierr = OutputBIN(filename,&viewer);CHKERRQ(ierr); ierr = VecView(X,viewer);CHKERRQ(ierr); ierr = PetscViewerBinaryWrite(viewer,&time,1,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr); ierr = TSGetStages(ts,&ns,&Y);CHKERRQ(ierr); for (i=0;i<ns;i++) { ierr = VecView(Y[i],viewer);CHKERRQ(ierr); } ierr = TSGetPrevTime(ts,&tprev);CHKERRQ(ierr); ierr = PetscViewerBinaryWrite(viewer,&tprev,1,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr); ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); PetscFunctionReturn(0); }
static PetscErrorCode MonitorUpdateQ(TS ts,PetscInt stepnum,PetscReal time,Vec X,void *ctx0) { PetscErrorCode ierr; Vec C,*Y; PetscInt Nr; PetscReal h,theta; Userctx *ctx=(Userctx*)ctx0; PetscFunctionBegin; theta = 0.5; ierr = TSGetStages(ts,&Nr,&Y);CHKERRQ(ierr); ierr = TSGetTimeStep(ts,&h);CHKERRQ(ierr); ierr = VecDuplicate(ctx->vec_q,&C);CHKERRQ(ierr); /* compute integrals */ if (stepnum>0) { ierr = CostIntegrand(ts,time,X,C,ctx);CHKERRQ(ierr); ierr = VecAXPY(ctx->vec_q,h*theta,C);CHKERRQ(ierr); ierr = CostIntegrand(ts,time+h*theta,Y[0],C,ctx);CHKERRQ(ierr); ierr = VecAXPY(ctx->vec_q,h*(1-theta),C);CHKERRQ(ierr); } ierr = VecDestroy(&C);CHKERRQ(ierr); PetscFunctionReturn(0); }