12b043167SHong Zhang 22b043167SHong Zhang #include <petsc/private/tsimpl.h> /*I "petscts.h" I*/ 32b043167SHong Zhang 478fbdcc8SBarry Smith static PetscErrorCode OutputBIN(MPI_Comm comm,const char *filename,PetscViewer *viewer) 52b043167SHong Zhang { 62b043167SHong Zhang PetscErrorCode ierr; 72b043167SHong Zhang 82b043167SHong Zhang PetscFunctionBegin; 92b043167SHong Zhang ierr = PetscViewerCreate(PETSC_COMM_WORLD,viewer);CHKERRQ(ierr); 102b043167SHong Zhang ierr = PetscViewerSetType(*viewer,PETSCVIEWERBINARY);CHKERRQ(ierr); 112b043167SHong Zhang ierr = PetscViewerFileSetMode(*viewer,FILE_MODE_WRITE);CHKERRQ(ierr); 122b043167SHong Zhang ierr = PetscViewerFileSetName(*viewer,filename);CHKERRQ(ierr); 132b043167SHong Zhang PetscFunctionReturn(0); 142b043167SHong Zhang } 152b043167SHong Zhang 16560360afSLisandro Dalcin static PetscErrorCode TSTrajectorySet_Visualization(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X) 172b043167SHong Zhang { 182b043167SHong Zhang PetscViewer viewer; 192b043167SHong Zhang char filename[PETSC_MAX_PATH_LEN]; 202b043167SHong Zhang PetscReal tprev; 212b043167SHong Zhang PetscErrorCode ierr; 2278fbdcc8SBarry Smith MPI_Comm comm; 232b043167SHong Zhang 242b043167SHong Zhang PetscFunctionBegin; 2578fbdcc8SBarry Smith ierr = PetscObjectGetComm((PetscObject)ts,&comm);CHKERRQ(ierr); 262b043167SHong Zhang ierr = TSGetTotalSteps(ts,&stepnum);CHKERRQ(ierr); 272b043167SHong Zhang if (stepnum == 0) { 282b043167SHong Zhang PetscMPIInt rank; 2978fbdcc8SBarry Smith ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 302b043167SHong Zhang if (!rank) { 312b043167SHong Zhang ierr = PetscRMTree("Visualization-data");CHKERRQ(ierr); 322b043167SHong Zhang ierr = PetscMkdir("Visualization-data");CHKERRQ(ierr); 332b043167SHong Zhang } 3478fbdcc8SBarry Smith if (tj->names) { 3578fbdcc8SBarry Smith PetscViewer bnames; 3678fbdcc8SBarry Smith ierr = PetscViewerBinaryOpen(comm,"Visualization-data/variablenames",FILE_MODE_WRITE,&bnames);CHKERRQ(ierr); 3778fbdcc8SBarry Smith ierr = PetscViewerBinaryWriteStringArray(bnames,(const char *const *)tj->names);CHKERRQ(ierr); 3878fbdcc8SBarry Smith ierr = PetscViewerDestroy(&bnames);CHKERRQ(ierr); 3978fbdcc8SBarry Smith } 402b043167SHong Zhang ierr = PetscSNPrintf(filename,sizeof(filename),"Visualization-data/SA-%06d.bin",stepnum);CHKERRQ(ierr); 4178fbdcc8SBarry Smith ierr = OutputBIN(comm,filename,&viewer);CHKERRQ(ierr); 42*08347785SBarry Smith if (!tj->transform) { 432b043167SHong Zhang ierr = VecView(X,viewer);CHKERRQ(ierr); 44*08347785SBarry Smith } else { 45*08347785SBarry Smith Vec XX; 46*08347785SBarry Smith ierr = (*tj->transform)(tj->transformctx,X,&XX);CHKERRQ(ierr); 47*08347785SBarry Smith ierr = VecView(XX,viewer);CHKERRQ(ierr); 48*08347785SBarry Smith ierr = VecDestroy(&XX); 49*08347785SBarry Smith } 502b043167SHong Zhang ierr = PetscViewerBinaryWrite(viewer,&time,1,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr); 512b043167SHong Zhang ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 522b043167SHong Zhang PetscFunctionReturn(0); 532b043167SHong Zhang } 542b043167SHong Zhang ierr = PetscSNPrintf(filename,sizeof(filename),"Visualization-data/SA-%06d.bin",stepnum);CHKERRQ(ierr); 5578fbdcc8SBarry Smith ierr = OutputBIN(comm,filename,&viewer);CHKERRQ(ierr); 56*08347785SBarry Smith if (!tj->transform) { 572b043167SHong Zhang ierr = VecView(X,viewer);CHKERRQ(ierr); 58*08347785SBarry Smith } else { 59*08347785SBarry Smith Vec XX; 60*08347785SBarry Smith ierr = (*tj->transform)(tj->transformctx,X,&XX);CHKERRQ(ierr); 61*08347785SBarry Smith ierr = VecView(XX,viewer);CHKERRQ(ierr); 62*08347785SBarry Smith ierr = VecDestroy(&XX); 63*08347785SBarry Smith } 642b043167SHong Zhang ierr = PetscViewerBinaryWrite(viewer,&time,1,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr); 652b043167SHong Zhang 662b043167SHong Zhang ierr = TSGetPrevTime(ts,&tprev);CHKERRQ(ierr); 672b043167SHong Zhang ierr = PetscViewerBinaryWrite(viewer,&tprev,1,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr); 682b043167SHong Zhang 692b043167SHong Zhang ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 702b043167SHong Zhang PetscFunctionReturn(0); 712b043167SHong Zhang } 722b043167SHong Zhang 732b043167SHong Zhang /*MC 745c9db295SHong Zhang TSTRAJECTORYVISUALIZATION - Stores each solution of the ODE/DAE in a file 752b043167SHong Zhang 7678fbdcc8SBarry Smith Saves each timestep into a seperate file in Visualization-data/SA-%06d.bin 7778fbdcc8SBarry Smith 7878fbdcc8SBarry Smith This version saves only the solutions at each timestep, it does not save the solution at each stage, 7978fbdcc8SBarry Smith see TSTRAJECTORYBASIC that saves all stages 8078fbdcc8SBarry Smith 8178fbdcc8SBarry Smith $PETSC_DIR/share/petsc/matlab/PetscReadBinaryTrajectory.m and $PETSC_DIR/bin/PetscBinaryIOTrajectory.py 8278fbdcc8SBarry Smith can read in files created with this format into MATLAB and Python. 8378fbdcc8SBarry Smith 842b043167SHong Zhang Level: intermediate 852b043167SHong Zhang 8678fbdcc8SBarry Smith .seealso: TSTrajectoryCreate(), TS, TSTrajectorySetType(), TSTrajectoryType, TSTrajectorySetVariableNames() 872b043167SHong Zhang 882b043167SHong Zhang M*/ 892b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory tj,TS ts) 902b043167SHong Zhang { 912b043167SHong Zhang PetscFunctionBegin; 922b043167SHong Zhang tj->ops->set = TSTrajectorySet_Visualization; 932b043167SHong Zhang PetscFunctionReturn(0); 942b043167SHong Zhang } 95