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