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; 7bc952696SBarry Smith 8560360afSLisandro Dalcin static PetscErrorCode TSTrajectorySet_Basic(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X) 9bc952696SBarry Smith { 10f3334a03SStefano Zampini TSTrajectory_Basic *tjbasic = (TSTrajectory_Basic*)tj->data; 119afe7f3eSBarry Smith char filename[PETSC_MAX_PATH_LEN]; 126affb6f8SHong Zhang PetscInt ns,i; 13bc952696SBarry Smith PetscErrorCode ierr; 146cd0a353SHong Zhang 1522a86ba0SHong Zhang PetscFunctionBegin; 169afe7f3eSBarry Smith ierr = PetscSNPrintf(filename,sizeof(filename),tj->dirfiletemplate,stepnum);CHKERRQ(ierr); 17ac1a7491SHong Zhang ierr = PetscViewerFileSetName(tjbasic->viewer,filename);CHKERRQ(ierr); /* this triggers PetscViewer to be set up again */ 18f3334a03SStefano Zampini ierr = PetscViewerSetUp(tjbasic->viewer);CHKERRQ(ierr); 19f3334a03SStefano Zampini ierr = VecView(X,tjbasic->viewer);CHKERRQ(ierr); 20f3334a03SStefano Zampini ierr = PetscViewerBinaryWrite(tjbasic->viewer,&time,1,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr); 21f3334a03SStefano Zampini if (stepnum && !tj->solution_only) { 22f3334a03SStefano Zampini Vec *Y; 23f3334a03SStefano Zampini PetscReal tprev; 24bc952696SBarry Smith 25c679fc15SHong Zhang ierr = TSGetStages(ts,&ns,&Y);CHKERRQ(ierr); 26bc952696SBarry Smith for (i=0; i<ns; i++) { 27f3334a03SStefano Zampini ierr = VecView(Y[i],tjbasic->viewer);CHKERRQ(ierr); 28f3334a03SStefano Zampini } 29f3334a03SStefano Zampini ierr = TSGetPrevTime(ts,&tprev);CHKERRQ(ierr); 30f3334a03SStefano Zampini ierr = PetscViewerBinaryWrite(tjbasic->viewer,&tprev,1,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr); 31f3334a03SStefano Zampini } 326affb6f8SHong Zhang /* Tangent linear sensitivities needed by second-order adjoint */ 336affb6f8SHong Zhang if (ts->forward_solve) { 346affb6f8SHong Zhang Mat A,*S; 356affb6f8SHong Zhang 366affb6f8SHong Zhang ierr = TSForwardGetSensitivities(ts,NULL,&A);CHKERRQ(ierr); 376affb6f8SHong Zhang ierr = MatView(A,tjbasic->viewer);CHKERRQ(ierr); 386affb6f8SHong Zhang if (stepnum) { 396affb6f8SHong Zhang ierr = TSForwardGetStages(ts,&ns,&S);CHKERRQ(ierr); 406affb6f8SHong Zhang for (i=0; i<ns; i++) { 416affb6f8SHong Zhang ierr = MatView(S[i],tjbasic->viewer);CHKERRQ(ierr); 426affb6f8SHong Zhang } 436affb6f8SHong Zhang } 446affb6f8SHong Zhang } 45f3334a03SStefano Zampini PetscFunctionReturn(0); 46bc952696SBarry Smith } 47bc952696SBarry Smith 48f3334a03SStefano Zampini static PetscErrorCode TSTrajectorySetFromOptions_Basic(PetscOptionItems *PetscOptionsObject,TSTrajectory tj) 49f3334a03SStefano Zampini { 50f3334a03SStefano Zampini PetscErrorCode ierr; 51c679fc15SHong Zhang 52f3334a03SStefano Zampini PetscFunctionBegin; 53f3334a03SStefano Zampini ierr = PetscOptionsHead(PetscOptionsObject,"TS trajectory options for Basic type");CHKERRQ(ierr); 54f3334a03SStefano Zampini ierr = PetscOptionsTail();CHKERRQ(ierr); 55bc952696SBarry Smith PetscFunctionReturn(0); 56bc952696SBarry Smith } 57bc952696SBarry Smith 58560360afSLisandro Dalcin static PetscErrorCode TSTrajectoryGet_Basic(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *t) 59bc952696SBarry Smith { 60bc952696SBarry Smith PetscViewer viewer; 619afe7f3eSBarry Smith char filename[PETSC_MAX_PATH_LEN]; 62bc952696SBarry Smith PetscErrorCode ierr; 63f3334a03SStefano Zampini Vec Sol; 646affb6f8SHong Zhang PetscInt ns,i; 656cd0a353SHong Zhang 6622a86ba0SHong Zhang PetscFunctionBegin; 67f3334a03SStefano Zampini ierr = PetscSNPrintf(filename,sizeof(filename),tj->dirfiletemplate,stepnum);CHKERRQ(ierr); 68*8a10d460SHong Zhang ierr = PetscViewerBinaryOpen(PetscObjectComm((PetscObject)tj),filename,FILE_MODE_READ,&viewer);CHKERRQ(ierr); 69bc952696SBarry Smith ierr = TSGetSolution(ts,&Sol);CHKERRQ(ierr); 70f3334a03SStefano Zampini ierr = PetscViewerPushFormat(viewer,PETSC_VIEWER_NATIVE);CHKERRQ(ierr); 71bc952696SBarry Smith ierr = VecLoad(Sol,viewer);CHKERRQ(ierr); 72c679fc15SHong Zhang ierr = PetscViewerBinaryRead(viewer,t,1,NULL,PETSC_REAL);CHKERRQ(ierr); 73ac1a7491SHong Zhang if (stepnum && !tj->solution_only) { 74f3334a03SStefano Zampini Vec *Y; 75f3334a03SStefano Zampini PetscReal timepre; 76bc952696SBarry Smith 776affb6f8SHong Zhang ierr = TSGetStages(ts,&ns,&Y);CHKERRQ(ierr); 786affb6f8SHong Zhang for (i=0; i<ns; i++) { 79bc952696SBarry Smith ierr = VecLoad(Y[i],viewer);CHKERRQ(ierr); 80bc952696SBarry Smith } 81c679fc15SHong Zhang ierr = PetscViewerBinaryRead(viewer,&timepre,1,NULL,PETSC_REAL);CHKERRQ(ierr); 82f3334a03SStefano Zampini if (tj->adjoint_solve_mode) { 83acaebbb6SHong Zhang ierr = TSSetTimeStep(ts,-(*t)+timepre);CHKERRQ(ierr); 8426656371SHong Zhang } 85f3334a03SStefano Zampini } 866affb6f8SHong Zhang /* Tangent linear sensitivities needed by second-order adjoint */ 876affb6f8SHong Zhang if (ts->forward_solve) { 886affb6f8SHong Zhang Mat A,*S; 896affb6f8SHong Zhang 906affb6f8SHong Zhang ierr = TSForwardGetSensitivities(ts,NULL,&A);CHKERRQ(ierr); 916affb6f8SHong Zhang ierr = MatLoad(A,viewer);CHKERRQ(ierr); 926affb6f8SHong Zhang if (stepnum) { 936affb6f8SHong Zhang ierr = TSForwardGetStages(ts,&ns,&S);CHKERRQ(ierr); 946affb6f8SHong Zhang for (i=0; i<ns; i++) { 956affb6f8SHong Zhang ierr = MatLoad(S[i],viewer);CHKERRQ(ierr); 966affb6f8SHong Zhang } 976affb6f8SHong Zhang } 986affb6f8SHong Zhang } 9926656371SHong Zhang ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 100bc952696SBarry Smith PetscFunctionReturn(0); 101bc952696SBarry Smith } 102bc952696SBarry Smith 103*8a10d460SHong Zhang PetscErrorCode TSTrajectorySetUp_Basic(TSTrajectory tj,TS ts) 104f3334a03SStefano Zampini { 105f3334a03SStefano Zampini MPI_Comm comm; 106f3334a03SStefano Zampini PetscMPIInt rank; 107f3334a03SStefano Zampini PetscErrorCode ierr; 108f3334a03SStefano Zampini 109f3334a03SStefano Zampini PetscFunctionBegin; 110f3334a03SStefano Zampini ierr = PetscObjectGetComm((PetscObject)tj,&comm);CHKERRQ(ierr); 111f3334a03SStefano Zampini ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 112f3334a03SStefano Zampini if (!rank) { 113*8a10d460SHong Zhang char *dir = tj->dirname; 114f3334a03SStefano Zampini PetscBool flg; 115f3334a03SStefano Zampini 116*8a10d460SHong Zhang if (!dir) { 117*8a10d460SHong Zhang char dtempname[16] = "TS-data-XXXXXX"; 118*8a10d460SHong Zhang ierr = PetscMkdtemp(dtempname);CHKERRQ(ierr); 119*8a10d460SHong Zhang ierr = PetscStrallocpy(dtempname,&tj->dirname);CHKERRQ(ierr); 120*8a10d460SHong Zhang } else { 121f3334a03SStefano Zampini ierr = PetscTestDirectory(dir,'w',&flg);CHKERRQ(ierr); 122f3334a03SStefano Zampini if (!flg) { 123f3334a03SStefano Zampini ierr = PetscTestFile(dir,'r',&flg);CHKERRQ(ierr); 124f3334a03SStefano Zampini if (flg) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_USER,"Specified path is a file - not a dir: %s",dir); 125f3334a03SStefano Zampini ierr = PetscMkdir(dir);CHKERRQ(ierr); 1268946c185SHong Zhang } else SETERRQ1(comm,PETSC_ERR_SUP,"Directory %s not empty",tj->dirname); 127f3334a03SStefano Zampini } 128*8a10d460SHong Zhang } 129f3334a03SStefano Zampini ierr = PetscBarrier((PetscObject)tj);CHKERRQ(ierr); 130f3334a03SStefano Zampini PetscFunctionReturn(0); 131f3334a03SStefano Zampini } 132f3334a03SStefano Zampini 13364fc91eeSBarry Smith static PetscErrorCode TSTrajectoryDestroy_Basic(TSTrajectory tj) 13464fc91eeSBarry Smith { 135f3334a03SStefano Zampini TSTrajectory_Basic *tjbasic = (TSTrajectory_Basic*)tj->data; 13664fc91eeSBarry Smith PetscErrorCode ierr; 13764fc91eeSBarry Smith 13864fc91eeSBarry Smith PetscFunctionBegin; 139f3334a03SStefano Zampini ierr = PetscViewerDestroy(&tjbasic->viewer);CHKERRQ(ierr); 140f3334a03SStefano Zampini ierr = PetscFree(tjbasic);CHKERRQ(ierr); 14164fc91eeSBarry Smith PetscFunctionReturn(0); 14264fc91eeSBarry Smith } 14364fc91eeSBarry Smith 144bc952696SBarry Smith /*MC 14578fbdcc8SBarry Smith TSTRAJECTORYBASIC - Stores each solution of the ODE/DAE in a file 14678fbdcc8SBarry Smith 147*8a10d460SHong Zhang Saves each timestep into a seperate file named TS-data-XXXXXX/TS-%06d.bin. The file name can be changed. 14878fbdcc8SBarry Smith 14978fbdcc8SBarry Smith This version saves the solutions at all the stages 15078fbdcc8SBarry Smith 15178fbdcc8SBarry Smith $PETSC_DIR/share/petsc/matlab/PetscReadBinaryTrajectory.m can read in files created with this format 152bc952696SBarry Smith 153bc952696SBarry Smith Level: intermediate 154bc952696SBarry Smith 15564e38db7SHong Zhang .seealso: TSTrajectoryCreate(), TS, TSTrajectorySetType(), TSTrajectorySetDirname(), TSTrajectorySetFile() 156bc952696SBarry Smith 157bc952696SBarry Smith M*/ 158c3df6c96SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory tj,TS ts) 159bc952696SBarry Smith { 160f3334a03SStefano Zampini TSTrajectory_Basic *tjbasic; 161f3334a03SStefano Zampini PetscErrorCode ierr; 162f3334a03SStefano Zampini 163bc952696SBarry Smith PetscFunctionBegin; 164f3334a03SStefano Zampini ierr = PetscNew(&tjbasic);CHKERRQ(ierr); 165f3334a03SStefano Zampini 166f3334a03SStefano Zampini ierr = PetscViewerCreate(PetscObjectComm((PetscObject)tj),&tjbasic->viewer);CHKERRQ(ierr); 167f3334a03SStefano Zampini ierr = PetscViewerSetType(tjbasic->viewer,PETSCVIEWERBINARY);CHKERRQ(ierr); 168f3334a03SStefano Zampini ierr = PetscViewerPushFormat(tjbasic->viewer,PETSC_VIEWER_NATIVE);CHKERRQ(ierr); 169f3334a03SStefano Zampini ierr = PetscViewerFileSetMode(tjbasic->viewer,FILE_MODE_WRITE);CHKERRQ(ierr); 170f3334a03SStefano Zampini tj->data = tjbasic; 171f3334a03SStefano Zampini 17252fbb9a2SHong Zhang tj->ops->set = TSTrajectorySet_Basic; 17352fbb9a2SHong Zhang tj->ops->get = TSTrajectoryGet_Basic; 174f3334a03SStefano Zampini tj->ops->setup = TSTrajectorySetUp_Basic; 17564fc91eeSBarry Smith tj->ops->destroy = TSTrajectoryDestroy_Basic; 176f3334a03SStefano Zampini tj->ops->setfromoptions = TSTrajectorySetFromOptions_Basic; 177bc952696SBarry Smith PetscFunctionReturn(0); 178bc952696SBarry Smith } 179