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(comm,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 if (stepnum == 0) { 27 PetscMPIInt rank; 28 ierr = MPI_Comm_rank(comm,&rank);CHKERRMPI(ierr); 29 if (!rank) { 30 ierr = PetscRMTree("Visualization-data");CHKERRQ(ierr); 31 ierr = PetscMkdir("Visualization-data");CHKERRQ(ierr); 32 } 33 if (tj->names) { 34 PetscViewer bnames; 35 ierr = PetscViewerBinaryOpen(comm,"Visualization-data/variablenames",FILE_MODE_WRITE,&bnames);CHKERRQ(ierr); 36 ierr = PetscViewerBinaryWriteStringArray(bnames,(const char *const *)tj->names);CHKERRQ(ierr); 37 ierr = PetscViewerDestroy(&bnames);CHKERRQ(ierr); 38 } 39 ierr = PetscSNPrintf(filename,sizeof(filename),"Visualization-data/SA-%06d.bin",stepnum);CHKERRQ(ierr); 40 ierr = OutputBIN(comm,filename,&viewer);CHKERRQ(ierr); 41 if (!tj->transform) { 42 ierr = VecView(X,viewer);CHKERRQ(ierr); 43 } else { 44 Vec XX; 45 ierr = (*tj->transform)(tj->transformctx,X,&XX);CHKERRQ(ierr); 46 ierr = VecView(XX,viewer);CHKERRQ(ierr); 47 ierr = VecDestroy(&XX);CHKERRQ(ierr); 48 } 49 ierr = PetscViewerBinaryWrite(viewer,&time,1,PETSC_REAL);CHKERRQ(ierr); 50 ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 51 PetscFunctionReturn(0); 52 } 53 ierr = PetscSNPrintf(filename,sizeof(filename),"Visualization-data/SA-%06d.bin",stepnum);CHKERRQ(ierr); 54 ierr = OutputBIN(comm,filename,&viewer);CHKERRQ(ierr); 55 if (!tj->transform) { 56 ierr = VecView(X,viewer);CHKERRQ(ierr); 57 } else { 58 Vec XX; 59 ierr = (*tj->transform)(tj->transformctx,X,&XX);CHKERRQ(ierr); 60 ierr = VecView(XX,viewer);CHKERRQ(ierr); 61 ierr = VecDestroy(&XX);CHKERRQ(ierr); 62 } 63 ierr = PetscViewerBinaryWrite(viewer,&time,1,PETSC_REAL);CHKERRQ(ierr); 64 65 ierr = TSGetPrevTime(ts,&tprev);CHKERRQ(ierr); 66 ierr = PetscViewerBinaryWrite(viewer,&tprev,1,PETSC_REAL);CHKERRQ(ierr); 67 68 ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 69 PetscFunctionReturn(0); 70 } 71 72 /*MC 73 TSTRAJECTORYVISUALIZATION - Stores each solution of the ODE/DAE in a file 74 75 Saves each timestep into a separate file in Visualization-data/SA-%06d.bin 76 77 This version saves only the solutions at each timestep, it does not save the solution at each stage, 78 see TSTRAJECTORYBASIC that saves all stages 79 80 $PETSC_DIR/share/petsc/matlab/PetscReadBinaryTrajectory.m and $PETSC_DIR/lib/petsc/bin/PetscBinaryIOTrajectory.py 81 can read in files created with this format into MATLAB and Python. 82 83 Level: intermediate 84 85 .seealso: TSTrajectoryCreate(), TS, TSTrajectorySetType(), TSTrajectoryType, TSTrajectorySetVariableNames() 86 87 M*/ 88 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory tj,TS ts) 89 { 90 PetscFunctionBegin; 91 tj->ops->set = TSTrajectorySet_Visualization; 92 tj->setupcalled = PETSC_TRUE; 93 PetscFunctionReturn(0); 94 } 95