1 2 #include <petsc/private/tsimpl.h> /*I "petscts.h" I*/ 3 4 static PetscErrorCode OutputBIN(MPI_Comm comm,const char *filename,PetscViewer *viewer) 5 { 6 PetscErrorCode ierr; 7 8 PetscFunctionBegin; 9 ierr = PetscViewerCreate(PETSC_COMM_WORLD,viewer);CHKERRQ(ierr); 10 ierr = PetscViewerSetType(*viewer,PETSCVIEWERBINARY);CHKERRQ(ierr); 11 ierr = PetscViewerFileSetMode(*viewer,FILE_MODE_WRITE);CHKERRQ(ierr); 12 ierr = PetscViewerFileSetName(*viewer,filename);CHKERRQ(ierr); 13 PetscFunctionReturn(0); 14 } 15 16 static PetscErrorCode TSTrajectorySet_Visualization(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X) 17 { 18 PetscViewer viewer; 19 char filename[PETSC_MAX_PATH_LEN]; 20 PetscReal tprev; 21 PetscErrorCode ierr; 22 MPI_Comm comm; 23 24 PetscFunctionBegin; 25 ierr = PetscObjectGetComm((PetscObject)ts,&comm);CHKERRQ(ierr); 26 ierr = TSGetTotalSteps(ts,&stepnum);CHKERRQ(ierr); 27 if (stepnum == 0) { 28 PetscMPIInt rank; 29 ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 30 if (!rank) { 31 ierr = PetscRMTree("Visualization-data");CHKERRQ(ierr); 32 ierr = PetscMkdir("Visualization-data");CHKERRQ(ierr); 33 } 34 if (tj->names) { 35 PetscViewer bnames; 36 ierr = PetscViewerBinaryOpen(comm,"Visualization-data/variablenames",FILE_MODE_WRITE,&bnames);CHKERRQ(ierr); 37 ierr = PetscViewerBinaryWriteStringArray(bnames,(const char *const *)tj->names);CHKERRQ(ierr); 38 ierr = PetscViewerDestroy(&bnames);CHKERRQ(ierr); 39 } 40 ierr = PetscSNPrintf(filename,sizeof(filename),"Visualization-data/SA-%06d.bin",stepnum);CHKERRQ(ierr); 41 ierr = OutputBIN(comm,filename,&viewer);CHKERRQ(ierr); 42 if (!tj->transform) { 43 ierr = VecView(X,viewer);CHKERRQ(ierr); 44 } else { 45 Vec XX; 46 ierr = (*tj->transform)(tj->transformctx,X,&XX);CHKERRQ(ierr); 47 ierr = VecView(XX,viewer);CHKERRQ(ierr); 48 ierr = VecDestroy(&XX); 49 } 50 ierr = PetscViewerBinaryWrite(viewer,&time,1,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr); 51 ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 52 PetscFunctionReturn(0); 53 } 54 ierr = PetscSNPrintf(filename,sizeof(filename),"Visualization-data/SA-%06d.bin",stepnum);CHKERRQ(ierr); 55 ierr = OutputBIN(comm,filename,&viewer);CHKERRQ(ierr); 56 if (!tj->transform) { 57 ierr = VecView(X,viewer);CHKERRQ(ierr); 58 } else { 59 Vec XX; 60 ierr = (*tj->transform)(tj->transformctx,X,&XX);CHKERRQ(ierr); 61 ierr = VecView(XX,viewer);CHKERRQ(ierr); 62 ierr = VecDestroy(&XX); 63 } 64 ierr = PetscViewerBinaryWrite(viewer,&time,1,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr); 65 66 ierr = TSGetPrevTime(ts,&tprev);CHKERRQ(ierr); 67 ierr = PetscViewerBinaryWrite(viewer,&tprev,1,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr); 68 69 ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 70 PetscFunctionReturn(0); 71 } 72 73 /*MC 74 TSTRAJECTORYVISUALIZATION - Stores each solution of the ODE/DAE in a file 75 76 Saves each timestep into a seperate file in Visualization-data/SA-%06d.bin 77 78 This version saves only the solutions at each timestep, it does not save the solution at each stage, 79 see TSTRAJECTORYBASIC that saves all stages 80 81 $PETSC_DIR/share/petsc/matlab/PetscReadBinaryTrajectory.m and $PETSC_DIR/bin/PetscBinaryIOTrajectory.py 82 can read in files created with this format into MATLAB and Python. 83 84 Level: intermediate 85 86 .seealso: TSTrajectoryCreate(), TS, TSTrajectorySetType(), TSTrajectoryType, TSTrajectorySetVariableNames() 87 88 M*/ 89 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory tj,TS ts) 90 { 91 PetscFunctionBegin; 92 tj->ops->set = TSTrajectorySet_Visualization; 93 PetscFunctionReturn(0); 94 } 95