Actual source code: vcreatea.c

      1: #define PETSC_DLL

     3:  #include petsc.h

      5: /* ---------------------------------------------------------------------*/
      6: /*
      7:     The variable Petsc_Viewer_Stdout_keyval is used to indicate an MPI attribute that
      8:   is attached to a communicator, in this case the attribute is a PetscViewer.
      9: */
     10: static PetscMPIInt Petsc_Viewer_Stdout_keyval = MPI_KEYVAL_INVALID;

     14: /*@C
     15:    PETSC_VIEWER_STDOUT_ - Creates a ASCII PetscViewer shared by all processors
     16:                     in a communicator.

     18:    Collective on MPI_Comm

     20:    Input Parameter:
     21: .  comm - the MPI communicator to share the PetscViewer

     23:    Level: beginner

     25:    Notes:
     26:    Unlike almost all other PETSc routines, this does not return
     27:    an error code. Usually used in the form
     28: $      XXXView(XXX object,PETSC_VIEWER_STDOUT_(comm));

     30: .seealso: PETSC_VIEWER_DRAW_(), PetscViewerASCIIOpen(), PETSC_VIEWER_STDERR_, PETSC_VIEWER_STDOUT_WORLD,
     31:           PETSC_VIEWER_STDOUT_SELF

     33: @*/
     34: PetscViewer PETSC_DLLEXPORT PETSC_VIEWER_STDOUT_(MPI_Comm comm)
     35: {
     37:   PetscTruth     flg;
     38:   PetscViewer    viewer;

     41:   if (Petsc_Viewer_Stdout_keyval == MPI_KEYVAL_INVALID) {
     42:     MPI_Keyval_create(MPI_NULL_COPY_FN,MPI_NULL_DELETE_FN,&Petsc_Viewer_Stdout_keyval,0);
     43:     if (ierr) {PetscError(__LINE__,"PETSC_VIEWER_STDOUT_",__FILE__,__SDIR__,1,1," "); return(0);}
     44:   }
     45:   MPI_Attr_get(comm,Petsc_Viewer_Stdout_keyval,(void **)&viewer,(PetscMPIInt*)&flg);
     46:   if (ierr) {PetscError(__LINE__,"PETSC_VIEWER_STDOUT_",__FILE__,__SDIR__,1,1," "); return(0);}
     47:   if (!flg) { /* PetscViewer not yet created */
     48:     PetscViewerASCIIOpen(comm,"stdout",&viewer);
     49:     if (ierr) {PetscError(__LINE__,"PETSC_VIEWER_STDOUT_",__FILE__,__SDIR__,1,1," "); return(0);}
     50:     PetscObjectRegisterDestroy((PetscObject)viewer);
     51:     if (ierr) {PetscError(__LINE__,"PETSC_VIEWER_STDOUT_",__FILE__,__SDIR__,1,1," "); return(0);}
     52:     MPI_Attr_put(comm,Petsc_Viewer_Stdout_keyval,(void*)viewer);
     53:     if (ierr) {PetscError(__LINE__,"PETSC_VIEWER_STDOUT_",__FILE__,__SDIR__,1,1," "); return(0);}
     54:   }
     55:   PetscFunctionReturn(viewer);
     56: }

     58: /* ---------------------------------------------------------------------*/
     59: /*
     60:     The variable Petsc_Viewer_Stderr_keyval is used to indicate an MPI attribute that
     61:   is attached to a communicator, in this case the attribute is a PetscViewer.
     62: */
     63: static PetscMPIInt Petsc_Viewer_Stderr_keyval = MPI_KEYVAL_INVALID;

     67: /*@C
     68:    PETSC_VIEWER_STDERR_ - Creates a ASCII PetscViewer shared by all processors
     69:                     in a communicator.

     71:    Collective on MPI_Comm

     73:    Input Parameter:
     74: .  comm - the MPI communicator to share the PetscViewer

     76:    Level: beginner

     78:    Note:
     79:    Unlike almost all other PETSc routines, this does not return
     80:    an error code. Usually used in the form
     81: $      XXXView(XXX object,PETSC_VIEWER_STDERR_(comm));

     83: .seealso: PETSC_VIEWER_DRAW_, PetscViewerASCIIOpen(), PETSC_VIEWER_STDOUT_, PETSC_VIEWER_STDOUT_WORLD,
     84:           PETSC_VIEWER_STDOUT_SELF, PETSC_VIEWER_STDERR_WORLD, PETSC_VIEWER_STDERR_SELF
     85: @*/
     86: PetscViewer PETSC_DLLEXPORT PETSC_VIEWER_STDERR_(MPI_Comm comm)
     87: {
     89:   PetscTruth     flg;
     90:   PetscViewer    viewer;

     93:   if (Petsc_Viewer_Stderr_keyval == MPI_KEYVAL_INVALID) {
     94:     MPI_Keyval_create(MPI_NULL_COPY_FN,MPI_NULL_DELETE_FN,&Petsc_Viewer_Stderr_keyval,0);
     95:     if (ierr) {PetscError(__LINE__,"PETSC_VIEWER_STDERR_",__FILE__,__SDIR__,1,1," "); return(0);}
     96:   }
     97:   MPI_Attr_get(comm,Petsc_Viewer_Stderr_keyval,(void **)&viewer,(PetscMPIInt*)&flg);
     98:   if (ierr) {PetscError(__LINE__,"PETSC_VIEWER_STDERR_",__FILE__,__SDIR__,1,1," "); return(0);}
     99:   if (!flg) { /* PetscViewer not yet created */
    100:     PetscViewerASCIIOpen(comm,"stderr",&viewer);
    101:     if (ierr) {PetscError(__LINE__,"PETSC_VIEWER_STDERR_",__FILE__,__SDIR__,1,1," "); return(0);}
    102:     PetscObjectRegisterDestroy((PetscObject)viewer);
    103:     if (ierr) {PetscError(__LINE__,"PETSC_VIEWER_STDERR_",__FILE__,__SDIR__,1,1," "); return(0);}
    104:     MPI_Attr_put(comm,Petsc_Viewer_Stderr_keyval,(void*)viewer);
    105:     if (ierr) {PetscError(__LINE__,"PETSC_VIEWER_STDERR_",__FILE__,__SDIR__,1,1," "); return(0);}
    106:   }
    107:   PetscFunctionReturn(viewer);
    108: }

    112: /*@C
    113:    PetscViewerASCIIOpen - Opens an ASCII file as a PetscViewer.

    115:    Collective on MPI_Comm

    117:    Input Parameters:
    118: +  comm - the communicator
    119: -  name - the file name

    121:    Output Parameter:
    122: .  lab - the PetscViewer to use with the specified file

    124:    Level: beginner

    126:    Notes:
    127:    This PetscViewer can be destroyed with PetscViewerDestroy().

    129:    If a multiprocessor communicator is used (such as PETSC_COMM_WORLD),
    130:    then only the first processor in the group opens the file.  All other
    131:    processors send their data to the first processor to print.

    133:    Each processor can instead write its own independent output by
    134:    specifying the communicator PETSC_COMM_SELF.

    136:    As shown below, PetscViewerASCIIOpen() is useful in conjunction with
    137:    MatView() and VecView()
    138: .vb
    139:      PetscViewerASCIIOpen(PETSC_COMM_WORLD,"mat.output",&viewer);
    140:      MatView(matrix,viewer);
    141: .ve

    143:   Concepts: PetscViewerASCII^creating
    144:   Concepts: printf
    145:   Concepts: printing
    146:   Concepts: accessing remote file
    147:   Concepts: remote file

    149: .seealso: MatView(), VecView(), PetscViewerDestroy(), PetscViewerBinaryOpen(),
    150:           PetscViewerASCIIGetPointer(), PetscViewerSetFormat(), PETSC_VIEWER_STDOUT_, PETSC_VIEWER_STDERR_,
    151:           PETSC_VIEWER_STDOUT_WORLD, PETSC_VIEWER_STDOUT_SELF,
    152: @*/
    153: PetscErrorCode PETSC_DLLEXPORT PetscViewerASCIIOpen(MPI_Comm comm,const char name[],PetscViewer *lab)
    154: {

    158:   PetscViewerCreate(comm,lab);
    159:   PetscViewerSetType(*lab,PETSC_VIEWER_ASCII);
    160:   if (name) {
    161:     PetscViewerSetFilename(*lab,name);
    162:   }
    163:   return(0);
    164: }