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