Hi Matt,

On 08/10/2015 08:39 AM, Matthew Knepley wrote:
On Mon, Aug 10, 2015 at 9:55 AM, Dominic Meiser <dmei...@txcorp.com
<mailto:dmei...@txcorp.com>> wrote:

    Hi Matt,


    On 06/23/2015 11:24 AM, Matthew Knepley wrote:

        There could be a bug with the calculation of chunksize. I will
        run your
        example as soon as I can.


    Have you had a chance to run the example? Thanks.


Unfortunately, no, and now my mail has lost testcase.c. Can you resend
to me?

testcase.c is attached. Thanks very much for having a look at this.

Cheers,
Dominic


   Thanks,

      Matt


    Dominic


    --
    Dominic Meiser
    Tech-X Corporation
    5621 Arapahoe Avenue
    Boulder, CO 80303
    USA
    Telephone: 303-996-2036 <tel:303-996-2036>
    Fax: 303-448-7756 <tel:303-448-7756>
    www.txcorp.com <http://www.txcorp.com>




--
What most experimenters take for granted before they begin their
experiments is infinitely more interesting than any results to which
their experiments lead.
-- Norbert Wiener

--
Dominic Meiser
Tech-X Corporation
5621 Arapahoe Avenue
Boulder, CO 80303
USA
Telephone: 303-996-2036
Fax: 303-448-7756
www.txcorp.com
#include <petscvec.h>
#include <petscdmda.h>
#include <petscdm.h>
#include <petscviewer.h>
#include <petscviewerhdf5.h>

struct Field {
  PetscScalar E;
  PetscScalar H;
};
static const char *fieldNames[] = {"E", "H"};

PetscErrorCode setInitialState(Vec *field);
PetscErrorCode dump(Vec field, const char *fieldname, const char *filename);

int main(int argn, char **argv) {
  PetscErrorCode ierr;
  DM             da;
  Vec            field;

  PetscFunctionBegin;
  ierr = PetscInitialize(&argn, &argv, NULL, NULL);CHKERRQ(ierr);
  ierr = DMDACreate1d(PETSC_COMM_WORLD, DM_BOUNDARY_PERIODIC, -1000, 2, 1, 
NULL, &da);CHKERRQ(ierr);
  ierr = DMDASetUniformCoordinates(da, -1.0, 1.0, 0, 0, 0, 0);CHKERRQ(ierr);
  ierr = DMDASetCoordinateName(da, 0, "x");CHKERRQ(ierr);
  ierr = DMDASetFieldNames(da, fieldNames);CHKERRQ(ierr);
  ierr = DMSetFromOptions(da);CHKERRQ(ierr);
  ierr = DMCreateLocalVector(da, &field);CHKERRQ(ierr);
  ierr = PetscObjectSetName((PetscObject)field, "field");CHKERRQ(ierr);
  ierr = setInitialState(&field);CHKERRQ(ierr);
  ierr = dump(field, "field", "field_initial.h5");CHKERRQ(ierr);
  PetscFunctionReturn(0);
}

PetscErrorCode setInitialState(Vec *field) {
  PetscErrorCode ierr;
  struct Field   *f;
  DM             da;
  PetscInt       i, x, m;

  PetscFunctionBegin;
  ierr = VecGetDM(*field, &da);CHKERRQ(ierr);
  ierr = DMDAVecGetArray(da, *field, &f);CHKERRQ(ierr);
  ierr = DMDAGetCorners(da, &x, NULL, NULL, &m, NULL, NULL);CHKERRQ(ierr);
  for (i = x; i < x + m; ++i) {
    f[i].E = 0.0;
    f[i].H = 0.0;
  }
  ierr = DMDAVecRestoreArray(da, *field, &f);CHKERRQ(ierr);
  DMLocalToLocalBegin(da, *field, INSERT_VALUES, *field);CHKERRQ(ierr);
  DMLocalToLocalEnd(da, *field, INSERT_VALUES, *field);CHKERRQ(ierr);
  PetscFunctionReturn(0);
}

PetscErrorCode dump(Vec field, const char *fieldname, const char *filename) {
  PetscErrorCode ierr;
  PetscViewer    v;
  DM             dm;
  Vec            tmp;
  PetscInt       numProcs;

  PetscFunctionBegin;
  ierr = VecGetDM(field, &dm);CHKERRQ(ierr);
  ierr = DMDAGetInfo(dm, 0, 0, 0, 0, &numProcs, 0, 0, 0, 0, 0, 0, 0, 0);
  if (numProcs > 1) {
    ierr = DMGetGlobalVector(dm, &tmp);CHKERRQ(ierr);
    ierr = DMLocalToGlobalBegin(dm, field, INSERT_VALUES, tmp);CHKERRQ(ierr);
    ierr = DMLocalToGlobalEnd(dm, field, INSERT_VALUES, tmp);CHKERRQ(ierr);
  } else {
    tmp = field;
  }
  ierr = PetscObjectSetName((PetscObject)tmp, fieldname);CHKERRQ(ierr);

  ierr = PetscViewerHDF5Open(MPI_COMM_WORLD, filename, FILE_MODE_WRITE, 
&v);CHKERRQ(ierr);
  ierr = VecView(tmp, v);CHKERRQ(ierr);
  ierr = PetscViewerDestroy(&v);CHKERRQ(ierr);
  PetscFunctionReturn(0);
}

Reply via email to