1 2 #include <petscsys.h> 3 #include <petsc/private/viewerimpl.h> 4 5 struct _n_PetscViewers { 6 MPI_Comm comm; 7 PetscViewer *viewer; 8 int n; 9 }; 10 11 /*@C 12 PetscViewersDestroy - Destroys a set of PetscViewers created with PetscViewersCreate(). 13 14 Collective on PetscViewers 15 16 Input Parameters: 17 . v - the PetscViewers to be destroyed. 18 19 Level: intermediate 20 21 .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerCreate(), PetscViewerDrawOpen(), PetscViewersCreate() 22 23 @*/ 24 PetscErrorCode PetscViewersDestroy(PetscViewers *v) 25 { 26 int i; 27 PetscErrorCode ierr; 28 29 PetscFunctionBegin; 30 if (!*v) PetscFunctionReturn(0); 31 for (i=0; i<(*v)->n; i++) { 32 ierr = PetscViewerDestroy(&(*v)->viewer[i]);CHKERRQ(ierr); 33 } 34 ierr = PetscFree((*v)->viewer);CHKERRQ(ierr); 35 ierr = PetscFree(*v);CHKERRQ(ierr); 36 PetscFunctionReturn(0); 37 } 38 39 /*@C 40 PetscViewersCreate - Creates a container to hold a set of PetscViewers. 41 42 Collective on MPI_Comm 43 44 Input Parameter: 45 . comm - the MPI communicator 46 47 Output Parameter: 48 . v - the collection of PetscViewers 49 50 Level: intermediate 51 52 Concepts: PetscViewer^array of 53 54 .seealso: PetscViewerCreate(), PetscViewersDestroy() 55 56 @*/ 57 PetscErrorCode PetscViewersCreate(MPI_Comm comm,PetscViewers *v) 58 { 59 PetscErrorCode ierr; 60 61 PetscFunctionBegin; 62 ierr = PetscNew(v);CHKERRQ(ierr); 63 (*v)->n = 64; 64 (*v)->comm = comm; 65 66 ierr = PetscCalloc1(64,&(*v)->viewer);CHKERRQ(ierr); 67 PetscFunctionReturn(0); 68 } 69 70 /*@C 71 PetscViewersGetViewer - Gets a PetscViewer from a PetscViewer collection 72 73 Not Collective, but PetscViewer will be collective object on PetscViewers 74 75 Input Parameter: 76 + viewers - object created with PetscViewersCreate() 77 - n - number of PetscViewer you want 78 79 Output Parameter: 80 . viewer - the PetscViewer 81 82 Level: intermediate 83 84 Concepts: PetscViewer^array of 85 86 .seealso: PetscViewersCreate(), PetscViewersDestroy() 87 88 @*/ 89 PetscErrorCode PetscViewersGetViewer(PetscViewers viewers,PetscInt n,PetscViewer *viewer) 90 { 91 PetscErrorCode ierr; 92 93 PetscFunctionBegin; 94 if (n < 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Cannot access using a negative index - %d\n",n); 95 if (n >= viewers->n) { 96 PetscViewer *v; 97 int newn = n + 64; /* add 64 new ones at a time */ 98 99 ierr = PetscCalloc1(newn,&v);CHKERRQ(ierr); 100 ierr = PetscMemcpy(v,viewers->viewer,viewers->n*sizeof(PetscViewer));CHKERRQ(ierr); 101 ierr = PetscFree(viewers->viewer);CHKERRQ(ierr); 102 103 viewers->viewer = v; 104 } 105 if (!viewers->viewer[n]) { 106 ierr = PetscViewerCreate(viewers->comm,&viewers->viewer[n]);CHKERRQ(ierr); 107 } 108 *viewer = viewers->viewer[n]; 109 PetscFunctionReturn(0); 110 } 111 112 113 114 115 116 117