Date: 2022-03-31T04:45:58+00:00

Actual source code: viewers.c

      2: #include <petscsys.h>
      3: #include <petsc/private/viewerimpl.h>

      5: struct _n_PetscViewers {
      6:   MPI_Comm    comm;
      7:   PetscViewer *viewer;
      8:   int         n;
      9: };

     11: /*@C
     12:    PetscViewersDestroy - Destroys a set of PetscViewers created with PetscViewersCreate().

     14:    Collective on PetscViewers

     16:    Input Parameters:
     17: .  v - the PetscViewers to be destroyed.

     19:    Level: intermediate

     21: .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerCreate(), PetscViewerDrawOpen(), PetscViewersCreate()

     23: @*/
     24: PetscErrorCode  PetscViewersDestroy(PetscViewers *v)
     25: {
     26:   int            i;

     28:   if (!*v) return 0;
     29:   for (i=0; i<(*v)->n; i++) {
     30:     PetscViewerDestroy(&(*v)->viewer[i]);
     31:   }
     32:   PetscFree((*v)->viewer);
     33:   PetscFree(*v);
     34:   return 0;
     35: }

     37: /*@C
     38:    PetscViewersCreate - Creates a container to hold a set of PetscViewers.

     40:    Collective

     42:    Input Parameter:
     43: .   comm - the MPI communicator

     45:    Output Parameter:
     46: .  v - the collection of PetscViewers

     48:    Level: intermediate

     50: .seealso: PetscViewerCreate(), PetscViewersDestroy()

     52: @*/
     53: PetscErrorCode  PetscViewersCreate(MPI_Comm comm,PetscViewers *v)
     54: {
     56:   PetscNew(v);
     57:   (*v)->n    = 64;
     58:   (*v)->comm = comm;

     60:   PetscCalloc1(64,&(*v)->viewer);
     61:   return 0;
     62: }

     64: /*@C
     65:    PetscViewersGetViewer - Gets a PetscViewer from a PetscViewer collection

     67:    Not Collective, but PetscViewer will be collective object on PetscViewers

     69:    Input Parameters:
     70: +   viewers - object created with PetscViewersCreate()
     71: -   n - number of PetscViewer you want

     73:    Output Parameter:
     74: .  viewer - the PetscViewer

     76:    Level: intermediate

     78: .seealso: PetscViewersCreate(), PetscViewersDestroy()

     80: @*/
     81: PetscErrorCode  PetscViewersGetViewer(PetscViewers viewers,PetscInt n,PetscViewer *viewer)
     82: {
     86:   if (n >= viewers->n) {
     87:     PetscViewer *v;
     88:     int         newn = n + 64; /* add 64 new ones at a time */

     90:     PetscCalloc1(newn,&v);
     91:     PetscArraycpy(v,viewers->viewer,viewers->n);
     92:     PetscFree(viewers->viewer);

     94:     viewers->viewer = v;
     95:   }
     96:   if (!viewers->viewer[n]) {
     97:     PetscViewerCreate(viewers->comm,&viewers->viewer[n]);
     98:   }
     99:   *viewer = viewers->viewer[n];
    100:   return 0;
    101: }

    103: /*
    104:   PetscMonitorCompare - Checks if two monitors are identical; if they are then it destroys the new one

    106:   Not collective

    108:   Input Parameters:
    109: + nmon      - The new monitor
    110: . nmctx     - The new monitor context, or NULL
    111: . nmdestroy - The new monitor destroy function, or NULL
    112: . mon       - The old monitor
    113: . mctx      - The old monitor context, or NULL
    114: - mdestroy  - The old monitor destroy function, or NULL

    116:   Output Parameter:
    117: . identical - PETSC_TRUE if the monitors are the same

    119:   Level: developer

    121: .seealsp: DMMonitorSetFromOptions(), KSPMonitorSetFromOptions(), SNESMonitorSetFromOptions()
    122: */
    123: PetscErrorCode PetscMonitorCompare(PetscErrorCode (*nmon)(void), void *nmctx, PetscErrorCode (*nmdestroy)(void **), PetscErrorCode (*mon)(void), void *mctx, PetscErrorCode (*mdestroy)(void **), PetscBool *identical)
    124: {
    126:   *identical = PETSC_FALSE;
    127:   if (nmon == mon && nmdestroy == mdestroy) {
    128:     if (nmctx == mctx) *identical = PETSC_TRUE;
    129:     else if (nmdestroy == (PetscErrorCode (*)(void**)) PetscViewerAndFormatDestroy) {
    130:       PetscViewerAndFormat *old = (PetscViewerAndFormat*)mctx, *newo = (PetscViewerAndFormat*)nmctx;
    131:       if (old->viewer == newo->viewer && old->format == newo->format) *identical = PETSC_TRUE;
    132:     }
    133:     if (*identical) {
    134:       if (mdestroy) {
    135:         (*mdestroy)(&nmctx);
    136:       }
    137:     }
    138:   }
    139:   return 0;
    140: }