Date: 2022-08-02T03:14:59+00:00

Actual source code: trajvisualization.c

      2: #include <petsc/private/tsimpl.h>

      4: static PetscErrorCode OutputBIN(MPI_Comm comm,const char *filename,PetscViewer *viewer)
      5: {
      6:   PetscViewerCreate(comm,viewer);
      7:   PetscViewerSetType(*viewer,PETSCVIEWERBINARY);
      8:   PetscViewerFileSetMode(*viewer,FILE_MODE_WRITE);
      9:   PetscViewerFileSetName(*viewer,filename);
     10:   return 0;
     11: }

     13: static PetscErrorCode TSTrajectorySet_Visualization(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X)
     14: {
     15:   PetscViewer    viewer;
     16:   char           filename[PETSC_MAX_PATH_LEN];
     17:   PetscReal      tprev;
     18:   MPI_Comm       comm;

     20:   PetscObjectGetComm((PetscObject)ts,&comm);
     21:   if (stepnum == 0) {
     22:     PetscMPIInt rank;
     23:     MPI_Comm_rank(comm,&rank);
     24:     if (rank == 0) {
     25:       PetscRMTree("Visualization-data");
     26:       PetscMkdir("Visualization-data");
     27:     }
     28:     if (tj->names) {
     29:       PetscViewer bnames;
     30:       PetscViewerBinaryOpen(comm,"Visualization-data/variablenames",FILE_MODE_WRITE,&bnames);
     31:       PetscViewerBinaryWriteStringArray(bnames,(const char *const *)tj->names);
     32:       PetscViewerDestroy(&bnames);
     33:     }
     34:     PetscSNPrintf(filename,sizeof(filename),"Visualization-data/SA-%06d.bin",stepnum);
     35:     OutputBIN(comm,filename,&viewer);
     36:     if (!tj->transform) {
     37:       VecView(X,viewer);
     38:     } else {
     39:       Vec XX;
     40:       (*tj->transform)(tj->transformctx,X,&XX);
     41:       VecView(XX,viewer);
     42:       VecDestroy(&XX);
     43:     }
     44:     PetscViewerBinaryWrite(viewer,&time,1,PETSC_REAL);
     45:     PetscViewerDestroy(&viewer);
     46:     return 0;
     47:   }
     48:   PetscSNPrintf(filename,sizeof(filename),"Visualization-data/SA-%06d.bin",stepnum);
     49:   OutputBIN(comm,filename,&viewer);
     50:   if (!tj->transform) {
     51:     VecView(X,viewer);
     52:   } else {
     53:     Vec XX;
     54:     (*tj->transform)(tj->transformctx,X,&XX);
     55:     VecView(XX,viewer);
     56:     VecDestroy(&XX);
     57:   }
     58:   PetscViewerBinaryWrite(viewer,&time,1,PETSC_REAL);

     60:   TSGetPrevTime(ts,&tprev);
     61:   PetscViewerBinaryWrite(viewer,&tprev,1,PETSC_REAL);

     63:   PetscViewerDestroy(&viewer);
     64:   return 0;
     65: }

     67: /*MC
     68:       TSTRAJECTORYVISUALIZATION - Stores each solution of the ODE/DAE in a file

     70:       Saves each timestep into a separate file in Visualization-data/SA-%06d.bin

     72:       This version saves only the solutions at each timestep, it does not save the solution at each stage,
     73:       see TSTRAJECTORYBASIC that saves all stages

     75:       $PETSC_DIR/share/petsc/matlab/PetscReadBinaryTrajectory.m and $PETSC_DIR/lib/petsc/bin/PetscBinaryIOTrajectory.py
     76:       can read in files created with this format into MATLAB and Python.

     78:   Level: intermediate

     80: .seealso:  TSTrajectoryCreate(), TS, TSTrajectorySetType(), TSTrajectoryType, TSTrajectorySetVariableNames()

     82: M*/
     83: PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory tj,TS ts)
     84: {
     85:   tj->ops->set    = TSTrajectorySet_Visualization;
     86:   tj->setupcalled = PETSC_TRUE;
     87:   return 0;
     88: }