コード例 #1
0
ファイル: da1.c プロジェクト: haubentaucher/petsc
PetscErrorCode DMView_DA_1d(DM da,PetscViewer viewer)
{
  PetscErrorCode ierr;
  PetscMPIInt    rank;
  PetscBool      iascii,isdraw,isbinary;
  DM_DA          *dd = (DM_DA*)da->data;
#if defined(PETSC_HAVE_MATLAB_ENGINE)
  PetscBool ismatlab;
#endif

  PetscFunctionBegin;
  ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)da),&rank);CHKERRQ(ierr);

  ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
  ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
  ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
#if defined(PETSC_HAVE_MATLAB_ENGINE)
  ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERMATLAB,&ismatlab);CHKERRQ(ierr);
#endif
  if (iascii) {
    PetscViewerFormat format;

    ierr = PetscViewerGetFormat(viewer, &format);CHKERRQ(ierr);
    if (format != PETSC_VIEWER_ASCII_VTK && format != PETSC_VIEWER_ASCII_VTK_CELL) {
      DMDALocalInfo info;
      ierr = DMDAGetLocalInfo(da,&info);CHKERRQ(ierr);
      ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_TRUE);CHKERRQ(ierr);
      ierr = PetscViewerASCIISynchronizedPrintf(viewer,"Processor [%d] M %D m %D w %D s %D\n",rank,dd->M,dd->m,dd->w,dd->s);CHKERRQ(ierr);
      ierr = PetscViewerASCIISynchronizedPrintf(viewer,"X range of indices: %D %D\n",info.xs,info.xs+info.xm);CHKERRQ(ierr);
      ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
      ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_FALSE);CHKERRQ(ierr);
    } else {
      ierr = DMView_DA_VTK(da, viewer);CHKERRQ(ierr);
    }
  } else if (isdraw) {
    PetscDraw draw;
    double    ymin = -1,ymax = 1,xmin = -1,xmax = dd->M,x;
    PetscInt  base;
    char      node[10];
    PetscBool isnull;

    ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
    ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); if (isnull) PetscFunctionReturn(0);

    ierr = PetscDrawSetCoordinates(draw,xmin,ymin,xmax,ymax);CHKERRQ(ierr);
    ierr = PetscDrawSynchronizedClear(draw);CHKERRQ(ierr);

    /* first processor draws all node lines */
    if (!rank) {
      PetscInt xmin_tmp;
      ymin = 0.0; ymax = 0.3;

      for (xmin_tmp=0; xmin_tmp < dd->M; xmin_tmp++) {
        ierr = PetscDrawLine(draw,(double)xmin_tmp,ymin,(double)xmin_tmp,ymax,PETSC_DRAW_BLACK);CHKERRQ(ierr);
      }

      xmin = 0.0; xmax = dd->M - 1;
      ierr = PetscDrawLine(draw,xmin,ymin,xmax,ymin,PETSC_DRAW_BLACK);CHKERRQ(ierr);
      ierr = PetscDrawLine(draw,xmin,ymax,xmax,ymax,PETSC_DRAW_BLACK);CHKERRQ(ierr);
    }

    ierr = PetscDrawSynchronizedFlush(draw);CHKERRQ(ierr);
    ierr = PetscDrawPause(draw);CHKERRQ(ierr);

    /* draw my box */
    ymin = 0; ymax = 0.3; xmin = dd->xs / dd->w; xmax = (dd->xe / dd->w)  - 1;
    ierr = PetscDrawLine(draw,xmin,ymin,xmax,ymin,PETSC_DRAW_RED);CHKERRQ(ierr);
    ierr = PetscDrawLine(draw,xmin,ymin,xmin,ymax,PETSC_DRAW_RED);CHKERRQ(ierr);
    ierr = PetscDrawLine(draw,xmin,ymax,xmax,ymax,PETSC_DRAW_RED);CHKERRQ(ierr);
    ierr = PetscDrawLine(draw,xmax,ymin,xmax,ymax,PETSC_DRAW_RED);CHKERRQ(ierr);

    /* Put in index numbers */
    base = dd->base / dd->w;
    for (x=xmin; x<=xmax; x++) {
      sprintf(node,"%d",(int)base++);
      ierr = PetscDrawString(draw,x,ymin,PETSC_DRAW_RED,node);CHKERRQ(ierr);
    }

    ierr = PetscDrawSynchronizedFlush(draw);CHKERRQ(ierr);
    ierr = PetscDrawPause(draw);CHKERRQ(ierr);
  } else if (isbinary) {
    ierr = DMView_DA_Binary(da,viewer);CHKERRQ(ierr);
#if defined(PETSC_HAVE_MATLAB_ENGINE)
  } else if (ismatlab) {
    ierr = DMView_DA_Matlab(da,viewer);CHKERRQ(ierr);
#endif
  }
  PetscFunctionReturn(0);
}
コード例 #2
0
PetscErrorCode DMView_DA_2d(DM da,PetscViewer viewer)
{
    PetscErrorCode ierr;
    PetscMPIInt    rank;
    PetscBool      iascii,isdraw,isbinary;
    DM_DA          *dd = (DM_DA*)da->data;
#if defined(PETSC_HAVE_MATLAB_ENGINE)
    PetscBool ismatlab;
#endif

    PetscFunctionBegin;
    ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)da),&rank);
    CHKERRQ(ierr);

    ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);
    CHKERRQ(ierr);
    ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);
    CHKERRQ(ierr);
    ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);
    CHKERRQ(ierr);
#if defined(PETSC_HAVE_MATLAB_ENGINE)
    ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERMATLAB,&ismatlab);
    CHKERRQ(ierr);
#endif
    if (iascii) {
        PetscViewerFormat format;

        ierr = PetscViewerGetFormat(viewer, &format);
        CHKERRQ(ierr);
        if (format != PETSC_VIEWER_ASCII_VTK && format != PETSC_VIEWER_ASCII_VTK_CELL) {
            DMDALocalInfo info;
            ierr = DMDAGetLocalInfo(da,&info);
            CHKERRQ(ierr);
            ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_TRUE);
            CHKERRQ(ierr);
            ierr = PetscViewerASCIISynchronizedPrintf(viewer,"Processor [%d] M %D N %D m %D n %D w %D s %D\n",rank,dd->M,dd->N,dd->m,dd->n,dd->w,dd->s);
            CHKERRQ(ierr);
            ierr = PetscViewerASCIISynchronizedPrintf(viewer,"X range of indices: %D %D, Y range of indices: %D %D\n",info.xs,info.xs+info.xm,info.ys,info.ys+info.ym);
            CHKERRQ(ierr);
            ierr = PetscViewerFlush(viewer);
            CHKERRQ(ierr);
            ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_FALSE);
            CHKERRQ(ierr);
        } else {
            ierr = DMView_DA_VTK(da,viewer);
            CHKERRQ(ierr);
        }
    } else if (isdraw) {
        PetscDraw draw;
        double    ymin = -1*dd->s-1,ymax = dd->N+dd->s;
        double    xmin = -1*dd->s-1,xmax = dd->M+dd->s;
        double    x,y;
        PetscInt  base,*idx;
        char      node[10];
        PetscBool isnull;

        ierr = PetscViewerDrawGetDraw(viewer,0,&draw);
        CHKERRQ(ierr);
        ierr = PetscDrawIsNull(draw,&isnull);
        CHKERRQ(ierr);
        if (isnull) PetscFunctionReturn(0);
        if (!da->coordinates) {
            ierr = PetscDrawSetCoordinates(draw,xmin,ymin,xmax,ymax);
            CHKERRQ(ierr);
        }
        ierr = PetscDrawSynchronizedClear(draw);
        CHKERRQ(ierr);

        /* first processor draw all node lines */
        if (!rank) {
            ymin = 0.0;
            ymax = dd->N - 1;
            for (xmin=0; xmin<dd->M; xmin++) {
                ierr = PetscDrawLine(draw,xmin,ymin,xmin,ymax,PETSC_DRAW_BLACK);
                CHKERRQ(ierr);
            }
            xmin = 0.0;
            xmax = dd->M - 1;
            for (ymin=0; ymin<dd->N; ymin++) {
                ierr = PetscDrawLine(draw,xmin,ymin,xmax,ymin,PETSC_DRAW_BLACK);
                CHKERRQ(ierr);
            }
        }
        ierr = PetscDrawSynchronizedFlush(draw);
        CHKERRQ(ierr);
        ierr = PetscDrawPause(draw);
        CHKERRQ(ierr);

        /* draw my box */
        ymin = dd->ys;
        ymax = dd->ye - 1;
        xmin = dd->xs/dd->w;
        xmax =(dd->xe-1)/dd->w;
        ierr = PetscDrawLine(draw,xmin,ymin,xmax,ymin,PETSC_DRAW_RED);
        CHKERRQ(ierr);
        ierr = PetscDrawLine(draw,xmin,ymin,xmin,ymax,PETSC_DRAW_RED);
        CHKERRQ(ierr);
        ierr = PetscDrawLine(draw,xmin,ymax,xmax,ymax,PETSC_DRAW_RED);
        CHKERRQ(ierr);
        ierr = PetscDrawLine(draw,xmax,ymin,xmax,ymax,PETSC_DRAW_RED);
        CHKERRQ(ierr);

        /* put in numbers */
        base = (dd->base)/dd->w;
        for (y=ymin; y<=ymax; y++) {
            for (x=xmin; x<=xmax; x++) {
                sprintf(node,"%d",(int)base++);
                ierr = PetscDrawString(draw,x,y,PETSC_DRAW_BLACK,node);
                CHKERRQ(ierr);
            }
        }

        ierr = PetscDrawSynchronizedFlush(draw);
        CHKERRQ(ierr);
        ierr = PetscDrawPause(draw);
        CHKERRQ(ierr);
        /* overlay ghost numbers, useful for error checking */
        /* put in numbers */

        base = 0;
        idx = dd->idx;
        ymin = dd->Ys;
        ymax = dd->Ye;
        xmin = dd->Xs;
        xmax = dd->Xe;
        for (y=ymin; y<ymax; y++) {
            for (x=xmin; x<xmax; x++) {
                if ((base % dd->w) == 0) {
                    sprintf(node,"%d",(int)(idx[base]/dd->w));
                    ierr = PetscDrawString(draw,x/dd->w,y,PETSC_DRAW_BLUE,node);
                    CHKERRQ(ierr);
                }
                base++;
            }
        }
        ierr = PetscDrawSynchronizedFlush(draw);
        CHKERRQ(ierr);
        ierr = PetscDrawPause(draw);
        CHKERRQ(ierr);
    } else if (isbinary) {
        ierr = DMView_DA_Binary(da,viewer);
        CHKERRQ(ierr);
#if defined(PETSC_HAVE_MATLAB_ENGINE)
    } else if (ismatlab) {
        ierr = DMView_DA_Matlab(da,viewer);
        CHKERRQ(ierr);
#endif
    }
    PetscFunctionReturn(0);
}