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